mysql复杂查询
Posted 咱们码码人儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql复杂查询相关的知识,希望对你有一定的参考价值。
简单函数(case...when...then)
基本语法
case 列名
when 值 then 结果
when 值 then 结果
else default
end as 别名
示例
select 员工编号,姓名,
case 性别
when -1 then '女'
when 0 then '男'
else '不男不女'
end as 性别,
case 婚姻状况
when -1 then '未婚'
when 0 then '已婚'
else '不知道'
end as '是否结婚'
from 员工
搜索函数
基本语法
case 列名
when 条件范围 then 结果
when 条件范围 then 结果
and 条件范围 结果
else 结果
end as 别名
from 表名
使用order by排序
asc表示升序 desc表示降序
基本语法
order by 列名 排序关键字
order by 可以使用别名进行排序
limit 关键字
limit 找出前几个
limit 添加两个参数,跳过多少个要取出多少个
select * from tablename limit (page-1)*pageSize,pageSize
分组函数group by
通常添加having过滤条件
select 性别,部门 count(*) from 员工 group by 部门 having 性别 ='女'
cast函数 类型转换
多表连接查询
基本语法
select 字段列表 from 表1 inner||left right join 表2 on 表1.字段=表2.字段
select 字段列名 from 表1,表2 where 表1.字段=表2.字段
内连接查询
select 字段列名 from 表1,表2 where 表1.字段=表2.字段(可用)
外连接查询
select 字段列名 from 表1 inner||left || right join 表2 on 表1.字段=表2.字段(必用)
只有一个有
selecr 字段列名 from 表1 left join 表2 on 表1.字段名 = 表2.字段名 where 表2.字段名 is null;
全连接
select 字段列名 from 表1 full outer join 表2 on 表1.字段名 = 表2.字段名;
各自独有
select 字段列名 from 表1 full outer join 表2 on 表1.字段名 = 表2.字段名 where 表1 is null or 表2.字段名 is null;
示例
#查询出订货主档的相关订单信息(显示,订单号码、客户编号,公司名称,订单日期)提示:需要用到与 客户 之间 内联接查询(两种方法)
select a.订单号码,a.客户编号,b.公司名称,a.订单日期 from 订货主档 a inner join 客户 b on a.客户编号=b.客户编号;
select a.订单号码,a.客户编号,b.公司名称,a.订单日期 from 订货主档 a,客户 b where a.客户编号=b.客户编号;
带all的子查询
select 类名 from 表名 where a>all(... and ...)
带some的子查询
select 类名 from 表名 where a> some(... or ...)
示例
#查询至少选修了王明所选修的所有课程的学生
select * from 学生 where 姓名!='王明' and 学生号 in(select 学生号 from 选课 where 课程号 in (select 课程号 from 选课,学生 where 选课.学生号=学生.学生号 and 姓名='王明') group by 学生号 having count(*)=(select count(*) from 选课,学生 where 选课.学生号=学生.学生号 and 姓名='王明'));
union 过滤重复值
基本语法
[ ]
union
[ ]
[ ]
union all
[ ]
行列转换
select 列名1 from 表名
union select 列名2 from 表名
union select 列名 from 表名
group by 列名;
使用正则表达式查询
基本语法
字段名 regexp '匹配方式'
“属性名”表示需要查询的字段名称;“匹配方式”表示以哪种方式来匹配查询。“匹配方式”中有很多的模式匹配字符,它们分别表示不同的意思。下表列出了 REGEXP 操作符中常用的匹配方式。
字符^
用来匹配以特定字符或字符串开头的记录。
select 列名 from 表名 where 类名 regexp '^j';
字符$
用来匹配以特定字符或字符串结尾的记录。
select 列名 from 表名 where 类名 regexp 'y$';
字符.
用来替代字符串中的任意一个字符。
select 列名 from 表名 where 类名 regexp 'a.y';
字符*
和+
都可以匹配多个该符号之前的字符。不同的是,+
表示至少一个字符,而*
可以表示 0 个字符。
select 列名 from 表名 where 类名 regexp '^Th*';
正则表达式可以匹配字符串。当表中的记录包含这个字符串时,就可以将该记录查询出来。指定多个字符串时,需要用|
隔开。只要匹配这些字符串中的任意一个即可。
select 列名 from 表名 where 类名 regexp 'an'
使用方括号[ ]
可以将需要查询的字符组成一个字符集合。只要记录中包含方括号中的任意字符,该记录就会被查询出来。例如,通过“[abc]”可以查询包含 a、b 和 c 等 3 个字母中任意一个的记录。
select 列名 from 表名 where 类名 regexp '[io]';
[^字符集合]
用来匹配不在指定集合中的任何字符。
select 列名 from 表名 where 类名 regexp '[a-t]'
字符串{n,}
表示字符串连续出现 n 次;字符串{n,m}
表示字符串连续出现至少 n 次,最多 m 次。
select 列名 from 表名 where 类名 regexp 'e(2,)'
以上是关于mysql复杂查询的主要内容,如果未能解决你的问题,请参考以下文章