SQL通用语法

  1. SQL语句可以单行或多行书写,以分号结尾。
  2. SQL语句可以使用空格/缩进来增强语句的可读性。
  3. MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
  4. 注释:
    单行注释:—注释内容或#注释内容(MySQL特有)
    多行注释: /注释内容/

SQL分类

  • DDL
  • DML
  • DQL
  • DCL | 分类 | 全称 | 说明 | | —- | —- | —- | | DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) | | DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 | | DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 | | DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |

DDL-数据库操作

查询

查询所有数据库

  1. SHOW DATABASES;

查询当前数据库

  1. SELECT DATABASE();

创建数据库

  1. CREATE DATABASE [IF NOT EXISTS] 数据库名[DEFAULT CHARSET字符集][COLLATE 排序规则];

推荐字符集: utf8mb4

删除数据库
  1. DROP DATABASE [IF NOT EXISTS]数据库名;

使用数据库
  1. USE 数据库名;

切换到xx数据库

DDL-表操作-查询

查询当前数据库所有表
  1. SHOW TABLES;

查询表结构
  1. DESC 表名;

查询指定表的建表语句
  1. SHOW CREATE TABLE 表名

DDL-表操作-创建

  1. CREATE TABLE 表名(
  2. 字段1 字段1类型[COMMENT 字段1注释],
  3. 字段2 字段2类型[COMMENT 字段2注释],
  4. 字段3 字段3类型[COMMENT 字段3注释],
  5. .......,
  6. 字段n字段n类型[COMMENT 字段n注释]
  7. )[COMMENT 表注释];

注意: []为可选参数,最后一个字段后面没有逗号

  1. CREATE TABLE tb_user(
  2. id int comment '编号',
  3. name varchar(50) comment '姓名',
  4. age int comment '年龄',
  5. gender varchar(1) comment '性别'
  6. ) comment '用户表';

查询表结构

desc tb_user

  1. +--------+-------------+------+-----+---------+-------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +--------+-------------+------+-----+---------+-------+
  4. | id | int | YES | | NULL | |
  5. | name | varchar(50) | YES | | NULL | |
  6. | age | int | YES | | NULL | |
  7. | gender | varchar(1) | YES | | NULL | |
  8. +--------+-------------+------+-----+---------+-------+
  9. 4 rows in set (0.01 sec)

查询表详细信息(建表语句)

  1. +---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  2. | Table | Create Table |
  3. +---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  4. | tb_user | CREATE TABLE `tb_user` (
  5. `id` int DEFAULT NULL COMMENT '编号',
  6. `name` varchar(50) DEFAULT NULL COMMENT '姓名',
  7. `age` int DEFAULT NULL COMMENT '年龄',
  8. `gender` varchar(1) DEFAULT NULL COMMENT '性别'
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表' |
  10. +---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  11. 1 row in set (0.01 sec)

mysql数据类型

数值类型

MySQL 支持所有标准 SQL 数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 Bytes (-128,127) (0,255) 小整数值
SMALLINT 2 Bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 Bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 Bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 Bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 Bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 Bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。

类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。

类型 大小 ( bytes) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

案例

设计一张员工信息表,要求如下:
1.编号(纯数字)
2.员工工号(字符串类型,长度不超过10位)
3.员工姓名(字符串类型,长度不超过10位)
4.性别(男/女,存储一个汉字)
5.年龄(正常人年龄,不可能存储负数)
6.身份证号(二代身份证号均为18位,身份证中有X这样的字符)
7.入职时间(取值年月日即可)

  1. CREATE TABLE emp(
  2. id int comment '编号',
  3. workno varchar(10) comment '工号',
  4. name varchar(10) comment '姓名',
  5. gender char(1) comment '性别',
  6. age tinyint unsigned comment '年龄',
  7. idcard char(18) comment '身份证',
  8. entrydate date comment '入职日期'
  9. ) comment '员工表';
  1. mysql> desc emp;
  2. +-----------+------------------+------+-----+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +-----------+------------------+------+-----+---------+-------+
  5. | id | int | YES | | NULL | |
  6. | workno | varchar(10) | YES | | NULL | |
  7. | name | varchar(10) | YES | | NULL | |
  8. | gender | char(1) | YES | | NULL | |
  9. | age | tinyint unsigned | YES | | NULL | |
  10. | idcard | char(18) | YES | | NULL | |
  11. | entrydate | date | YES | | NULL | |
  12. +-----------+------------------+------+-----+---------+-------+
  13. 7 rows in set (0.00 sec)

DDL-表修改-修改

添加字段

  1. ALTER Table 表名 ADD 字段名 类型(长度) [comment 注释] [约束 ];

案例:

为emp表增加一个新的字段”昵称”为nickname,类型为varchar(20)

  1. ALTER Table emp ADD nickname varchar(20) comment '昵称';
  1. Field | Type | Null | Key | Default | Extra |
  2. +-----------+------------------+------+-----+---------+-------+
  3. | id | int | YES | | NULL | |
  4. | workno | varchar(10) | YES | | NULL | |
  5. | name | varchar(10) | YES | | NULL | |
  6. | gender | char(1) | YES | | NULL | |
  7. | age | tinyint unsigned | YES | | NULL | |
  8. | idcard | char(18) | YES | | NULL | |
  9. | entrydate | date | YES | | NULL | |
  10. | nickname | varchar(20) | YES | | NULL | |
  11. +-----------+------------------+------+-----+---------+---

修改数据类型

  1. ALTER Table 表名 MODIFY 字段名 新数据类型(长度);

修改字段名和字段类型

  1. ALTER Table 表名 CHANGE 旧字段名 类型(长度) [comment 注释] [约束];

案例:

将emp表的nickname字段修改为username, 类型为varchar(30)

  1. ALTER TABLE emp CHANGE nickname username varchar(30) comment '用户名';
  1. | Field | Type | Null | Key | Default | Extra |
  2. +-----------+------------------+------+-----+---------+-------+
  3. | id | int | YES | | NULL | |
  4. | workno | varchar(10) | YES | | NULL | |
  5. | name | varchar(10) | YES | | NULL | |
  6. | gender | char(1) | YES | | NULL | |
  7. | age | tinyint unsigned | YES | | NULL | |
  8. | idcard | char(18) | YES | | NULL | |
  9. | entrydate | date | YES | | NULL | |
  10. | username | varchar(30) | YES | | NULL | |
  11. +-----------+------------------+------+-----+---------+-------+
  12. 8 rows in set (0.00 sec)

删除字段

  1. ALTER TABLE 表名 DROP 字段名;

案例:

将emp表的字段username删除

  1. ALTER TABLE emp DROP username;
  1. -----------+------------------+------+-----+---------+-------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +-----------+------------------+------+-----+---------+-------+
  4. | id | int | YES | | NULL | |
  5. | workno | varchar(10) | YES | | NULL | |
  6. | name | varchar(10) | YES | | NULL | |
  7. | gender | char(1) | YES | | NULL | |
  8. | age | tinyint unsigned | YES | | NULL | |
  9. | idcard | char(18) | YES | | NULL | |
  10. | entrydate | date | YES | | NULL | |
  11. +-----------+------------------+------+-----+---------+-------+
  12. 7 rows in set (0.01 sec)

修改表名

  1. ALTER TABLE 表名 RENAME TO 新表名;

案例:

将emp表的表名修改为 employee

  1. ALTER TABLE emp RENAME TO employee;
  1. mysql> show tables;
  2. +------------------+
  3. | Tables_in_xuxian |
  4. +------------------+
  5. | employee |
  6. | tb_user |
  7. +------------------+
  8. 2 rows in set (0.00 sec)

删除表

  1. DROP TABLE [IF EXISTS] 表名;

删除指定表,并重新创建新表

  1. TRUNCATE TABLE 表名;