一、单表查询
1、查询所有列
SELECT * FROM 表名;
2、查询指定列
SELECT 列名1, 列名2,……, 列名n FROM 表名;
3、WHERE 条件查询
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字: =、!=、<、>、>=、
<> 不等于
BETWEEN 开始值 AND 临界值(范围);(:1.开始值<结束值 2.包含临界值的)
IN(数值1,数值2,……,数值n)(包含);
IS NULL(不为空);
AND(且);
OR(或);
NOT(非);
SELECT * FROM 表名 WHERE 条件;
SELECT 列名1, 列名2,……, 列名n FROM 表名 WHERE 条件;
从前有个数据库,库里面有张表
(1)查询学生表中性别为女,并且年龄50以内的记录
select * from stu where gender = 'female' and age < 50;
(2)查询学生表学号为S_1001,或者姓名为liSi的记录
select * from stu where sid = 's_1001' or sname = 'lisi';
(3)查询学生表中学号为S_1001,S_1002,S_1003的记录
select * from stu where sid in('S_1001', 'S_1002', 'S_1003');
(4)查询学生表中学号不是S_1001,S_1002,S_1003的记录
select * from stu where sid not in('S_1001', 'S_1002', 'S_1003');
(5)查询学生表中年龄为null的记录
select * from stu where age is null;
(6) 查询年龄在20到40之间的学生记录
select * from stu where between 20 and 40;
-- 或者
select * form stu where age >= 20 and age <= 40;
(7) 查询性别非男的学生记录
select * from stu where gender != 'male';
-- 或者
select * from stu where gender <> 'male';
-- 或者
select * from stu where not gender = 'male';
(8) 查询姓名不为null的学生记录
select * from stu where sname is not null;
-- 或者
select * from stu where not sname is null;
4、LIKE 模糊查询
模糊查询需要使用关键字LIKE。
通配符:
_(下划线): 任意一个字符
%:任意0~n个字符,
select * from 表名 where 列名 like 查询内容
还是熟悉的学生表
(1)查询姓名由3个字构成的学生记录
-- 三条下划线,每个'_' 表示一个任意字符(字和字母的意思哟)
select * from stu where sname like '___';
(2)查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
select * from stu where sname like '____i';
(3)查询姓名以“z”开头的学生记录
-- '%' 表示任意长度的任意字符
select * from stu where sname like 'z%';
(4)查询姓名中包含“a”字母的学生记录
select * from stu where sname like '%a%';
5、DISTINCT 去除重复记录
select distinct 列名 from 表名;
6、IFNULL 如果列名为null 则转换为转换值
select ifnull(列名, 替换值) from 表名;
7、order by 排序
-- asc 升序
-- desc 降序 默认升序 asc(可以省略不写)
select * from 表名 order by 要排序的列名 asc/desc
-- 表示当列名1的内容相等时按照列名2排序以此类推
select * from 表名 order by 要排序的列名1, 列名2, ……,列名n asc/desc
8、聚合函数
8.1、 COUNT(列名)
统计指定列不为NULL的记录行数;
当需要纵向统计时可以使用COUNT()。
select count(*/列名) from 表名
8.2、SUM(列名) 和
当需要纵向求和时使用sum()函数。
select sum(列名) from 表名;
-- 一个简单的栗子呀
-- 统计所有学生的年纪总和(虽然很离谱) pps :还是上面的那张表哦
select sum(age) from stu;
8.3、 AVG(列名) 平均值
select avg(列名) from 表名;
-- 一个简单的栗子呀
-- 统计所有学生的平均年纪(不太离谱了吧) pps :还是上面的那张表哦
select avg(age) from stu;
8.4、MAX(列名) 最大值
select max(列名) from 表名;
8.5、MIN(列名) 最小值
select min(列名) from 表名;
9、GROUP BY 分组
注意:如果查询语句中有分组操作,则select后面能添加的只能是聚合函数和被分组的列名
select 列名 from 表名 group by 列名;
没错还是这张熟悉的表(稍微有所改动)
(1)查询学生中男女的人数
select gender 性别, count(gender) 人数 from stu group by gender;
10、HAVING 子句
注:having与where的区别:
1.having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
2.having后面可以使用分组函数(统计函数) where后面不可以使用分组函数。
WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分 组;而HAVING是对分组后数据的约束。
select 列名 from 表名 where 条件 group by 列名 having 条件;
11、LIMIT
LIMIT用来限定查询结果的起始行,以及总行数。
limit 开始下标,显示条数;//开始下标---从0开始 ,显示条数--表示默认从0开始获取数据
-- 查询5行记录,起始行从0开始(第一行)
select * from 表名 limit 0,5;
-- 查询10行记录,起始行从3开始(第四行)
select * from 表名 limit 3,10;
12、分页查询
-- pageIndex 页码值 pageSize 每页显示条数
limit (pageindex-1)*pagesize,pagesize;
查询语句书写顺序:select – from- where- groupby- having- order by-limit
查询语句执行顺序:from - where -group by -having - select - order by-limit
13 、合并结果集
-- 只是个栗子,可以有多个列名呦
-- UNION ALL:不去除重复记录
SELECT */列名 FROM 表名 UNION ALL SELECT */列名 FROM 表名;
-- UNION:去除重复记录
SELECT */列名 FROM 表名 UNION SELECT */列名 FROM 表名;
14、join on 内联查询(多表连接)
通俗一点讲:内敛查询就像上面那张图一样,当两张表连接时,中间重合的那一坨黄色就是查询出来的结果
内连接的特点:查询结果必须满足条件。
select 列名
from 表1
inner join 表2
on 表1.列名=表2.列名 //外键列的关系
where.....
注:
表1和表2的顺序可以互换
找两张表的等值关系时,找表示相同含义的列作为等值关系。
点操作符表示的格式: 表名.列名
可以使用as,给表名起别名,注意定义别名之后,统一使用别名
当select查询指定列时如果是与外键关联的列,要使用 表名.列名 的格式(这里的表可以是与外键关联的表也可以是外键当前的表),否则会报错
三表联查
-- 语法
-- 第三张表(或者更多表)连接时要注意连接条件(on后面的)要是与外键关联的表的字段而不是随便任意字段
select 列名 from 表1
inner join 表2 on 表1.列名=表2.列名
inner join 表3 on 表1或表2.列名=表3.列名 where
15、外联查询
15.1、左外联
左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的 显示NULL。
和内联一样的通俗的讲:左外联就是两个表连接时图上绿色的那一坨
select 列名 from 主表 left join 次表 on 主表.列名=次表.列
15.2、右外联
右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。
一起通俗的讲:右外联是两个表连接时图上红色的那一坨
select 列名 from 次表 right join 主表 on 主表.列名=次表.列名
15.3、总结
注意:
1.主表数据全部显示,次表数据匹配显示,能匹配到的显示数据,匹配不成功的显示null
2.主表和次表不能随意调换位置特点:
包括左外连接和右外连接,外连接的特点:查询出的结果存在不满足条件的可能。使用场景:
一般会作为子查询的语句使用
16、自然连接
自然连接(NATURAL INNER JOIN):自然连接是一种特殊的等值连接,他要求两个关系表中进行连 接的必须是相同的属性列(名字相同),无须添加连接条件,并且在结果中消除重复的属性列。.
select * from 表1 join 表2;
17、子查询
一个select语句中包含另一个完整的select语句。
子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么 就是子查询语句了。
子查询出现的位置:
- where后,作为条为被查询的一条件的一部分;
- from后,作表;
当子查询出现在where后作为条件时,还可以使用如下关键字:
- any
- all
子查询结果集的形式:
- 单行单列(用于条件)
- 单行多列(用于条件)
- 多行单列(用于条件)
- 多行多列(用于表)