mysql学习05(DQL)

mysql学习05

  • DQL查询语句(最重点)

    • DQL:数据查询语言;

    • 所有的查询操作都用它, select

    • 简单的查询,复杂的查询它都能查

    • 数据库中最核心的语言,最最重要的语言

    • 数据库的设计范式

 

  • SELECT语法

    --语法:
    select [all | distinct]
    {* |table.* | [table.field1][as alias1]...}
    from table_name [as table_alias]
    [left | right | inner join table_name2] --联合查询
    [where...] --指定结果需满足的条件
    [group by ...] --指定结果按照哪几个字段来分组
    [having] --过滤分组的记录必须满足的次要条件
    [order by...] --指定查询记录按照一个或多个条件排序
    [limit {[offset,]row_count | row_countOFFSET offset}]; --指定查询的记录从哪条到哪条

     

  • 指定查询字段:基本查询及别名使用

    --语法:
    select 字段 from 表 ;

    --查询全部学生
    select * from student;

    --查询指定字段
    SELECT `gradeId`,`gradeName` FROM grade ;

    --别名:给结果起一个名字 AS ; 可以给字段起别名,也可以给表起别名
    SELECT `gradeId` AS 年级号, `gradeName` AS 年级名称 FROM grade ;

    -- 函数:Concat(a,b) :拼接字符串
    SELECT CONCAT('我的:',`gradeName`) AS 新名字 FROM grade ;

     

  • 去重及数据库的表达式:

    --去重:distinct
    --作用:去除select查询出来的结果中重复的数据,只显示一条;
    SELECT DISTINCT `gradeName` FROM grade ;


    SELECT VERSION();-- 查询系统版本(函数)
    SELECT 100*3-1 AS result ;-- 用来计算(表达式)
    SELECT @@auto_increment_increment ;-- 查询自增的步长(变量)

    --数据库中的表达式:文本的值,列,Null,函数,计算表达式,系统变量

    select '表达式' from 表 ;

     

  • where子句之逻辑运算符:

    • 作用:检索数据中符合条件的值;

    • 搜索的条件由一个或多个表达式组成!结果都是布尔值!

    --

    逻辑运算符:

    • 推荐使用英文字母;

    运算符语法描述
    and && A and B a&&b 逻辑与:2个都为真,结果为真
    or || a or b a|| b 逻辑或:一个为真,则结果为真
    not ! not a !a 逻辑非:取反,真为假

 

  • 模糊查询:

    • 比较运算符;

    • like语法中:%表示通配符;_表示一个字符;

    • in是精确匹配;具体的一个或者多个值;

     

    运算符语法描述
    IS NULL a is null 如果操作符为null,则结果为真
    IS NOT NULL a is not null 如果操作符不为 null,则结果为真
    BETWEEN a between b and c 若a在b和c之间,则结果为真
    LIKE a like b SQL匹配,如果a匹配b,则结果为真
    IN a in (a1,a2,a3) 假设a在a1,或者a2....其中的某一个值中,则结果为真

 

  • 联表查询,Join On详解:数据库的设计范式

    • join:对比

     

     

    • 语法:

      -- join(连接的表) on(on 判断的条件): 连接查询  
      -- where : 等值查询

      /* 思路:
      1,分析需求,分析查询的字段来自哪些表;(连接查询)
      2,确定使用哪种连接查询;7种
      3,确定一个交叉点(这2个表中哪个数据是相同的)
      4,判断的条件:学生表中的studentNo=成绩表中的studentNo
      */
      -- inner join
      SELECT s.studentNo,studentName,SubjectNo,StudentResult
      FROM student AS s
      INNER JOIN result AS r
      WHERE s.`studentno`=r.`studentno`

      -- right join
      SELECT s.studentNo,studentName,SubjectNo,StudentResult
      FROM student s
      RIGHT JOIN result r
      ON s.`studentno`=r.`studentno`

      -- Left join
      SELECT s.studentNo,studentName,SubjectNo,StudentResult
      FROM student s
      LEFT JOIN result r
      ON s.`studentno`=r.`studentno`

      -- 查询缺考的同学
      SELECT s.studentNo,studentName,SubjectNo,StudentResult
      FROM student s
      LEFT JOIN result r
      ON s.`studentno`=r.`studentno` WHERE result IS NULL


      -- 思考题:查询了参加考试的同学信息:学号,学生姓名,科目名,分数

      /* 思路:
      1,分析需求,分析查询的字段来自哪些表;student,result,subject(连接查询)
      2,确定使用哪种连接查询;7种
      3,确定一个交叉点(这2个表中哪个数据是相同的)
      4,判断的条件:学生表中的studentNo=成绩表中的studentNo
      */

      SELECT s.studentNo,studentName,subjectName,studentresult
      FROM student s
      RIGHT JOIN result r
      ON r.`studentno`=s.`studentno`
      INNER JOIN `subject` sub
      ON r.`subjectno`=sub.`subjectno`

      -- 我要查询哪些数据 select ...
      -- 从哪几个表中查 from 表 XXX Join 连接的表 on 交叉条件
      -- 假设存在一种多张表查询,慢慢来,先查询2张表然后再慢慢增加
    • 操作描述
      inner join 如果表中至少有一个匹配,则返回行
      Left join 会从左表中返回所有的值,即使右边没有匹配;
      right join 会从右表中返回所有的值,即使左边没有匹配;

 

 

  • 自连接及联表查询练习:

    • 自连接:

      • 自己的表和自己的表连接,核心:一张表拆为2张一样的表即可;

    • 父类表:

      • categoryidcategoryname
        2 信息技术
        3 软件开发
        5 美术设计
           
    • 子类表:

      • pid categoryidcategoryname
        3 4 数据库
        2 8 办公信息
        3 6 web开发
        5 7 PS技术
    • 操作:查询父类对应的子类关系

      • 父类子类
        信息技术 办公信息
        软件开发 数据库
        软件开发 web开发
        美术设计 ps技术
    • SQL实现:

      -- 自连接实现:核心也是数据库连接

      SELECT a.`categoryname` AS '父目录',b.`categoryname` AS '子目录'
      FROM `category` a, `category` b
      WHERE a.`categoryid`=b.`pid`;

 

 

  • 分页和排序:

    • 排序:order by:升序ASC,降序DESC

      --语法:
      -- order by 通过哪个字段排序 怎么排
      SELECT * FROM student s ORDER BY s.`studentno` DESC;
    • 分页:limit:

      -- 分页:
      -- 为什么要分页:1,缓解数据库压力;2,给人的体验更好;3,瀑布流(一般图片才会使用)

      -- 查询成绩表,每页只显示2条
      -- 语法:limit 起始值,页面的大小 ; (limit 0,2 从第0页开始,每页2行)
      -- limit 0,2 : 1-2
      -- limit 1,2 : 2-3
      -- limit 3,2 : 4-5


      SELECT * FROM result ;
      SELECT * FROM result
      LIMIT 3,2 ;


      --第一页:limit 0,5 (1-1)*5
      --第二页:limit 5,5 (2-1)*5
      --第三页:limit 10,5 (3-1)*5
      --第n页: limit (n-1)*5,5   (n-1)*5   (n-1)*pageSize,pageSize

      --规律:
      --【pageSize:页面大小】
      --【(n-1)*pageSize:起始值】
      --【n代表当前页】
      --【数据总数/页面大小:总页数】

       

       

  • 子查询和嵌套查询:

    • where(这个值是计算出来的)

    • 本质:在where语句中,嵌套一个子查询语句;

 

 

 

 

 

posted @   gzs1024  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示