数据库
首页 > 数据库> > SQL(二)DQL查询总结

SQL(二)DQL查询总结

作者:互联网

SQL(二)DQL查询总结

简单查询

条件查询

语法:

select
	字段1,字段2,字段3......
from
	表名
where
	条件;

举例:

//查询员工工资为例
select id,name from 表名 where money=800;
select id,name from 表名 where money!=800;(select id,name from 表名 where money<>800;)
select id,name from 表名 where money<=800;
//使用between and 时必须左小右大(是闭区间)
select id,name from 表名 where money>=800 and money<=1000;(select id,name from 表名 where money between 800 and 1000;)
//判空用is null,不能用=null,null不是一个值
select id,name from 表名 where money is null;(is not null)
//查询名字叫二狗工资不超过800的员工
select id,name from 表名 where name='二狗' and money=800;
//查询工资800和工资1000的员工
select id,name from 表名 where money=800 or money=1000;
select id,name from 表名 where money in(800,1000);(not in)

and和or优先级

相当于C语言里&和||优先级,写条件时可以加括号

模糊查询

like

//查询名字中含有o的人
select name from 表名 where name like '%o%';
//查询名字以T结尾的人
select name from 表名 where name like '%T';
//查询名字以K开头的人
select name from 表名 where name like 'K%';
//查询名字第三个字母是A的人
select name from 表名 where name like '__A%';
//查询名字中有_的人,需要\转义
select name from 表名 where name like '%\_%';

排序

单个字段

//查询时按员工工资排序(默认升序)
select id,name from 表名 order by money;
//查询时按员工工资排序(指定升序)
select id,name from 表名 order by money asc;
//查询时按员工工资排序(指定降序)
select id,name from 表名 order by money desc;

多个字段

//查询时按工资升序排,工资相同时按名字字典序排
select id,name from 表名 order by money asc,name asc;
//按第二列排序,了解一下
select id,name from 表名 order by 2;

综合

顺序不能变
select
	id,name
from
	表名
where
	money between 800 and 1000
order by
	money asc;
//工资在800~1000的员工按工资升序排列
select id,name from 表名 where money between 800 and 1000 order by 2;

数据处理函数

单行处理函数

分组函数(多行处理函数)

注意:

分组函数自动忽略null,分组函数必须在分组后使用,以上默认整张表分为一组

错误例子(分组后才能用分组函数,下面执行where时还没执行group by):

select name from 表名 where money<max(money);

分组查询

语法执行顺序:

from
where
group by
having
select
order by

连接查询

内连接

举例:现有两张表,表1中有员工姓名(name)和岗位编号(jobid);表2中有岗位编号(jobid)和岗位名称(jobname)

内连接之等值连接:

内连接之非等值连接:

内连接之自连接(一张表看成两张表):

image1


image2

外连接

右外连接(主要查右边的表,右边的表全输出):

select A.name,B.jobname from 表1 A right join 表2 B on A.jobid=B.jobid;

左外连接:

同上,right换成left

全连接

同上,right换成full

多表连接

语法:

select
	...
from
	a
join
	b
on
	条件
join
	c
on
	条件
right join
	d
on
	条件;

查找员工名,薪资,工作名,薪资等级:

select 
	A.name,A.money,B.jobname,C.grade
from
	表1 A,
join
	表2 B,
on
	A.id=b.id
join
	表3 C
on
	A.money between C.min_money and C.max_money; 

子查询

语法:

//select的嵌套
select
	..(select)
from
	..(select)
where
	..(select)

查询比最低工资高的员工名和薪资:

select name,money from 表1 where money>(select min(money) from 表1);

查询按工资分组查询平均薪资的薪资等级:

select
	A.*,B.grade
from
	(select job,avg(money) average from 表1 group by jobname) A
join
	表2 B
on
	A.average between B.min_money and B.max_money;

注意:

子查询(嵌套查询)只能返回一条数据

Union合并查询

举例:

select name from 表1 where jobname='讲师' or jobname='教授';
//上面可以换做下面
select name from 表1 where jobname='讲师'
union
select name from 表1 where jobname='教授';
//union是相加,比笛卡尔积效率高

注意:

进行union时,两条查询的列数及数据类型应相同,只是列数相同也不行(mysql中不报错,oracle语法较为严格会报错)

limit

通常用在分页查询

按薪资降序排序,取出前五条记录:

select name,money from 表 order by money desc limit 5;

取出薪资排名3到5的员工:

select name,money from 表 order by money desc limit 2,3;

注意:

mysql中limit在order by后执行

limit 5:取前5

limit 0,5:从0开始取5条记录

limit分页查询

分页显示3条记录:

第一页:limit 0,3 [0,1,2]

第二页:limit 3,3 [3,4,5]

第三页:limit 6,3 [6,7,8]

第四页:limit 9,3 [9,10,11]

观察发现(页码-1)*3是起始下标

DQL总结

书写顺序:

select
from
where
group by
having
order by
limit

执行顺序:

from
where
group by
having
select
order by
limit

标签:name,money,SQL,查询,表名,DQL,where,select
来源: https://www.cnblogs.com/LoginX/p/Login_X39.html