数据库常用的SQL查询语句(非常详细),看完这一篇就足够了
当我们进⾏语句查询的时候,总会遇到我们需要的条件需要通过另⼀个查询语句查询出来后才能进⾏,就是说A 查询语句需要依赖B 查询语句的查询结果,B 查询就是⼦查询,A 查询语句就是主查询,⼀个SQL语句可以包含多个⼦查询。如果查询数据的来源来自多张表,则必须对这些表进行连接查询,连接是把不同表的记录连到一起的最普遍的方法,通过连接查询可将多个表作为一个表进行处理,连接查询分为内连接和外连接。左外连接:
1. 无条件查询
--查询表中所有数据
select * from 表名;
2. 查询在…到…之间(between and / && / and)
--查询users表中年龄在18~25岁之间的记录
--方式1 between..and..
select * from users where age between 18 and 25;
--方式2 &&
select * from users where age>=18 && age<=25;
--方式3 and
select * from users where age>=18 and age<=25;
3. 指定条件查询
-
单个条件(or / in)
--查询users表中年龄为18,20,25岁的记录 --方式1 or select * from users where age=18 or age=20 or age=25; --方式2 in select * from users where age in (18,20,25);
-
多个条件(and)
--查询users表中年龄为23,性别为女,名字为小楠的记录 select * from users where age=23 and gender='女' and name='小楠';
4. 查询不为NULL值(is not null),为NULL值(is null)
--查询users表中序号不为空的记录
select * from users where id is not null;
--查询user表中序号为空的记录
select * form users where id is null;
5. 模糊查询(like)
_:单个任意字符
%:多个任意个字符
--查询users表中姓名第一个字为李的记录
select * from users where name like '李%';
--查询users表中姓名第二个字为李的记录
select * from users where name like '_李%';
--查询users表中姓名含有李字的记录
select * from users where name like '%李%';
--查询users表中姓名是两个字的记录
select * from users where name like '__';
6. 去除重复记录查询(distinct)
--查询users表中所在城市不相同的记录
--select distinct 字段 from 表名;
select distinct city from users;
7. 排序查询(order by)
-
单个条件
--查询users表中记录,并以年龄升序排序 select * from users order by age; --查询users表中记录,并以年龄降序排序 select * from users order by age desc;
-
多个条件
注意:多个排序条件时,只有当第一个排序条件值一样,才会执行第二个排序条件,以此类推
--查询users表中记录,并体育成绩降序,年龄降序 select * from users order by PE desc, age desc;
8. 聚合函数
-
计算和(sum)
select sum(字段) (as sumvalue) from 表名;
-
计算最大值(max)
select max(字段) (as maxvalue) from 表名;
-
计算最小值(min)
select min(字段) (as minvalue) from 表名;
-
计算平均值(avg)
select avg(字段) (as avgvalue) from 表名;
-
计算个数(count)
select count(字段)(as totalcout) from 表名;
9. 分组查询(group by)
--查询users表中的记录,按照性别分组,查询男,女的体育成绩平均分
select gender,avg(PE) from users group by gender;
--查询users表中的记录,按照性别分组,分别查询男、女的体育成绩平均分,人数
select gender,avg(PE),count(id) from users group by gender;
--查询users表中的记录, 按照性别分组,分别查询男、女的体育成绩平均分,人数 要求:分数低于60分的人,不参与分组
select gender,avg(PE),count(id) from users where PE>60 group by gender;
--查询users表中的记录,按照性别分组,分别查询男、女的体育成绩平均分,人数 要求:分数低于60分的人,不参与分组,分组之后,人数要大于2个人
select gender,avg(PE),count(id) from users where PE>60 group by gender having count(id)>2;
10. 分页查询(limit)
注意:第一条记录的索引是0
--查询users表中的前10行条记录
select * from users limit 10;
--查询users表中第2~11条记录 (从第2条记录开始累加10条记录)
select * from users limit 1,10;
--查询users表中第5~17条记录 (从第5条记录开始累加13条记录)
select * from users limit 4,16;
11. 内连接查询
如果查询数据的来源来自多张表,则必须对这些表进行连接查询,连接是把不同表的记录连到一起的最普遍的方法,通过连接查询可将多个表作为一个表进行处理,连接查询分为内连接和外连接
语法格式
--语法1 (隐式内连接)
select 字段1,字段2...
from 表1,表2...
where 过滤条件;
--语法2 (显式内连接)
select 字段1,字段2...
from 表1 inner join 表2 ...
on 过滤条件;
e.g 有两张表:user表和city表
user表:
id | name |
---|---|
001 | 小红 |
002 | 小蓝 |
003 | 小白 |
004 | 小黄 |
005 | 小绿 |
006 | 小青 |
city表:
id | address |
---|---|
001 | 深圳 |
002 | 广州 |
003 | 北京 |
004 | 上海 |
005 | 汕头 |
006 | 潮州 |
007 | 揭阳 |
重合的部分就叫做内连接查询,例如下面过滤条件指的就是当两个表的id相等时才符合连接查询的条件
-
隐式内连接
select user.name,city.address from user,city where user.id = city.id;
结果为:
name address 小红 深圳 小蓝 广州 小白 北京 小黄 上海 效率 汕头 小青 潮州 -
显式内连接
select user.name,city.address from user inner join city on user.id = city.id;
12. 外连接查询
外连接查询分为左外连接查询和右外连接查询
语法
--左外连接
select 字段1,字段2..
from 表1 left outer join 表2 on 过滤条件;
--右外连接
select 字段1,字段2..
from 表1 right outer join 表2 on 过滤条件;
左外连接和右外连接有一点区别:
左外连接:是表1和表2的交集再并上表1的其他数据
右外连接:是表1和表2的交集再并上表2的其他数据
e.g: 上面两张表的左外链接结果
select user.name,city.address
from city left outer join user
on user.id = city.id;
结果为:
name | address |
---|---|
小红 | 深圳 |
小蓝 | 广州 |
小白 | 北京 |
小黄 | 上海 |
效率 | 汕头 |
小青 | 潮州 |
NULL | 揭阳 |
简单点说就是求交集之后并上city的其他数据,没有匹配的为NULL
右外连接结果:
select user.name,city.address
from city right outer join user
on user.id = city.id;
结果为:
name | address |
---|---|
小红 | 深圳 |
小蓝 | 广州 |
小白 | 北京 |
小黄 | 上海 |
效率 | 汕头 |
小青 | 潮州 |
简单点说就是求交集之后并上user的其他数据,没有匹配的为NULL
13. 子查询
当我们进⾏语句查询的时候,总会遇到我们需要的条件需要通过另⼀个查询语句查询出来后才能进⾏,就是说A 查询语句需要依赖B 查询语句的查询结果,B 查询就是⼦查询,A 查询语句就是主查询,⼀个SQL语句可以包含多个⼦查询。
语法
select username
from user
where age =(
select avg(age)
from userInfo
)
例如:要查询工资大于10号部门的平均工资的非10号部门的员工信息
查询10号部门的平均工资
select avg(sal) from emp where deptno = 10;
那么工资大于10号部门的平均工资的非10号部门的员工信息为
select * from emp
where deptno!=10 and sal>(
select avg(sal)
from emp
where deptno = 10;
)
一些子查询的实例
查询在2022年8月9日销售的产品信息
select *
from dbo.product
where pno in (
select pno from dbo.prd
where odate = '2022/'
)
更多推荐
所有评论(0)