mysql复杂查询

Posted 咱们码码人儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql复杂查询相关的知识,希望对你有一定的参考价值。

简单函数(case...when...then)

基本语法

 case 列名  whenthen 结果  whenthen 结果 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 字段列表 from1 inner||left right join2 on1.字段=表2.字段  select 字段列名 from1,表2 where1.字段=表2.字段

内连接查询

 select 字段列名 from1,表2 where1.字段=表2.字段(可用)

外连接查询

 select 字段列名 from1 inner||left || right join2 on1.字段=表2.字段(必用)

只有一个有

selecr 字段列名 from1 left join2 on1.字段名 = 表2.字段名 where2.字段名 is null;

全连接

 select 字段列名 from1 full outer join2 on1.字段名 = 表2.字段名;

各自独有

 select 字段列名 from1 full outer join2 on1.字段名 = 表2.字段名 where1 is null or2.字段名 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 过滤重复值

基本语法

 [sql语句1] union  [sql语句2]  [sql语句1] union all [sql语句2]

行列转换

 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复杂查询的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的算法复杂度

关于代码片段的时间复杂度

代码片段使用复杂的 JavaScript 在 UIWebView 中插入 HTML?

以下代码片段的时间复杂度是多少?

四十道MYSQL复杂查询练习题(难度较低)

mysql复杂查询