SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾。
- SQL语句可以使用空格/缩进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
- 注释:
单行注释:—注释内容或#注释内容(MySQL特有)
多行注释: /注释内容/
SQL分类
- DDL
- DML
- DQL
- DCL | 分类 | 全称 | 说明 | | —- | —- | —- | | DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) | | DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 | | DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 | | DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
DDL-数据库操作
查询
查询所有数据库
SHOW DATABASES;
查询当前数据库
SELECT DATABASE();
创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名[DEFAULT CHARSET字符集][COLLATE 排序规则];
推荐字符集: utf8mb4
删除数据库
DROP DATABASE [IF NOT EXISTS]数据库名;
使用数据库
USE 数据库名;
切换到xx数据库
DDL-表操作-查询
查询当前数据库所有表
SHOW TABLES;
查询表结构
DESC 表名;
查询指定表的建表语句
SHOW CREATE TABLE 表名 ;
DDL-表操作-创建
CREATE TABLE 表名(字段1 字段1类型[COMMENT 字段1注释],字段2 字段2类型[COMMENT 字段2注释],字段3 字段3类型[COMMENT 字段3注释],.......,字段n字段n类型[COMMENT 字段n注释])[COMMENT 表注释];
注意: []为可选参数,最后一个字段后面没有逗号
CREATE TABLE tb_user(id int comment '编号',name varchar(50) comment '姓名',age int comment '年龄',gender varchar(1) comment '性别') comment '用户表';
查询表结构
desc tb_user
+--------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| id | int | YES | | NULL | || name | varchar(50) | YES | | NULL | || age | int | YES | | NULL | || gender | varchar(1) | YES | | NULL | |+--------+-------------+------+-----+---------+-------+4 rows in set (0.01 sec)
查询表详细信息(建表语句)
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Table | Create Table |+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| tb_user | CREATE TABLE `tb_user` (`id` int DEFAULT NULL COMMENT '编号',`name` varchar(50) DEFAULT NULL COMMENT '姓名',`age` int DEFAULT NULL COMMENT '年龄',`gender` varchar(1) DEFAULT NULL COMMENT '性别') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表' |+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+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.入职时间(取值年月日即可)
CREATE TABLE emp(id int comment '编号',workno varchar(10) comment '工号',name varchar(10) comment '姓名',gender char(1) comment '性别',age tinyint unsigned comment '年龄',idcard char(18) comment '身份证',entrydate date comment '入职日期') comment '员工表';
mysql> desc emp;+-----------+------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----------+------------------+------+-----+---------+-------+| id | int | YES | | NULL | || workno | varchar(10) | YES | | NULL | || name | varchar(10) | YES | | NULL | || gender | char(1) | YES | | NULL | || age | tinyint unsigned | YES | | NULL | || idcard | char(18) | YES | | NULL | || entrydate | date | YES | | NULL | |+-----------+------------------+------+-----+---------+-------+7 rows in set (0.00 sec)
DDL-表修改-修改
添加字段
ALTER Table 表名 ADD 字段名 类型(长度) [comment 注释] [约束 ];
案例:
为emp表增加一个新的字段”昵称”为nickname,类型为varchar(20)
ALTER Table emp ADD nickname varchar(20) comment '昵称';
Field | Type | Null | Key | Default | Extra |+-----------+------------------+------+-----+---------+-------+| id | int | YES | | NULL | || workno | varchar(10) | YES | | NULL | || name | varchar(10) | YES | | NULL | || gender | char(1) | YES | | NULL | || age | tinyint unsigned | YES | | NULL | || idcard | char(18) | YES | | NULL | || entrydate | date | YES | | NULL | || nickname | varchar(20) | YES | | NULL | |+-----------+------------------+------+-----+---------+---
修改数据类型
ALTER Table 表名 MODIFY 字段名 新数据类型(长度);
修改字段名和字段类型
ALTER Table 表名 CHANGE 旧字段名 类型(长度) [comment 注释] [约束];
案例:
将emp表的nickname字段修改为username, 类型为varchar(30)
ALTER TABLE emp CHANGE nickname username varchar(30) comment '用户名';
| Field | Type | Null | Key | Default | Extra |+-----------+------------------+------+-----+---------+-------+| id | int | YES | | NULL | || workno | varchar(10) | YES | | NULL | || name | varchar(10) | YES | | NULL | || gender | char(1) | YES | | NULL | || age | tinyint unsigned | YES | | NULL | || idcard | char(18) | YES | | NULL | || entrydate | date | YES | | NULL | || username | varchar(30) | YES | | NULL | |+-----------+------------------+------+-----+---------+-------+8 rows in set (0.00 sec)
删除字段
ALTER TABLE 表名 DROP 字段名;
案例:
将emp表的字段username删除
ALTER TABLE emp DROP username;
-----------+------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----------+------------------+------+-----+---------+-------+| id | int | YES | | NULL | || workno | varchar(10) | YES | | NULL | || name | varchar(10) | YES | | NULL | || gender | char(1) | YES | | NULL | || age | tinyint unsigned | YES | | NULL | || idcard | char(18) | YES | | NULL | || entrydate | date | YES | | NULL | |+-----------+------------------+------+-----+---------+-------+7 rows in set (0.01 sec)
修改表名
ALTER TABLE 表名 RENAME TO 新表名;
案例:
将emp表的表名修改为 employee
ALTER TABLE emp RENAME TO employee;
mysql> show tables;+------------------+| Tables_in_xuxian |+------------------+| employee || tb_user |+------------------+2 rows in set (0.00 sec)
删除表
DROP TABLE [IF EXISTS] 表名;
删除指定表,并重新创建新表
TRUNCATE TABLE 表名;
