课程链接:
MYSQL8.0零基础入门之从青铜到钻石:https://www.imooc.com/learn/1281
1、SQL语句
1.1 SQL分类
-
DDL(Data Definition Language)数据定义语言
定义数据库对象:数据库、表、列等。关键字:create,drop,alter等。
-
DML(Data Manipulation Language)数据操作语言
用来对数据库中表的数据进行增删改查。关键字:insert,delete,update等。
-
DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select,where等
-
DCL(Data Control Language)数据控制语言
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE等。
1.2 SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾。
- 可使用空格和缩进来增强语句的可读性。
- Mysql数据库的SQL语句不区分大小写,关键字建议使用大写(效率更高)。
1.3 DDL语句
1.3.1 DDL操作数据库
1.3.1.1 DDL操作数据库
-
直接创建数据库
CREATE DATABASE 数据库名;
-
判断是否存在并创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名;
-
创建数据库并指定字符集(编码表)
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
1.3.1.2 查看数据库
-
查看数据库
SHOW DATABASES;
-
查看数据库的定义信息
SHOW CREATE DATABASE 数据库名
1.3.1.3 修改数据库
修改字符集
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;
1.3.1.4 删除数据库
DROP DATABASE 数据库名;
1.3.1.5 使用数据库
-
查看正在使用的数据库
SELECT DATABASES();
-
使用、切换数据库
USE 数据库名;
1.3.2 DDL操作表
1.3.2.1 创建表
? CREATE TABLE 表名 (字段名1 字段类型1,字段名2 字段类型2...);
? MYSQL数据类型
常用数据类型
类型 | 描述 |
---|---|
int | 整型 |
double | 浮点型 |
varchar | 字符串型 |
date | 日期类型:yyyy-MM-dd |
详细数据类型
分类 | 类型名称 | 说明 |
---|---|---|
整数类型 | tinyint | 很小的整数 |
smallint | 小的整数 | |
mediumint | 中等大小的整数 | |
int(integer) | 普通大小的整数 | |
小数类型 | float | 单精度浮点数 |
double | 双精度浮点数 | |
decimal(m,d) | 压缩严格的定点数 | |
日期类型 | year | YYYY 1901-2155 |
time | HH:MM:SS -838:59:59~838:59:59 | |
date | YYYY-MM-DD 1000-10-01~9999-12-31 | |
datetime | YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~9999-12-31 23:59:59 | |
timestamp | YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01UTC~2038-01-19 03:14:07UTC | |
文本、二进制类型 | CHAR(M) | M为0~255之间的整数 |
VARCHAR(M) | M为0~65536之间的整数 | |
TINYBLOB | 允许长度0~255字节 | |
BLOB | 允许长度0~6535字节 | |
MEDIUMBLOB | 允许长度0~167772150字节 | |
LONGBLOB | 允许长度0~4294967295字节 | |
TINYTEXT | 允许长度0~255字节 | |
TEXT | 允许长度0~65535字节 | |
MEDIUMTEXT | 允许长度0~167772150字节 | |
LONGTEXT | 允许长度0~4294967295字节 | |
VARBINARY(M) | 允许长度0~M个字节的变长字节字符串 | |
BINARY(M) | 允许长度0~M个字节的定长字节字符串 |
1.3.2.2 查看表
-
查看数据库中的所有表
SHOW TABLES;
-
查看表结构
DESC 表名;
-
查看创建表的SQL语句
SHOW CREATE TABLE 表名;
1.3.2.3 快速创建一个表结构相同的表
CREATE TABLE 新表名 LIKE 旧表名;
1.3.2.4 删除表
-
直接删除表
DROP TABLE 表名;
-
判断表是否存在并删除表
DROP TABLE IF EXISTS 表名;
1.3.2.5修改表结构
-
添加表列
ALTER TABLE 表名 ADD 列名 类型;
-
修改列类型
ALTER TABLE 表名 MODIFY 列名 新的类型;
-
修改列名
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;
-
删除列
ALTER TABLE 表名 DROP 列名;
-
修改表名
RENAME TABLE 旧表名 TO 新表名;
-
修改字符集
ALTER TABLE 表名 CHARACTER SET 字符集;
1.4 DML语句
? DML(Data Manipulation Language)数据操作语言
? 用来对数据库中表的数据进行增删改。关键字:insert,delete,update等
1.4.1 插入记录
- 关键字说明
INSERT INTO 表名 ——表示往哪张表中添加数据
(字段名1,字段名2,...) ——要给哪些字段设置值
VALUES(值1,值2); ——设置具体的值
- 注意
- 值与字段必须对应,个数相同,类型相同
- 值的数据大小必须在字段的长度范围内
- 除了数值类型外,其他类型字段的值必须使用引号(建议单引号)
- 如果要插入空值,可以不写字段,或者插入null
1.4.1.1 插入全部字段
-
所有的字段名都要写出来
INSERT INTO 表名(字段名1,字段名2,字段名3...) VALUES(值1,值2,值3...);
-
不写字段名
INSERT INTO 表名 VALUES(值1,值2,值3...);
1.4.1.2 插入部分数据
? INSERT INTO 表名(字段名1,字段名2...) VALUES(值1,值2...);
? 没有添加数据点字段会使用null
1.4.1.3 蠕虫复制
? 定义:在已有的数据基础之上,将原来的数据进行复制,插入到对应的表中
? 通用格式:INSERT INTO 表名1 SELECT * FROM 表名2;
? 作用:将表名2的数据复制到表名1中
? 注意:如果只想复制表中的部分字段使用如下格式:
? INSERT INTO 表名1(字段1,字段2...) SELECT 字段1,字段2... FROM 表名2;
1.4.2 更新表记录
-
不带条件修改数据
UPDATE 表名 SET 字段名=值;
-
带条件修改数据
UPDATE 表名 SET 字段名=值 WHERE 字段名 = 值;
-
关键字说明
UPDATE:修改数据
SET:修改哪些字段
WHERE:指定条件
1.4.3 删除表记录
-
不带条件删除数据
DELETE FROM 表名;
-
带条件删除数据
DELETE FROM 表名 WHERE 字段名=值;
truncate删除表记录
TRUNCATE TABLE 表名;
truncate和delete的区别:
- delete是将表中的数据一条一条删除
- truncate是将整个表摧毁,重新创建一个新的表结构和原来表结构一模一样
1.5 DQL语句
DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select,where等
注意:查询不会对数据库这种的数据进行修改,只是一种显示数据的方式
3.5.1 简单查询
3.5.1.1 查询表所有数据
-
使用*标识所有列
SELECT * FROM 表名;
-
写出查询每列的名称
SELECT 字段名1,字段名2,字段名3... FROM 表名;
3.5.1.2 查询指定列
? 查询指定列的数据,多个列之间以逗号分隔
? SELECT 字段名1,字段名2... FROM 表名;
3.5.1.3 别名查询
-
查询时给列、指定别名需要使用AS关键字
-
使用别名的好处是方便观看和处理查询到的数据
SELECT 字段名1 AS 别名,字段名2 AS 别名... FROM 表名;
注意:AS可以省略不写
3.5.1.4 清除重复值
-
查询指定列并且结果不出现重复数据
SELECT DISTINCT 字段名 FROM 表名;
3.5.1.5 查询结果参与运算
-
某列数据和固定值运算
SELECT 列名1 + 固定值 FROM 表名;
-
某列数据和其他列数据参与运算
SELECT 列名1 + 列名2 FROM 表名;
注意:参与运算的必须是数值类型
3.5.2 条件查询
? 语法格式:SELECT 字段名 FROM 表名 WHERE 条件;
3.5.3.1 比较运算符
? > 大于
? < 小于
? <= 小于等于
? >= 大于等于
? = 等于
? <>、!= 不等于
3.5.3.2 逻辑运算符
? and:多个条件同时满足
? or:多个条件其中一个满足
? not:不满足
? in关键字
? 语法格式:SELECT 字段名 FROM 表名 WHERE 字段名 IN (数据1,数据2...)
? in里面的每个数据都会作为一次条件,只要满足条件的就会显示
3.5.3.3 范围
? BETWEEN 值1 AND 值2:表示值1到值2范围,包头又包尾
? 如:age between 35 and 40
? 相当于:age >=35 && age <=70
3.5.3.4 模糊查询like
? like表示模糊查询
? SELECT *FROM 表名 WHERE 字段名 LIKE ‘通配符字符串‘;
? 满足通配符字符串规则的数据就会显示出来
? MySQL通配符有两个:
? %:表示0或多个字符(任意个字符)
? _:表示一个字符
3.5.3.5 排序
? 通过 order by 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)
? 语法:SELECT 字段 FROM WHERE 字段 = 值 ORDER BY 字段名 [ASC|DESC];
? ASC:升序,默认升序
? DESC:降序
3.5.3.5.1 单列排序
? 单列排序就是使用一个字段排序
3.5.3.5.2 组合排序
? 组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,以此类推。
? SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC],字段名2[ASC|DESC];
3.5.3.6 聚合函数
? 横向查询是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列是值进行计算,然后返回一个结果值。另外聚合函数会忽略空值。
? 五个聚合函数:
? count:统计指定列记录数,记录为NULL的不统计
? sum:计算指定列的数值和,如果不是数值类型,那么计算结果为0
? max:计算指定列的最大值
? min:计算指定列的最小值
? avg:计算指定列的平均值,如果不是数值类型,那么计算结果为0(NULL不参与计算)
? 聚合函数的使用:写在SQL语句的SELECT 后字段名的地方
? SELECT 字段名... FROM 表名;
? SELECT COUNT(字段名) FROM 表名;
3.5.3.7 分组
? 分组查询是指使用 GROUP BY 语句对查询信息进行分组,相同数据作为一组
? SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];
? GROUP BY 将分组字段结果中相同内容作为一组
HAVING和WHERE的区别:
- HAVING是在分组后对数据进行过滤
- WHERE是在分组前对数据进行过滤
- HAVING后面可以使用聚合函数
- WHERE后面不可以使用聚合函数
? 分组的目的是为了统计,一般分组会跟聚合函数一起使用
? 分组后聚合函数操作的就是一组数据
注意事项:当我们使用某个字段分组在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪个组的
- 查询的时候写入分组字段即可
ANY_VALUE()
- MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默认设置为打开状态。
- ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在此模式下,target list中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值
- MySQL提供了any_value()函数来抑制ONLY_FULL_GROUP_BY值被拒绝
- any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据
3.5.3.8 limit语句
? LIMIT:限制查询记录的条数
? SELECT *|字段列表 [AS 别名] FROM 表名 [GROUP BY子句] [HAVING子句] [ORDER BY子句] [LIMIT子句];
? LIMIT语法格式:
? LIMIT offset,length;或limit length;
? offset是指偏移量,可以认为是跳过的记录数量,默认为0
? length是指需要显示的总记录数
注意
如果第一个参数是0可以简写:
select * from 表名 limit 0,5;
select * from 表名 limit 5;
LIMIT 10,5:不够5条,有多少显示多少
2 、数据库分类
? 对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性
? 约束种类:
- PRIMARY KEY:主键
- UNIQUE:唯一
- NOT NULL:非空
- DEFAULT:默认
- FOREIGN KEY:外键
2.1 主键
2.1.1 主键的作用
? 用来唯一标识一条记录,每个表都应该有一个主键,并且每个表只能有一个主键。
? 那个字段应该作为表的主键
? 通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。
2.1.2 创建主键
? 主键:PRIMARY KEY
? 主键的特点
- 主键必须包含唯一的值
- 主键列不能包含NULL值创建主键创建主键的方式:
? 创建主键的方式
? 在创建表的时候给字段添加主键
? 字段名 字段类型 PRIMARY KEY
2.1.3 删除主键
? ALTER TABLE 表名 DROP PRIMARY KEY;
2.1.4 主键自增
? 通常希望在每次插入新纪录时,数据库自动生成主键字段的值。
? AUTO_INCREMENT 表示自动增长(字段类型必须是正数类型)
? 字段名 类型 PRIMARY KEY AUTO_INCREAMENG
? 修改自增字段值
扩展
默认AUTO_INCREMENT的起始值是1,如果希望修改自增字段的值,使用下列SQL语法:
ALTER TABLE 表名 AUTO_INCREMENT=起始值;
delete和truncate的区别
- delete删除表中的数据,但不重置AUTO_INCREMENT的值
- truncate摧毁表,重建表,AUTO_INCREMENT重置为1
2.2 唯一
? 在这张表的这个字段的值不能重复
2.2.1 唯一约束的基本格式
? 字段名 字段类型 UNIQUE
非空约束字段可以有重复的NULL
2.3 非空
? 这个字段必须设置值,,不能是NULL
2.3.1 非空约束的基本语法格式
? 字段名 字段类型 NOT NULL
2.3.2 默认值
? 往表中添加数据时,如果不指定这个字段的数据,就使用默认值。
? 默认值格式:
? 字段名 字段类型 DEFAULT 默认值
?