MySQL查询进阶相关sql语句

2022-11-15 21:08:06 浏览数 (2)

条件查询

使用where子句对表中的数据筛选,结果为true的记录会出现在结果集中

比较运算符

代码语言:javascript复制
select * from students where age = 18;     -- =
select * from students where age > 18;     -- >
select * from students where age < 18;     -- <
select * from students where age >= 18;    -- >=
select * from students where age <= 18;    -- <=
-- 不等于有两种写法: !=  或 <>
select * from students where age != 18;    -- !=
select * from students where age <> 18;    -- <>

逻辑运算符

代码语言:javascript复制
-- and
-- 18岁到28岁之间
select * from students where age > 18 and age < 28;  
-- 18岁以上的女性
select * from students where age > 18 and gender = "女"; 

-- or
-- 18岁以上或者身高超过180(包含)
select * from students where age > 18 or height >= 180;    

-- not
-- 不在 18岁以上的女性 这个范围内的信息
select * from students where not (age > 18 and gender = "女");   
-- 不是小于或者等于18岁的女性
select * from students where (not age <= 18) and gender = "女";

模糊查询

代码语言:javascript复制
-- like 
-- % 替换1个或者多个
-- _ 替换1个
-- 查询姓名中以"小"开始的名字
select name from students where name like "小%";

-- 查询姓名中有"小"的名字
select name from students where name like "%小%";

-- 查询有2个字的名字
select name from students where name like "__";

-- 查询有3个字的名字
select name from students where name like "___";

-- 查询至少有2个字的名字
select name from students where name like "__%";	


-- rlike 正则
-- 查询以"周"开始的名字
select name from students where name rlike "^周.*";

-- 查询以"周"开始, "伦"结尾的名字
select name from students where name rlike "^周.*伦$";

范围查询

代码语言:javascript复制
-- in (12, 18, 34)  表示在一个集合内
-- 查询年龄为12, 18, 34的信息
select name, age from students where age = 18 or age = 34 or age = 12;
select name, age from students where age in (12, 18, 34);

-- not in  表示不在一个集合内
-- 查询年龄不是12, 18, 34的信息
select name,age from students where age not in (12, 18, 34);

-- between ... and .. .表示在一个连续的范围内
-- 查询年龄在18到34之间的的信息
select name, age from students where age between 18 and 34;

-- not between ... and ...表示不在一个连续的范围内
-- 查询年龄不在在18到34之间的的信息
select * from students where age not between 18 and 34;

空判断

代码语言:javascript复制
-- is null  判空
-- 查询身高为空的信息
select * from students where height is null;

-- is not null  判非空
-- 查询身高不为空的信息
select * from students where height is not null;

排序

为了便于数据的显示,可以使用order by对数据进行排序

代码语言:javascript复制
-- order by asc 或 order by desc
-- asc: 升序
-- desc: 降序


-- 查询年龄在18到34岁之间的男性,按照年龄从小到到排序    
select * from students where (age between 18 and 34) and gender = "男" order by age asc;
-- asc可省略, 默认下升序
select * from students where (age between 18 and 34) and gender = "男" order by age;

-- 查询年龄在18到34岁之间的女性,身高从高到矮排序
select * from students where (age between 18 and 34) and gender = "女" order by height desc;


-- order by 多个字段
-- 按照字段1进行排序,如果某些行字段1的值相同时,则按照字段2排序,以此类推...
-- select * from 表名 order by 字段1 asc | desc [, 字段2 asc | desc, ...]
-- 查询年龄在18到34岁之间的女性,身高从高到矮排序, 如果身高相同的情况下按照年龄从小到大排序
select * from students where (age between 18 and 34) and gender = "女" order by height desc, id desc;

-- 查询年龄在18到34岁之间的女性,身高从高到矮排序, 如果身高相同的情况下按照年龄从小到大排序, 
-- 如果年龄也相同那么按照id从大到小排序
select * from students where (age between 18 and 34) and gender = "女" order by height desc, age asc, id desc;
 
-- 按照年龄从小到大, 身高从高到矮的排序
select * from students order by age asc, height desc;

聚合函数

利用聚合函数可以统计数据. 一般情况下, 与分组结合使用, 单独使用没有意义

代码语言:javascript复制
-- 总数 count(*)  括号中写信号或者字段名, 最终计算结果相同, 都是统计的查询后结果的行数
-- 查询学生总数
select count(*) from students;

-- 最大值 max(字段名)  求此字段的最大值
-- 查询女生的编号最大值
select max(id) from students where gender = "女";

-- 最小值 min(字段名)  求此字段的最小值
-- 查询未删除的学生最小编号
select min(id) from students where is_delete = 0;

-- 求和 sum(字段名)  求此字段值的总和
-- 查询男生的总年龄
select sum(age) from students where gender = "男";

-- 平均值 avg(字段名)  求此字段值的平均值
-- 查询未删除女生的编号平均值
select avg(id) from students where is_delete = 0 and gender = "女";
select sum(id) / count(*) from students where is_delete = 0 and gender = "女";

-- 四舍五入保留小数点n位 round(123.23, 1)   保留1位小数
-- 计算所有学生的平均年龄,保留2位小数
select round(sum(age) / count(*), 2) from students;

分组

使用group by将数据按照某个字段进行分组

代码语言:javascript复制
-- 按照性别分组, 查询所有的性别
select gender from students group by gender;

-- 计算每种性别中的人数
select gender, count(*) from students group by gender;

-- 计算男性的人数
select gender, count(*) from students where gender = "男" group by gender;


-- group by   group_concat()
-- group_concat(字段名)会作为一个字段输出, 用来显示每一组的某字段的值的集合
-- 查询同种性别中的名字
select gender, group_concat(name, " ", age, " ", id) from students group by gender; 

-- group by   having
-- having 条件表达式: 在分组查询后用特定的条件筛选出符合条件的分组
-- having作用和where一样, 但having只能用于group by, 且放在group by之后
-- 查询平均年龄超过30岁的分组, 显示其性别和该性别中所有名字
select gender, group_concat(name), avg(age) from students group by gender having avg(age) > 30;

-- 查询每种性别中的人数多于2个的信息
select gender, group_concat(name) from students group by gender having count(*) > 2;

分页

但数据量过大时, 用limit对显示结果进行分组

代码语言:javascript复制
-- limit start, count
-- 限制查询出来的数据个数   limit 2 显示查询后的前两条, 等价于 limit 0, 2
select * from students where gender = "男" limit 2;

-- 查询前5个数据
select * from students limit 0, 5;

-- 查询第6 - 10的数据
select * from students limit 5, 5;

-- 每页显示2个,显示第6页的信息, 按照年龄从小到大排序
-- limit (第n页 - 1) * 每页的个数, 每页的个数
-- 但注意limit不支持表达式, 即这样的 limit 2 * (6-1), 2 是错误的表达式
select * from students order by age asc limit 10, 2;

连接查询

当查询结果的字段来源于多张表时,可以将多张表连接成一个大的数据集,再选择合适的字段返回

代码语言:javascript复制
-- 内连接查询  inner join ... on
-- 使用内连接查询班级表与学生表  
select * from students inner join classes on students.cls_id = classes.id;

-- 左连接查询  left join ... on
-- 使用左连接查询班级表与学生表
select * from students as s left join classes as c on s.cls_id = c.id;

-- 右连接查询  right join ... on
-- 使用右连接查询班级表与学生password表
select * from students as s right join classes as c on s.cls_id = c.id;

  • 内连接查询:查询的结果为两个表匹配到的数据
  • 左连接查询:查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充
  • 右连接查询:查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充

自关联

当前有中国省市区镇的数据库表areas, 表结构如下

title为当前地名, pid为它的上一级的地名的id

id

title

pid

1

浙江省

NULL

2

台州市

1

3

临海市

2

这就是自关联,表中的某一字段,关联了这个表中的另外一字段,但是它们的业务逻辑含义是不一样的,城市信息的pid引用的是省信息的id

代码语言:javascript复制
-- 查询省的名称为“浙江省”的所有城市
select c.* from areas as c inner join areas as p on c.pid = p.id where p.title = '浙江省';

-- 查询市的名称为“台州市”的所有区县
select dis.* from areas as dis inner join areas as c on c.id = dis.pid where c.title = '台州市';

子查询

在一个select语句中嵌入另一个select语句, 那么被嵌入的select语句称之为子查询语句, 而最外层的select语句称之为主查询语句

代码语言:javascript复制
-- 标量子查询: 子查询返回的结果是一个数据(一行一列)
-- 查询大于平均年龄的学生              (先查询平均年龄)
select * from students where age > (select avg(age) from students);

-- 列级子查询: 子查询返回的结果是一列(一列多行)
-- 查询还有学生在班的所有班级名字         (先在学生表中查找所有班级, 返回的是一列多行的班级id)
select name from classes where id in (select cls_id from students);

-- 行级子查询: 子查询返回的结果是一行(一行多列)
-- 查找班级年龄最大,身高最高的学生               (先查询最大的年龄和最高的身高, 返回的是一行两列: 身高, 年龄)
select * from students where (height, age) = (select max(height), max(age) from students);

本文作者: Ifan Tsai  (菜菜)

本文链接: https://cloud.tencent.com/developer/article/2164564

版权声明: 本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!

0 人点赞