DQL 查询

本文详细介绍了SQL中的DDL(数据库定义语言)、DML(数据库操作语言)、DCL(数据库控制语言)和DQL(数据库查询语言)。内容包括基本的CRUD操作、查询条件、分组聚合、排序以及各种单行和多行函数的使用。此外,还探讨了日期和字符串的处理、空值处理、加密算法以及数据分组和过滤。对于SQL初学者和进阶者,都是很好的学习资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL

DDL

  • 数据库定义语言(定义数组库的一些组件:表, 索引…)

DML

  • 数据库操作语言(增、删、改、查)CRUD

DCL

  • 数据库控制语言(权限 用户管理…)

DQL

  • 数据库查询语言

  • 格式 :

    • select 列名*N from 表名 where 查询条件1 and/or 查询条件2 group by 列 Having 分组条件 Order by 排序;

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ojTNHOTQ-1621047010831)(C:\Users\李嘉睿\Desktop\image-20210513221212318.png)]

    • 规则

      1. sql在书写的时候除了查询条件之外,大小写都可以

        • 保持大小写风格。

        • select * from user where uname = ‘ 25 ’ ;

        • SELECT * FROM USER WHERE UNAME = ‘ 25 ’ ;

          [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xerjLMPw-1621047010838)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210513221703222.png)]

      2. **–**属于SQL语言的注释[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qCQrWBZ1-1621047010844)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210513222030624.png)]

      3. 所有查询条件为字符串时,需要用**’’**修饰,否则就会当作列名去处理。

DQL之查询列和别名
  1. 同时查询两个列,可之间用逗号将列名连接。 (*t通配符, 默认查询所有的列)

    eg:select 列名1 列名2 from 表名 ;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r3Q2eruT-1621047010847)(C:\Users\李嘉睿\Desktop\image-20210514142106021.png)]

  1. 取别名只需要在原列名后面加上想要取的别名。(可以直接加,也可以用单引号或双引号阔上)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EVriO27X-1621047010850)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210514142429991.png)]

  1. 在列名上加减乘除后, 表里就会自动运算。

    eg:select ename, (sal + conm) * 12 年薪 from emp

  2. CONCAT(… , … , …)把列可以连接起来( … 也能是字符串)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xS0A8BSY-1621047010851)(C:\Users\李嘉睿\Desktop\image-20210514145304757.png)]

  3. 按条件查询指定的列。

    • 普通条件查询:

      = ,而不是 == ,(同理= 也可换为 > < >= <= !=(可用<>表示) between a and b(查询的x范围是 a<= x <= b)

      eg:查empno 为 7844的。

      select * from emp where empno = 7844;

      select * from emp where job = ‘ SALESMAN ’;

      当查询条件为字符串一定要加单引号, 不然会认为是列名

    • in在某个范围内查找 :

      select * from 列名 where 条件列名 in/ not in(… , … , … ) 表示在这/不在范围里的

      eg:select * from emp where empno not in (7499, 7566, 8888);

    • null值查询:

      -- 查询不发津贴的员工信息
      select * from emp where comm is null;
      -- 查询发放津贴的员工信息
      select * from emp where comm is not null; 
      
    • 模糊查询 % _

      1. %可以代替任意字符里的任意字数(也可以代表0个字数)
      --名字里最后一个字为N的员工信息
      select * from emp where ename like '%N'
      --名字里第一个字为M的员工信息
      select * from emp where ename like 'M%'
      --名字中含有M的员工信息
      select * from emp where ename like '%M%'
      
        2.  **_ 代表任意字符的一次**  。
      
    --名字中第二个字为M的员工信息
    select * from emp where ename like '_M%'
    --
    

    ​ 3. 查询信息含有%或者_ 的情况下, 需要加转义字符 ’ \ ‘

    eg:

    --查询名字中含有%的员工信息
    select * from emp where ename like '%\%%'
    
        	4. 如果查询第188个字符是A,这需要一些特殊手段 -》函数。
    
    • 多条件联合查询 and or

      • or 或者 and 必须

        --名字为smith    并且    工资7900的员工信息
        select * from emp where ename =  'smith' and empno = 7900;
        --名字为smith    或者    工资7900的员工信息
        select * from emp where ename =  'smith' or empno = 7900;
        
select 查询结果排序 order by
  • 使用 asc 是升序排列(默认), 使用 desc 可以降序排列

  • 单列

    • --按照薪资排序(默认升序)
      select * from emp order by sal;
      --按照薪资排序(降序)
      select * from emp order by sal desc;
      --按照薪资排序(升序)
      select * from emp order by sal asc;
      --null排在最前面
      
  • 多列

    --多个排序的列
    select * from emp order by deptno, sal; 
    --多个排序的列(有升序, 有降序)
    select * from emp order by deptno, sal desc; 
    
  • 分页 limit N (每次查询前N行)

    -- 查询前4行
    select * from emp limit 4
    --查询第N页, 每页显示M个
    select * from emp limit (n-1)*M, M;
    --查询薪资大于1000且逆序排列的前五条员工信息
    select * from emp where sal > 1000 order by sal desc limit 0, 5;
    

单行函数

  • 单行函数

    • 指的是一行数据返回一行数据,操作10行数据返回世行数据。

    • 字符串函数

      • 长度 : length(列名)

        -- ename 和  ename 的长度
        select  ename, length(ename)  from  emp;
        
      • 截取: SUBSTR(列名, … , …)

        • -- 员工的名字 和  员工名字第一个到第三个字符
          select  ename , SUBSTR(ename, 13) from emp;
          -- 名字中第五个字符为s的员工信息
          select * from emp where subst(ename,  5,  1 )   =   's'; 
          
      • 大小写 : upper(列名) 、 lower(列名)

        • select ename, upper(ename), lower(ename) from emp;
          
      • 拼接: concat(列名, ’ …‘ , 列名 )

        • select concat(empno, '=', ename)  from emp;
          
      • 替换: replace (列名, ’ 字符a‘, ’字符b‘) 把字符a换成字符b

        • select ename, replace(ename, 'T', '--') from emp
          

          [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tfzD37fb-1621047010853)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210514221256942.png)]

          || 可以连接函数和字符串,字符串和字符串, …。

    • 数值类型函数

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B8Ulpp3V-1621047010854)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210514222008435.png)]
    • 日期函数

      • 获取当前系统时间 : sysdate(), current_date() , current_time()

        • --获取hiredate列和 当前系统时间。
          select hiredate, sysdate(), from emp;
          --获取hiredate列和 当前会话时区的 日期、时间、日期和时间。
          select hiredate,current_date(), current_time(), current_timestamp() from emp;
          
      • 日期转换 : date_format(sysdate(), …)

        --以%Y-%m-%d  %H:%i:%s的形式表示当前时间
        select date_format(sysdate(), '%Y-%m-%d  %H:%i:%s');
        

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZKdGL3u-1621047010856)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210514223307608.png)]

      • 分别获取 年月日 时分秒 星期 extract(… from sysdate());

        • --获取当前时间中的分钟
          select extract(minute from sysdate());
          -- minute 可换成
          second
          minute
          hour
          day
          week
          month
          year
          
      • 日期的加减操作: adddate(… , …)

        • --获取hiredata, 在hiredate上再加九天
          select hiredate, adddate(hiredate, 9) from emp;
          --获取hiredata, 在hiredate上再减九天
          select hiredate, adddate(hiredate, -9) from emp;
          select date('2012-11-11');
          

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WIxQh070-1621047010857)(C:\Users\李嘉睿\AppData\Roaming\Typora\typora-user-images\image-20210514222057254.png)]

    • 其他函数

      • 空值的处理 ifnull(列名, 想要被当作的数字)

        • ifnull(exp1, exp2) exp1 != null ? exp1 : exp2;
          --comm中有0的话,当作888去运算。
          select ifnull(comm, 888) from emp;
          
      • 加密算法 md5("…") 不可逆加密

        ​ 可逆加密:

        ​ AES_ENCRYPT(‘加密字符串’,KEY);

        ​ AES_DECRYPT(‘解密字符串’,KEY);

        • --将字符串123456加密
          select MD5('123456');
          --将123456加密,密码为shsxt,将加密后码再次加密。
          select aes_encrypt('123456', 'shsxt'), aes_encrypt(aes_encrypt('123456', 'shsxt'), 'shsxt');
          
    • 转换函数

      • 日期 —> 字符串 : date_format(日期, '‘字符串’‘);

        date_format(date, expr);
        --当前日期转换成字符串
        select date_format(sysdate(); '%Y-%c-%d %H:%i:%s');
        
      • 字符串 ----> 日期 : str_to_date(‘字符串’, 日期);

        • 要注意字符串和格式的匹配。
        select str_to_date('2020-4-16 17:15:24', '%Y-%c-%d %H-%i-%s');
        
      • 数字 ----> 字符串

        • 直接拼接一个字符串即可,可以自动转换
      • 字符串 -----> 数字

        • 依靠函数提供的参数
          请添加图片描述

多行函数

  • 常见的五个多行函数

    • max 最大值

      • 如果处理的值是字符串,将会把值按照字典序排序。
    • min 最小值

      • 如果处理的是字符串,将会把值按照字典序排序。
    • avg 平均值

      • 只能用于数值型数据,求平均值
    • sum 求和

      • 如果求和的过程中有null,不会计算在内。
    • count 求总数

      • 如果数据中有null,不会计算在内。
    • --标准的答案
      select max(sal), min(sal), sum(sal), avg(sal), count(sal) from emp;
      --经典错误
      
      --查询公司最低薪资的员工是谁?
      select min(sal), ename from emp;
      --呈现的是最低薪资和第一个人的名字。
      -- mysql语法不报错,oracle报错。
      
    • 工作时不要将普通列和组函数写在一起

      • 虽然mysql语法不会报错,但是给的结果是错误的。

数据分组 : group by

  • 按照某一个条件进行分组,每一组返回对应的结果。

  • group by可以对指定的列进行分组。

  • --工资最高的工作
    select job, max(sal) from emp group by job;
    select deptno, min(sal) from emp group by deptno;
    select deptno, avg(sal) from emp where sal < 3000 group by deptno order by deptno; 
    --查询那个部门每个月的津贴总数超过1000
    select deptno,, sum(comm) from emp where is not null group by deptno having sum(comm) > 1000;
    --查询每个部门中名字含有A的平均薪资
    select deptno, avg(sal) from emp where ename like '%A%' group by deptno; 
    --查询10,20部门中,并且在二月份入入职员工中,每个部门中平均薪资高于1500的 工作是什么,并按照部门,工作平均薪资进行排序。
    select deptno, job,  avg(sal) from emp where deptno in(10, 20) and extract(month from hiredate) = 2 group by deptno, job having avg(sal) > 1500 order by deptno, avg(sal);
    
  • having : 对分组后的数据进行过来,所以能出现在having中的比较项一定是被分组的列或者是组函数

    eg: having avg(sal) >1800;

  • 底层

    • where : 行级过滤 , 处理的是表中每一行数据的过滤。 eg:where sal < 3000;
    • having:组级过滤, 处理的是分组后的每一组数据。
    • 能使用where的,尽量不要使用having。
  • List item
    请添加图片描述
    请添加图片描述
    请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值