SQL之DQL(Data Query Language) 数据查询语言

将DQL分成基础查询、条件查询、排序查询、常见函数、分组查询、连接查询、子查询、分页查询、联合查询、查询总结,并按此顺序记录笔记。

基础查询

一、语法

select 查询列表 from 表名;

二、特点

1、查询列表可以是字段、常量、表达式、函数,数量可以是一个或多个
2、查询结果是一个虚拟表

三、示例

1、查询单个字段
select 字段名 from 表名;

2、查询多个字段
select 字段名,字段名 from 表名;

3、查询所有字段
select * from 表名;

4、查询常量
select 常量值;
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要

5、查询函数
select 函数名(实参列表);

6、查询表达式
select 100/1234;

7、起别名
① as
② 空格

8、去重
select distinct 字段名 from 表名;

9、+
作用:做加法运算
select 数值+数值; 直接运算
select 字符+数值; 先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算(我测试的字符转换成数值都为0)
select null+值; 结果都为null

10、concat函数
功能:拼接字符
select concat(字符1,字符2,字符3,...);

11、ifnull函数
功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
select ifnull(commission_pct,0) from employees;

12、isnull函数
功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0

条件查询

一、语法

select 查询列表
from 表名
where 筛选条件;

二、筛选条件的分类

1、简单条件运算符

> < = <> != >= <= <=>(安全等于)

2、逻辑运算符

&& and
|| or
! not

3、模糊查询

like:一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符
_可以匹配’_’
between and (between min and max 等价于 [min, max])
select * from employees where employee_id between 100 and 120;
in:判断某字段的值是否属于in列表中的某一项
注意:
1、in提高简洁度
2、in列表中的值类型必须统一

is null/is not null:用于判断null值
<=>:安全等于

isnull和<=>对比

普通类型的数值null值可读性
is null××
<=>×

排序查询

一、语法

select 查询列表
fromwhere 筛选条件
order by 排序列表 【asc|desc;

二、特点

1、asc :升序,如果不写默认升序
    desc:降序

2、排序列表 支持 单个字段、多个字段、函数、表达式、别名

3、order by的位置一般放在查询语句的最后(除limit语句之外)

常见函数

一、概述

功能:类似于java中的方法
好处:提高重用性和隐藏实现细节
调用: select 函数名(实参列表);

二、单行函数

1、字符函数

concat():连接,concat(str1, str2, …)
substr():截取子串,substr(str, begin, len),从begin位置开始,截取长度为len的字符串
upper():变大写,upper(str)
lower():变小写,lower(str)
replace():替换,replace(str, str1, str2) 把str中的str1全部替换成str2
length():获取字节长度,length(str)
trim():去前后空格,trim(str)
lpad():左填充,lpad(str,len,str1) 显示的长度为len,如果str的长度小于len,左边用str1填充。如果 str的长度大于len,则截断。
rpad():右填充
instr():获取子串第一次出现的索引,instr(str, substr),没找到返回0

2、数学函数

ceil():向上取整
round():四舍五入
mod():取模,mod(n,m)
floor():向下取整
truncate():截断,truncate(num,n)截取num小数点后n位
rand():获取随机数,返回0-1之间的小数

3、日期函数

now():返回当前日期+时间
year():返回年,如 year(now())
month():返回月
day():返回日
date_format():将日期转换成字符
curdate():返回当前日期
str_to_date():将字符转换成日期
curtime():返回当前时间
hour():小时
minute():分钟
second():秒
datediff():返回两个日期相差的天数
monthname():以英文形式返回月

在这里插入图片描述

4、其他函数

version() 当前数据库服务器的版本
database 当前打开的数据库
user()当前用户
password(‘字符’):返回该字符的密码形式
md5(‘字符’):返回该字符的md5加密形式

5、流程控制函数

①if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2
②case情况1

case 变量或表达式或字段
when 常量1 then1
when 常量2 then2
...
else 值n
end

③case情况2

case 
when 条件1 then1
when 条件2 then2
...
else 值n
end

注意,then后面是值的时候不需要加分号,结尾用end

三、分组函数

1、分类

max 最大值
min 最小值
sum 和
avg 平均值
count 计算个数

2、特点

①语法
select max(字段) from 表名;
②支持的类型
sum和avg一般用于处理数值型
max、min、count可以处理任何数据类型
③以上分组函数都忽略null
④都可以搭配distinct使用,实现去重的统计
select sum(distinct 字段) from 表;
⑤count函数
count(字段):统计该字段非空值的个数
count(*):统计结果集的行数
效率上:
MyISAM存储引擎,count(*)最高
InnoDB存储引擎,count(*)效率 > count(字段)
⑥ 和分组函数一同查询的字段,要求是group by后出现的字段

分组查询

一、语法

select 分组函数,分组后的字段
from 表
【where 筛选条件】
group by 分组的字段
【having 分组后的筛选】
【order by 排序列表】;

注意:除了分组函数外,select后面的字段必须也在group by后出现
例子:
查询哪个部门的员工数大于2

select department_id, count(*)
from employees
group by department_id
having count(*)>2;

二、特点

使用关键字筛选的表位置
分组前筛选where原始表group by前面
分组后筛选having分组后的表group by后面

连接查询

一、含义

当查询中涉及到了多个表的字段,需要使用多表连接

select 字段1, 字段2
from1,2...;

笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决:添加有效的连接条件
如:

select b.name, bo.boyName
from beauty b, boys bo
where b.boyfriend_id = bo.id;

二、分类

sql99

- 内连接

等值连接
非等值连接
自连接

- 外连接

左外连接
右外连接
全外连接(mysql不支持)
交叉连接

三、SQL99语法

1、内连接
语法:

select 查询列表
from1 别名
【innerjoin2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;

特点:
①表的顺序可以调换
②内连接的结果=多表的交集
③n表连接至少需要n-1个连接条件

2、外连接
语法:

select 查询列表
from1 别名
left|right|fullouterjoin2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;

特点:
①查询的结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
②left join 左边的就是主表,right join 右边的就是主表
full join 两边都是主表
③一般用于查询除了交集部分的剩余的不匹配的行

3、交叉连接

语法:

select 查询列表
from1 别名
cross join2 别名;

特点:类似于笛卡尔乘积

子查询

一、含义

嵌套在其他语句内部的select语句称为子查询或内查询,
外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多
外面如果为select语句,则此语句称为外查询主查询

二、分类

1、按出现位置

select后面:

仅仅支持标量子查询

from后面:

表子查询

where或having后面:

标量子查询(结果集只有一行一列)
列子查询(结果集由一行多列)
行子查询

exists后面:

标量子查询
列子查询
行子查询
表子查询

2、按结果集的行列
标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
如:

select *
from employees
where (employee_id, salary) = (
	select min(employee_id), max(salary)
	from employees
);

表子查询:结果集为多行多列

三、示例

where或having后面

1、标量子查询

案例:查询最低工资的员工姓名和工资
①最低工资
select min(salary) from employees

②查询员工的姓名和工资,要求工资=①

select last_nam, salary
from employees
where salary=(
	select min(salary) from employees
);

2、列子查询

in any all
案例:查询所有的领导姓名
①查询所有员工的 manager_id

select manager_id
from employees

②查询姓名,employee_id属于①列表的一个

select last_name
from employees
where employee_id in(
	select manager_id
	from employees
);

例子:查询每个部门的员工数

select d.*, count(employee_id)
from departments d
left join employees e
on d.department_id = e.department_id
group by d.department_id;

例子:查询每个部门平均工资及其工资等级

select ag_dep.*, g.grade_level
from (
select avg(salary) ag, department_id
from employees
group by department_id
) ag_dep
join job_grades g
on ag_dep.ag between g.lowest_sal and highest_sal;

分页查询

一、应用场景

当要查询的条目数太多,一页显示不全

二、语法

select 查询列表
fromlimitoffset,】size;

注意:
offset代表的是起始的条目索引,默认从0开始
size代表的是显示的条目数

联合查询

一、含义

union:合并、联合,将多次查询结果合并成一个结果

二、语法

查询语句1
unionall】
查询语句2
unionall;
...

三、意义

1、将一条比较复杂的查询语句拆分成多条语句
2、适用于查询多个表的时候,查询的列基本是一致

四、特点

1、要求多条查询语句的查询列数必须一致
2、要求多条查询语句的查询的各列类型、顺序最好一致
3、union 去重,union all包含重复项

查询总结

执行顺序如下:
语法:

select 查询列表     7
from1 别名       1
连接类型 join2   2
on 连接条件         3
where 筛选          4
group by 分组列表   5
having 筛选         6
order by排序列表    8
limit 起始条目索引,条目数;  9

欢迎转载,表明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值