当前位置: 首页 > article >正文

数据库查询

一. 单表查询

在这里插入图片描述
在这里插入图片描述

3.1)使用
SELECT sc.Sno, sc.Cno AS CourseCount
FROM sc
GROUP BY sc.Sno	
虽然时按Sno进行分组,但是Cno并没有分组是随机的

在这里插入图片描述

2)使用
SELECT sc.Sno, GROUP_CONCAT(sc.Cno) AS CourseCount
FROM sc
GROUP BY sc.Sno
使用聚合函数之后,Coursecount正常被分组

在这里插入图片描述

(3)使用
SELECT sc.Sno, COUNT(sc.Cno) AS CourseCount 
FROM sc GROUP BY sc.Sno
对相同的Cno进行计数

在这里插入图片描述

SELECT sc.Sno, COUNT(sc.Cno) AS CourseCount
FROM sc
GROUP BY sc.Sno
HAVING COUNT(sc.Cno) >= 3;having后使用聚合函数,然后在其结果中进行选择,正确得到第3题答案
SELECT Sdept, COUNT(*) AS StudentCount
FROM student
WHERE Sage > 20 AND (Sdept = '信息管理系' OR Sdept = '数学系')
GROUP BY Sdept;
先进行where的条件判断,然后根据其结果按goup by进行分组

二. 表连接查询

请添加图片描述
请添加图片描述

(1) 使用
SELECT * FROM student JOIN course
两个表做笛卡尔积,表一n行,表二m行,连接后m*n行

在这里插入图片描述

2)使用
SELECT * FROM student 
JOIN sc ON student.Sno = sc.Sno 
JOIN course ON sc.Cno = course.Cno
通常来说我们通过外键来连接两个表,而且我们看sc表Sno和Con恰好是连接student表和course表的外键,起到一个承上启下的作用

在这里插入图片描述

(3)使用
SELECT student.Sname, course.Cname, sc.Grade
FROM student
JOIN sc ON student.Sno = sc.Sno
JOIN course ON sc.Cno = course.Cno
WHERE student.Sdept = 'aaa'   -- 筛选aaa系
  AND student.Ssex = 'male'          -- 筛选性别为女
  AND course.Cname = 'computer';   -- 筛选课程为computer

在这里插入图片描述

三. 子查询

请添加图片描述
请添加图片描述
1.

SELECT Sno, Sname
FROM student
WHERE Sno IN (
    SELECT sc.Sno
    FROM sc
    WHERE sc.Cno = (
        SELECT course.Cno
        FROM course
        WHERE course.Cname = 'exercise'
    )
);
和连接查询很像,从内层向外,不断使用外键查询。
内层子查询:
SELECT course.Cno:首先从 course 表中查询课程名称为“exercise”的课程编号(Cno)。
中间子查询:
SELECT sc.Sno:根据内层子查询返回的 Cno,从 sc 表中查询所有选修了该课程的学生学号(Sno)。
外层查询:
SELECT Sno, Sname FROM student:根据中间子查询得到的学号,在 student 表中查询这些学生的学号
和姓名。

2.在这里插入图片描述

SELECT student.Sno, student.Sname,    
       (SELECT COUNT(*)
        FROM sc
        WHERE sc.Sno = student.Sno) AS CourseCount,  -- 关联子查询,加上括号和逗号放到紧跟外层查询
       (SELECT AVG(sc.Grade)
        FROM sc
        WHERE sc.Sno = student.Sno) AS AvgGrade      -- 关联子查询
FROM student
WHERE student.Sno IN (
    SELECT sc.Sno
    FROM sc
    JOIN course ON sc.Cno = course.Cno
    WHERE course.Cname = 'exercise'                       -- 独立子查询
);
这里使用了关联子查询,关联子查询依赖外层查询,比如这里的关联子查询依赖于外层查询的student.Sno, student.Sname,并且结果会和外层查询并列输出。相反,独立子查询通常在外层查询之前执行,外层查询依赖独立子查询。

四. 练习

在这里插入图片描述
如果直接使用

SELECT student.Sname, student.Sdept 
FROM student 
WHERE Sno IN 
    (SELECT Sno 
     FROM sc 
     WHERE sc.Cno != '1' --没有选修1的课程
    );
 因为select语句是一行一行检查,所以如果表结构如下

这样因为有人选了1但也选了除了1之外的课程,这样也会被选上。导致错误
在这里插入图片描述
改进:

SELECT student.Sname, student.Sdept 
FROM student 
WHERE Sno NOT IN 
    (SELECT Sno 
     FROM sc 
     WHERE sc.Cno = '1' --选修1的课程
    );
    我们找选了1的人,那所有选了1的人都会被找到。然后使用NOT IN 就解决了 

在这里插入图片描述

SELECT sc.Sno, sc.Grade 
FROM sc 
WHERE sc.Cno = '1' 
  AND sc.Grade > (
    SELECT AVG(sc.Grade) 
    FROM sc 
    WHERE sc.Cno = '1'
  );

在这里插入图片描述

SELECT student.Sno, student.Sname
FROM student 
WHERE student.Sno IN
	(SELECT sc.Sno 
     FROM sc 
     WHERE sc.Cno='1' OR sc.Sno='2'
    )

4. 查询至少选修了学生“02”选修的全部课程的学号


http://www.kler.cn/news/329402.html

相关文章:

  • 注册安全分析报告:科研诚信查询平台无验证方式导致安全隐患
  • buuctf [ACTF2020 新生赛]Include
  • 面试题05.08绘制直线问题详解(考察点为位运算符)
  • 软件设计模式概述
  • 面试题:MySQL你用过WITH吗?领免费激活码
  • PHP安装后Apache无法运行的问题
  • [Redis][主从复制][上]详细讲解
  • CSS全解析
  • 滚雪球学MySQL[10.2讲]:数据库性能问题排查详解:从慢查询优化到内存与CPU使用分析
  • DES、3DES 算法及其应用与安全性分析
  • 【RabbitMQ 项目】客户端:连接模块
  • CSP 安全配置案例
  • 【设计模式-命令】
  • Elasticsearch学习笔记(1)
  • 二、词法分析,《编译原理》(本科教学版),第2版
  • 【MySQL基础刷题】总结题型(一)
  • 简单的微信小程序个人 个人详情页
  • WebUI密码被锁定
  • NCU-机器学习-作业3:基于SVM的手写字识别
  • linux ip命令使用
  • 大数据毕业设计选题推荐-热门微博数据可视化分析系统-Hive-Hadoop-Spark
  • C动态内存管理
  • 【在Linux世界中追寻伟大的One Piece】System V共享内存
  • Spring DI 笔记
  • 使用rust写一个Web服务器——单线程版本
  • 基于SSM+VUE的学生宿舍管理系统
  • 单链表的增删改查(数据结构)
  • OpenAI o1:使用限额提高,o1 模型解析
  • 基于STM32的智能家居语音控制系统:集成LD3320、ESP8266设计流程
  • 【优选算法】(第八篇)