暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

mysql复杂查询

咱们码码人儿 2021-08-19
882

简单函数(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,)'


                                                        文章转载自咱们码码人儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                        评论