MySQL基础
1. 前置
1.1 SQL分类
类别 | 含义 |
---|---|
DDL(Data Definition Language):数据定义语言 | 用于对数据库、表进行创建、修改等,如create、drop、alter等 |
DML(Data Manipulation Language):数据操纵语言 | 用于对表中记录进行插入、修改、查询等,如insert、delete、update、select等 |
DCL(Data Control Language):数据控制语言 | 用于对数据库、表、字段、用户访问权限、安全级别进行定义,如commit、rollback、grant、revoke、savepoint等 |
其中
- select作为最常用的语句,也可将其单独作为一类:DQL(Data Query Language),即数据查询语言;
- commit、rollback与事务相关,可将其视为一类:TCL(Transaction Control Language),即事务控制语言;
1.2 SQL使用规范
1.3 命名规则
- 自定义名,取值范围为大小写字母a-z、A-Z,数字0-9,以及下划线_;
- 多个单词组成的自定义名,可使用下划线间隔;
1.4 SQL大小写规范
总之就是涉及自定义的名字使用小写,SQL内部提供的东西使用大写;
1.5 注释
- 单行注释:1)MySQL独有:# 注释内容;2)-- 注释内容;
- 多行注释:/* 注释内容*/;
1.6 执行SQL文件
- 方式一:命令行方式下进入mysql环境,使用命令
source 指定SQL文件的具体路径
即可执行对应SQL文件; - 方式二:图形化工具Navicat等中大概使用
工具->执行SQL文件->选择指定的SQL文件
即可;
2. SELECT语句
2.1 基本结构:
SELECT 字段1,字段2,...
FROM 表名;
2.2 为字段添加别名AS
- 其中AS表示别名Alias,可省略,但不建议省略;
- 如果使用多个单词作为别名,且使用空格间隔,则可使用双引号将别名括起来;
SELECT 字段1 AS 别名1,字段2 AS 别名2,...
FROM 表名;
2.3 对查询结果进行去重DISTINCT
- DISTINCT实质是对查询列的组合进行去重,只有当某些记录的所有列的值相同,才当做重复记录;
SELECT DISTINCT 字段1 AS 别名1,字段2 AS 别名2,...
FROM 表名;
2.4 空值参与运算NULL
- 空值即NULL;
- NULL不是0、‘’、‘NULL’;
- 空值参与运算,结果都为NULL;
2.5 查询常数
如下:
SELECRT 1,salary
FROM employees;
会为每条记录都添加一个常数字段;
2.6 显示表结构
DESCRIBE 表名;
或
DESC 表名;
2.7 条件查询/过滤数据WHERE
- 只显示满足查询条件的相关记录;
- 声明在FROM结构之后,且紧跟在FROM之后;
- 不能使用查询字段的别名进行过滤条件设置;
SELECT DISTINCT 字段1 AS 别名1,字段2 AS 别名2,...
FROM 表名
WHERE 过滤条件;
3. 运算符
3.1 算术运算符
- 加减乘除取余运算:+、-、*、/或div、%或mod;
- 在SQL中+号只有加法作用,与字符串进行运算时,会将字符串隐式转换为数值,可以转换的前提是字符串内容由数字组成,如“123”。如果字符串内容为字符,则将其视为0;
- 进行除法时,1)分母非零时,结果一定是浮点型;2)分母为0时,结果为NULL;
- 取模运算结果的符号与被模数保持一致;
- NULL参与运算结果均为NULL;
3.2 比较运算符
- 比较结果为真则返回1,假则返回0,其他情况返回NULL;
- 除了安全等于运算符<=>,其他运算符有NULL参与运算结果均为NULL;
- 等于运算符<=>中,操作数有一个是NULL则结果为0,如果两个操作数均为NULL则结果为1;
- 如下是非符号型运算符:
1)BETWEEN…AND…查找区间为左闭右闭;
2)IN 或NOT IN是在离散集合中进行查找;
3)LIKE用于模糊查询,可使用1)下划线_:表示一个字符;2)百分号%:表示未知数量的字符;3)斜杠\:表示转义,对特殊字符进行转义使其作为普通字符出现;完成特定的查询功能;
3.3 逻辑运算符
- 返回结果为0、1、NULL三种;
- 有NULL参与运算结果为NULL;
3.4 位运算符
- 将操作数转为二进制进行运算,一定程度上可提高效率;
- 在一定范围内,左移一位相当于乘2,右移一位相当于除2;
3.5 运算符优先级
- 括号优先级最高,所以在编写SQL时,想先运算哪个部分,就使用括号将其包裹起来即可;
4. 排序和分页
4.1 排序ORDER BY
- 声明在FROM结构之后;
- 在不使用排序时,默认查询结果按照数据插入的顺序进行显示;
- ASC(默认情况,可不显示指定)表示升序排列,DESC表示降序排列;
- 可使用查询字段的别名指定排序方式;
- 排序字段可不在查询字段中;
- 可使用多级排序,首先从一级排序开始执行;
SELECT DISTINCT 字段1 AS 别名1,字段2 AS 别名2,...
FROM 表名
WHERE 过滤条件
ORDER BY 字段1 排序方式1,字段2 排序方式2...;
4.2 分页LIMIT OFFSET
- 声明在FROM结构之后,必须声明在整个SELECT结构的最后;
- 位置偏移量从0开始,如果偏移量为0,可直接使用LIMIT 条目数进行分页查询;
- 分页查询公式:LIMIT (页数-1)*页面大小,页面大小;
- 约束返回结果的数量可以 减少数据表的网络传输量 ,也可以提升查询效率;
- 在 MySQL、PostgreSQL、MariaDB 和 SQLite 中使用 LIMIT 关键字,而且需要放到 SELECT 语句的最后面;
SELECT DISTINCT 字段1 AS 别名1,字段2 AS 别名2,...
FROM 表名
WHERE 过滤条件
ORDER BY 字段1 排序方式1,字段2 排序方式2...
LIMIT 位置偏移量,条目数;
或
SELECT DISTINCT 字段1 AS 别名1,字段2 AS 别名2,...
FROM 表名
WHERE 过滤条件
ORDER BY 字段1 排序方式1,字段2 排序方式2...
LIMIT 条目数 OFFSET 位置偏移量;
5. 多表查询/联合查询
5.1 为什么需要多表查询
- 缓解单表数据冗余问题;
- 减少IO次数,提高查询效率;
- 提高多用户查询并发性;
5.2 如何进行多表查询
进行多表查询是需要注意以下几点:
- 需要在WHERE结构中声明多表之间的连接条件;
- 如果省略连接条件或者连接条件无效,会导致笛卡尔积错误;
- 笛卡尔积又称为交叉连接CROSS JOIN;
- 如果需要查询的字段在多表中都存在,则需要显式指明该字段所在的具体表;
- 多表查询时,建议显式指定所有查询字段的表;
- 为了SQL简洁,可为表指定别名,一旦指定别名则必须在其他部分(SELECT、WHERE等)中使用表的别名,而不能使用表的原名;
- 如果有N个表进行多表查询,则至少需要N-1个连接条件;
- 需要控制连接表的数量,连接表过多会降低查询效率;
5.3 多表查询的分类
只是分类角度不同:
- 角度1:等值连接 VS 非等值连接,即连接条件是否为相等判断;
- 角度2:自连接 VS 非自连接,既多表是否可视为是单表的复制;
- 角度3:内连接 VS 外连接
内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行;
外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。
如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为 从表 。
如果是右外连接,则连接条件中右边的表也称为 主表 ,左边的表称为 从表 。
如果将两个表中不匹配的行都显示,则称为满外连接;
5.3.1 内连接、外连接、满外连接的实现
SQL92标准:
- SQL92标准中,只有左外连接、右外连接,没有对满外连接的实现;
- MySQL不支持SQL92标准关于外连接的实现;
- SQL92中使用(+)标注从表所在位置,表示外连接中哪个是从表,比如xxx=yyy(+)表示yyy所在表为从表;
SQL99标准:用JOIN…ON的方式实现多表查询;
5.3.2 SQL99标准实现多表查询
基本模板:
SELECT table1.column, table2.column,table3.column
FROM table1
JOIN table2 ON table1 和 table2 的连接条件
JOIN table3 ON table2 和 table3 的连接条件
- 关键字 JOIN、INNER JOIN、CROSS JOIN 的含义是一样的,都表示内连接;
- 左外连接:LEFT OUTER JOIN;右外连接:RIGHT OUTER JOIN;
- 满外连接:FULL JOIN 或 FULL OUTER JOIN;
- MySQL不支持FULL JOIN 或 FULL OUTER JOIN,可使用LEFT JOIN UNION RIGHT JOIN代替;
5.3.3 7种SQL JOIN的实现
- UNION、UNION ALL可实现多个SELECT结果集的合并;
- 二者区别在于UNION会对结果集进行去重,资源消耗相对较大;
参考资料:
- 尚硅谷
核心:
- 需要理解整个SELECT 结构中,不同组件的执行顺序;
- 多表查询JOIN…ON…,7种SQL JOIN的实现;