1. 基础查询
特点
① 通过
select
查询完的结果 ,是一个虚拟的表格
,不是真实存在
② 要 查询的东西 可以是常量值
、表达式
、字段
、函数
示例:
AS
:起别名,可以省略
DISTINCT
:去重
, 放在 字段前面CONCAT(str1,str2,...)
:MySQL中用于字符串拼接
IFNULL(expr1,expr2)
:判断某 字段 或 表达式 的值是否为null
- 如果
expr1的值
不为null
,返回expr1的值
- 如果为
null
,返回expr2的值
ISNULL(expr)
:判断expr
的值是否为null
- 如果
expr
的值不为null
,返回0
- 如果为
null
,返回1
NULLIF(expr1,expr2)
:判断某 字段 或 表达式 的值是否为null
- 如果
expr1=expr2
成立,那么返回值为null
,否则返回值为expr1的值
IF(expr1,expr2,expr3)
:判断某 字段 或 表达式 的值是否为null
- 如果
expr1
的值为true
,则返回expr2
的值,否则返回expr3
的值
语法格式
SELECT 要查询的东西【FROM 表名】;
闲言碎语
SQL
语言大小写不敏感
SQL
可以写在一行
或者多行
关键字
不能被缩写也不能分行各子句
一般要分行写
使用缩进
提高语句的可读性
2. 条件查询
语法格式
select
要查询的字段|表达式|常量值|函数from
表where
条件;
条件表达式
示例
:
age > 18
条件运算符(示例):
> < >= <= = != <>
逻辑表达式
示例
:
age > 18 && age < 60
条件运算符(示例):
and(
&&
):两个条件如果同时成立
,结果为true
,否则为false
or(||
):两个条件只要有一个成立
,结果为true
,否则为false
not(!
):如果条件成立,则not
后为false
,否则为true
模糊查询
示例
:
like
【%
任意0个
或多个
字符;_
表示任意单个
字符 】
between ... and ...
【注意:包含临界值
,等同于>=
和<=
】
in
【列表中类型必须一致
】
is null
、is not null
【可以判断null值
】
<=>
【表示安全等于
,判断值是否相等
,既可以和数值
搭配,也可以和null
搭配】
ESCAPE
用法:
案例:
查询员工名称中 第二个字符为_
的员工名字;【注意_
为 通配字符,所以需要转义
,如果是普通字母就不需要了】
方式一:可以使用\
转义 字符, 如:name like "_\_%"
方式二:ESCAPE
任意 字符,如:name like "_$_%" ESCAPE '$'
【
ESCAPE '$'
只是强调说明一下$
在这里被当作是转义字符使用,并不一定
非要使用$
,也可以使用a b c......
只不过使用$
可读性强 些】
is null
和<=>
的区别
is null
:仅仅判断null
值,可读性较高
<=>
:既可以判断null
值,又可以判断普通的数值,但是可读性较差,很少用
3. 排序查询
默认
asc升序
排序
语法格式
select
要查询的东西
from
表
where
条件
order by
排序的字段|表达式|函数|别名 【asc|desc
】多个字段排序中间用
英文逗号
隔开,不能用and
连接
4. 常见函数
MySql
中索引是从1
开始的
单行函数
1. 字符函数
示例
concat
拼接字符串
substr
截取子串
upper
转换成大写
lower
转换成小写
trim
去前后指定的空格和字符
ltrim
去左边空格
rtrim
去右边空格
replace
替换
lpad
左填充
rpad
右填充
instr
返回子串第一次出现的索引
length
获取字节个数
示例
2. 数学函数
示例
round
四舍五入
rand
随机数
floor
向下取整:返回小于等于该参数的最小整数
ceil
向上取整:返回大于等于该参数的最小整数
mod
取余:
mod(a,b)
运算过程为a-a/b*b
运算结果的符号和a
保持一致- 例如:
mod(-10,3)
运算过程:
(-10)-(-10)/3*3 = (-10)-(-3)*3 = (-10)-(-9)= -1
truncate
截断
示例
3. 日期函数
示例
now
当前系统日期+时间
DATEDIFF(expr1,expr2)
:可以统计两日期之间相差的天数
curdate
当前系统日期
curtime
当前系统时间
str_to_date
将字符转换成日期
date_format
将日期转换成字符
示例
SELECT
NOW() `now`, -- 当前系统日期+时间
CURDATE() `curdate`, -- 当前系统日期
CURTIME() `curtime`, -- 当前系统时间
DATEDIFF('2024-12-15', '2024-12-10') `DATEDIFF`,
-- 统计两日期之间相差的天数
STR_TO_DATE('8-11-2024', '%m-%d-%Y') `strToDate`,
-- 将字符转换成日期
DATE_FORMAT( '2024/08/12', '%Y年%m月%d日' ) dateToStr
-- 将日期转换成字符
FROM
DUAL;
4. 流程控制函数
IF(expr1,expr2,expr3)
函数处理双分支:if else
的效果函数用法说明: 如果
expr1
是TRUE (expr1 <> 0 and expr1 <> NULL)
,则IF()
的返回值为expr2
; 否则返回值则为expr3
。IF()
的返回值为数字值或字符串值
,具体情况视其所在语境而定
CASE WHEN THEN 函数
case
要判断的字段或表达式
when
常量1then
要显示的值1
when
常量2then
要显示的值2
...
else
要显示的值n
end
或
case
要判断的字段或表达式
when
条件1then
要显示的值1
when
条件2then
要显示的值2
...
else
要显示的值n
end
5. 其他函数
示例:
主要是一些数据库系统相关
的函数
SELECT VERSION();
查看MySQL
版本号
SELECT DATABASE();
查看当前库
SELECT USER();
查看当前连接用户
分组函数
分组函数 用作
统计
使用,又称聚合函数
或统计函数
或组函数
分类
sum
:求和
avg
:平均值
max
:最大值
min
:最小值
count
:计数
特点:
- 以上五个分组函数都
忽略 null
值,除了count(*)
sum
和avg
一般用于处理数值型max
、min
、count
可以处理任何数据类型- 都可以搭配
distinct
使用,用于统计去重
后的结果count
的参数可以支持:字段
、*
、常量值
,一般放1
,建议使用count(*)
- 和
分组函数
一同查询的字段要求是group by 后的字段
5. 分组查询
分组函数
分组函数 用作
统计
使用,又称聚合函数
或统计函数
或组函数
分类
sum
:求和
avg
:平均值
max
:最大值
min
:最小值
count
:计数
语法格式
语法格式
select
分组函数, 列(必须出现在group by
后面的列)
from
表
where
筛选条件
group by
分组的列表
order by
子句查询的字段要求是
分组函数
和group by
后出现的字段
特点
特点:
group by
支持单个
字段分组、多个
字段分组(逗号
隔开,无顺序
要求)、表达式
或函数
(用 较少)- 和分组函数一起查询的字段必须是
group by后
出现的字段- 可以
支持排序
(排序放在整个分组函数的最后
)- having后可以
支持别名
,只是 不常用- 分组筛选 ,筛选条件位置(
参考下述对比图表
)① 能用 分组前 筛选的,优先考虑 分组前 筛选
②分组函数
做条件 肯定在having子句中
特点 5 说明 | 针对的表 | 位置 | 关键字 |
---|---|---|---|
分组前筛选 | 原始表 | group by 的 前 面 | where |
分组后筛选 | 分组后的结果集 | group by 的 后 面 | having |
6. 多表连接查询
分类
按
年代
分
SQL92
标准:【MySQL
中 仅仅支持内连接
】
SQL99
标准【推荐使用】:【MySQL
中仅仅支内连接
+外连接
(左外和右外,MySQL
中不支持全外链接
) +交叉连接
】
按功能
分
内连接
:
等值
连接非等值
连接自
连接
外连接
:
左外
连接右外
连接全外
连接
交叉连接
SQL 七种连接示意图
SQL92语法
【
MySQL
中 仅仅支持内连接
】
等值连接
语法
select
查询列表
from
表1 别名,表2 别名
where
表1.key = 表2.key
【and
筛选条件】
【group by
分组字段】
【having
分组后的筛选】
【order by
排序字段】
注意事项
- 等值连接的结果 = 多个表的交集
n
表连接,至少需要n-1
个连接条件多个表
不分主次,无顺序
要求- 一般为表
起别名
,提高阅读性和性能
非等值连接
语法和
等值连接
相同,where
后变为非等值连接条件
示例:
自连接
和
等值连接一样
示例:
SQL99语法
简述
通过
join
关键字实现连接
【MySQL
中 仅仅支持内连接
+外连接
(左外和右外
,不支持全外连接
) +交叉连接
】
含义:1999年推出的
sql
语法
支持:
内连接(★)
: inner外连接
左外(
★
) :left
【outer
】
右外(★
) :right
【outer
】
全外 :full
【outer
】
交叉连接
:cross
语法格式
语法
select
字段,...
from
表1
【inner|left outer|right outer|cross
】join
表2on
连接条件
【inner|left outer|right outer|cross
】join
表3on
连接条件
【where
筛选 条件】
【group by
分组 字段】
【having
分组 后 的 筛选 条件】
【order by
排序 的字段或表达式】
内连接
语法:
select
查询列表
from
表1 别名
inner join
表2 别名
on
连接条件;
分类:
等值
连接非等值
连接自
连接
特点:
①添加排序、分组、筛选
②inner
可以省略
③ 筛选条件放在where
后面,连接条件放在on
后面,提高分离性,便于阅读
④inner join
连接和sql92
语法中的 等值连接 效果是一样的,都是查询多表的交集
示例:
等值
连接
非等值
连接
自
连接
外连接
应用场景:
用于查询一个表中
有
,另一个表没有
的记录
特点:
1、外连接的查询结果为
主表中的所有记录
;
如果从表
中有和它匹配
的,则显示匹配
的值
如果从表
中没有
和它匹配
的,则显示null
外连接查询结果
=内连接结果
+主表中有而从表没有的记录
2、
左外
连接,left join 左
边的是主表
右外
连接,right join 右
边的是主表
3、左外
和右外
交换两个表的顺序,可以实现同样的效果
4、全外连接
=内连接的结果
+表1中有
但表2没有
的+表2中有
但表1没有
的
MySQL
不支持全外连接
- 可以参考上述 SQL 七种连接示意图 理解
示例:
左外
连接
右外
连接
全外
连接
百度百科
交叉连接
SQL92和SQL99对比
功能:
sql99
支持的较多
可读性:sql99
实现连接条件
和筛选条件
的分离,可读性较高
7. 子查询
特点、分类
特点:
- 子查询
都放在小括号内
- 子查询可以放在
from
后面、select
后面、where
或having
后面、exists
后面,但一般放在条件的右侧
子查询
优先于主查询执行,主查询使用了
子查询 的执行结果
- 子查询根据
查询结果的行数
不同分为以下两类
① 单行子查询
- 结果集
只有一行
- 一般搭配
单行操作符
使用:> < = <> >= <=
- 非法使用子查询 的情况:
- a、子查询的
结果为一组值
- b、子查询的
结果为空
② 多行子查询
- 结果集
有多行
- 一般搭配
多行操作符
使用:any/some、all、in、not in
in:
属于子查询结果中的任意一个
就行any
和all
往往可以用其他查询 如: min 和 max
代替
示例
示例:
标量子查询 (单行子查询)
标量子查询(单行子查询)
列子查询 (多行子查询)
列子查询(多行子查询)
行子查询 [ 结果集一行多列或多行多列(用的较少)]
**
行子查询
[ 结果集一行多列
或多行多列
(用的较少
)]**了解即可
子查询位置示例
EXISTS 用法
where
后使用 带有exists
或not exists
的子查询作为条件时,子查询不返回任何记录的数据,而是返回逻辑值true
或false
注意: 执行顺序是先执行外查询再执行内查询
,根据外查询
的每条执行结果执行内查询
exists
: 子查询有
结果 ,返回true
,保留
外查询 的这条数据;否则返回false
,不保留
外查询 的这条数据not exists
:子查询无
结果 ,返回true
,保留
外查询 的这条数据;否则返回false
,不保留
外查询 的这条数据
因为
子查询
只是返回逻辑值true
或false
,所以子查询中的select
后跟什么字段不重要,可以是任何内容,但是为了执行效率,建议写1
8. 分页查询limit
语法
语法
select
字段|表达式,...
from
表
【where
筛选 条件】
【group by
分组 字段】
【having
分组 后 的 筛选 条件】
【order by
排序 的字段或表达式】
limit
【起始的条目索引】,条目数;
特点:
- 起始条目索引 从
0
开始
limit
子句放在 查询语句的最后
- 规律公式:
select * from 表 limit (page-1)*size, size
size
每页显示条目数page
要显示的页数
举例理解:
假定:limit A,B(size)
B(size) = 10
page A
1
0
2
10
3
20
4
30
...
B(size)
(page-1)*size
示例:
limit A, B
理解:
跳过 A 条数据,取 B 条数据
9. 联合查询
语法
select
字段|常量|表达式|函数 【from
表】 【where
条件】
union
【all
】
select
字段|常量|表达式|函数 【from
表】 【where
条件】
union
【all
】
...
select
字段|常量|表达式|函数 【from
表】 【where
条件】
特点:
- 多条查询语句的
查询的列数必须是一致的
- 多条查询语句
每一列的类型和顺序最好一致
union
代表去重
,union all
代表不去重
应用场景:
要查询的结果
来自于多个表
,且它们之间没有直接的连接关系
,但查询结果一致
时
10. 执行顺序
MySQL书写顺序 | 执行顺序 |
---|---|
select 查询列表 | 7 |
from 表1 | 1 |
join 表2 | 2 |
on 连接条件 | 3 |
where 筛选条件 | 4 |
group by 分组列表 | 5 |
having 分组后的筛选 | 6 |
order by 排序列表 | 8 |
limit 偏移数,展示条目数 | 9 |