• Sql查询语句


    SELECT * from student,class

            在上一篇博客里我们已经介绍了Sql语句的增删改,以及创建了用来演示增删改的数据库和表,下面我们介绍SQL语句中最重要的查询语句。

    增删改博客链接(Sql语句之增删改查(CRUD)-CSDN博客

    一、基本查询

    1.查询学生的姓名

    select name from student

    2.查询学生姓名和性别

    select name,sex from student

    3.查询学生全部信息

    select * from student

    SELECT是关键字,表示将要执行一个查询,*表示“所有列”,FROM表示将要从哪个表查询

    注意:查询结果也是一个二维表,它包含列名和每一行的数据

    二、条件查询

    运算符

    说明

    =

    等于

    <>或!=

    不等于

    小于

    小于等于

    >

    大于

    >=

    大于等于

    between..and...

    两个值之间

    is null

    为null

    and

    并且

    or

    或者

    in

    包含

    not

    not可以取非,主要用在is或in

    like

    like为模糊查询,支持%或_匹配

    1.查询班级号为 20201001 的学生

    SELECT * FROM student where class_num = '20201001';

    2.查询年龄为20岁的学生

    SELECT name FROM student where age = 20

    3.查询班级号为 20201001 的学生姓名和性别

    需要查询多个字段的时候,字段之间以“,”(逗号)隔开

    SELECT name,sex FROM student where class_num = '20201001';

    4.查询出年龄不是20岁的学生

    SELECT name FROM student where age <> 20 SELECT name FROM student where age != 20

    5.查询出年龄小于21岁的学生

    SELECT * FROM student where age < 21

    6.查询出年龄在21-25岁的学生

    SELECT * FROM student where age between 21 and 25

    7.查询出班级号为空的同学名称

    SELECT * FROM student where class_num is null

    8.查询出班级号为20201001班的男同学

    SELECT * FROM student where class_num = '20201001' and sex = '男'

    9.查询出班级号为20201001班和20201002班的同学

    SELECT * FROM student where class_num in ('20201001','20201002')

    10.查询出查询出用户id为1和3的用户记录

    IN 操作符允许我们在 WHERE 子句中规定多个值。

    select * from student where id in (1,3)

    11.查询出所有姓王的同学 模糊查询 like

    通配符:

    %表示任意多个字符

    _表示单个字符)

    SELECT * FROM student WHERE name like '王%';

    12.查询姓王且名字只有两个字的学生

    SELECT * FROM student WHERE name like '王_';

    13.查询出所有含有张字的同学的名称

    SELECT * FR OM student WHERE name like '%张%';

    三、聚合函数

    sum

    求和

    avg

    取平均

    max

    取最大值

    min

    取最小值

    count

    取得记录数

    1.求学生年龄的总和

    好吧,这个应该没什么实际作用,不过懒得在建新表演示了

    select sum(age) from student;

    2.查询出学生的平均年龄

    select avg(age) from student;

    3.查询出学生的最大年龄

    SELECT max(age) from student

    4.查询所有的学生数量

    SELECT count(*) from student;

    5.查询出班级号不为空的学生数

    SELECT count(class_num) from student

    注意:

    1、count(*)表示取得当前查询表所有记录

    2、count(字段名称),不会统计为null的记录

    四、分组查询:group by

    作用:通过某个或某些字段进行分组,一般配合聚合函数使用

    用法:group by [字段1,字段2……]

     

    1.求每个班的平均年龄

    SELECT avg(age),class_num from student GROUP BY class_num

    2.求每个班各个年龄的人数

    SELECT count(age),class_num,age from student GROUP BY class_num,age

    3.查询出各个班年龄的最大值

    SELECT max(age),class_num from student GROUP BY class_num

    五、排序

    我们使用SELECT查询时,细心的读者可能注意到,查询结果集通常是按照id排序的,也就是根据主键排序。这也是大部分数据库的做法。如果我们要根据其他条件排序怎么办?可以加上ORDER BY子句。

    1.按照年龄升序:

    SELECT * FROM student ORDER BY age;

    如果要反过来,按照年龄降序,我们可以加上DESC

    2.按照年龄降序

    SELECT * FROM student ORDER BY age DESC;

    3.如果想按照年龄降序,并且按照学号升序怎么弄?

    SELECT * FROM student ORDER BY age DESC,sno;

    默认的排序规则是ASC:“升序”,即ORDER BY ageASC和ORDER BY age是相同的。

    4.按照班级升序,若是同班则按照年龄升序

    SELECT * FROM student ORDER BY class_num,age;

             记录会先按照class_num升序排列,若class_num相同则会按照age升序排列,所以字段名越靠左排序优先级越高

    六、分页查询(限制查询)

            使用SELECT查询时,如果结果集数据量很大,比如几万行数据,可是每次前端只能呈现最多20条数据,这样不仅全部查询出来浪费时间,而且还需要进行选取20条的操作,费时费力,我们不妨一次先查询20条,等到前端再次发出请求,比如点击下一页,再查询新的数据,返回给前端,这就是分页查询的sql实现。

            要实现分页功能,实际上就是从结果集中显示第1~20条记录作为第1页,显示第21~40条记录作为第2页,以此类推。因此,分页实际上就是从结果集中“截取”出第M~N条记录。这个查询可以通过LIMIT OFFSET 子句实现。我们先把所有学生按照班级从高到低进行排序:

    现在,我们把结果集分页,每页3条记录。要获取第1页的记录,可以使用LIMIT 3 OFFSET 0:

    SELECT * FROM student LIMIT 3 OFFSET 0;

    上述查询LIMIT 3 OFFSET 0表示,对结果集从0号记录开始,最多取3条。

    注意SQL记录集的索引从0开始。

    如果要查询第2页,那么我们只需要“跳过”头3条记录,也就是对结果集从3号记录开始查询,把OFFSET设定为3:

    SELECT * FROM student LIMIT 3 OFFSET 3;

     

    七、联表查询

            上面的查询均是单表查询,不过我们在开发的时候,肯定不会是所有字段全部在一张表上,而是很多张表,比如教师信息和学生信息几乎没可能出现在一张表上,所以联表查询是肯定会出现的情况。

    1.笛卡尔积

    含义:若两张表进行联表查询的时候没有任何条件限制,最终的查询结果总数是两张表记录的成绩,该现象称为笛卡尔积现象。

    就像这样

    SELECT s.name,c.class_name from student s,class c

    如果想要得到每个学生和其所在的班级名就应该加上限制语句

    WHERE s.class_num = c.class_num

    2.查询每个同学在哪个班 

    1. SELECT s.name,c.class_name
    2. from student s,class c
    3. WHERE s.class_num = c.class_num

     

    上面的写法属于sql92

    缺点:表连接条件与查询条件放在一起,没有分离

    3.SQL99语法

    select xxx from A 表名 join B 表名 on 表的连接条件;

    1. select student.name,class.class_name
    2. from student
    3. join class
    4. on student.class_num = class.class_num;

    优点:表连接独立,结构清晰,如果结果数据不满足要求,可再追加where条件进行过滤;

    4.三种连接方式

    1.内连接

    1. SELECT
    2. student.name,class.class_name
    3. from
    4. student
    5. INNER JOIN
    6. class
    7. on
    8. student.class_num = class.class_num;

    2.左外连接

    包含左边表的全部行(不管右边的表中是否存在与他们匹配的行),以及右边表中全部匹配的行。

    1. SELECT
    2. student.name,class.class_name
    3. from student
    4. LEFT JOIN class on
    5. student.class_num = class.class_num;

    3.右外连接

    包含右边表的全部行(不管右边的表中是否存在与他们匹配的行),以及左边表中全部匹配的行。

    1. SELECT
    2. student.name,class.class_name
    3. from student
    4. RIGHT JOIN class
    5. on student.class_num = class.class_num;

    4.多张表进行表连接得语法格式

    select xxx from A表 join B表 on 连接条件1 join C表 on 连接条件2

    查询出每个学生所选择的课程

    1. SELECT
    2. student.name,course.gradeName
    3. from student
    4. join relationship
    5. on student.sno = relationship.sno
    6. join course
    7. on relationship.cno = course.cno

    八、嵌套查询

            一般在子查询中,程序先运行在嵌套在最内层的语句,再运行外层。因此在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,再一层层往外测试,增加子查询正确率,因为多层的嵌套使语句可读性很低。

    1.找到所有选选择课程号为1001的同学的名称

    1. select
    2. t1.name
    3. FROM
    4. (SELECT student.name,relationship.cno
    5. FROM student
    6. INNER JOIN relationship
    7. on student.sno = relationship.sno) t1
    8. WHERE
    9. t1.cno = '1001';

     内层查询就是()中的部分,t1是内层查询出的二维表的别名

    2.找到所有选选择课程号为 数学 的同学的名称

    1. SELECT t2.name
    2. FROM
    3. (select t1.name,scoure.gradeName
    4. from
    5. (SELECT student.name,relationship.cno
    6. FROM
    7. student INNER JOIN relationship
    8. on student.sno = relationship.sno) t1
    9. INNER JOIN scoure
    10. on t1.cno = scoure.cno) t2
    11. where gradeName = '数学';

    九、练习

    1. 查询出所有班级的同学的名字

    提示:不是所有的同学都有班级

    1. SELECT student.name,class.class_name
    2. from student
    3. INNER JOIN class
    4. on student.class_num = class.class_num;

    2.查询出年龄最高的同学的信息

    提示:可以使用limit

    select * FROM student ORDER BY age DESC LIMIT 1 OFFSET 0;

    3.查询出在学生当中那个年龄段的学生最多,并统计其出现的次数

    1. SELECT
    2. age,count(age) c_age
    3. FROM
    4. student GROUP BY age
    5. ORDER BY c_age desc
    6. LIMIT 1 OFFSET 0

    4.查询出年龄超过21岁,并且选择 Jvm基础的同学名字

    1. SELECT t3.name FROM
    2. (select t2.sno,student.name,student.age FROM student right JOIN
    3. (select t1.sno FROM
    4. (select relationship.sno,relationship.cno,course.gradeName
    5. FROM relationship
    6. INNER JOIN course on relationship.cno = course.cno) t1
    7. WHERE t1.gradeName = 'Jvm基础') t2
    8. on student.sno = t2.sno) t3
    9. where age > 21;

    5.查询出彩虹班年龄最大,所选择的课程名称及该同学的姓名。

    1. SELECT
    2. t3.name,
    3. course.gradeName
    4. FROM
    5. (
    6. SELECT
    7. t2.name,
    8. relationship.cno
    9. FROM
    10. (
    11. SELECT
    12. t1.sno,
    13. t1.name,
    14. t1.age
    15. FROM
    16. (
    17. SELECT
    18. student.sno,
    19. student.name,
    20. student.age,
    21. class.class_name
    22. FROM
    23. student
    24. INNER JOIN class ON student.class_num = class.class_num
    25. ) t1
    26. WHERE
    27. t1.class_name = '彩虹班'
    28. ORDER BY
    29. age DESC
    30. LIMIT 1 OFFSET 0
    31. ) t2
    32. INNER JOIN relationship ON t2.sno = relationship.sno
    33. ) t3
    34. INNER JOIN course ON t3.cno = course.cno;

  • 相关阅读:
    java毕业设计大学生数字云平台2021Mybatis+系统+数据库+调试部署
    docker 安装 jenkins
    什么是微服务?
    input的一些输入限制
    C++学习随笔(10)——string
    2023网络安全学习路线 非常详细 推荐学习
    bat脚本字符串替换:路径中\需要替换,解决一些文件写入路径不对的问题
    Linux搭建zookeeper与kafka集群配置
    每日一题 —— LC. 1752 检查数组是否经排序和轮转得到
    凯云科技,晚安!
  • 原文地址:https://blog.csdn.net/G81948577/article/details/140432772