您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

[数据库]MySQL之SQL查询

bubuko 2022/1/25 20:04:03 mysql 字数 5321 阅读 687 来源 http://www.bubuko.com/infolist-5-1.html

一 关系表的介绍 课程表 学生表 选课表 二 SQL查询语句格式 三 查询案例 单表查询 3.1 单表查询:选择表中的若干列 3.1.1 查询指定列/全部列 3.1.2 查询经过计算后的值的列 3.2 单表查询:选择表中的若干行(元组/记录) 3.2.1 消除取值重复的行(DISTINCT) 若不消 ...

一 关系表的介绍

技术分享图片
  • 课程表

    技术分享图片
  • 学生表

    技术分享图片
  • 选课表

    技术分享图片

二 SQL查询语句格式

/* SQL查询的一般格式
    SELECT [ALL | DISTINCT] [* | coulmnNameA,coulmnNameB,...] 
        FROM [tableName | viewName | (select语句)] 
        [AS 结果表的别名]
        [WHERE 条件表达式x]
        [GROUP BY coulmnName1 [HAVING 条件表达式y]]
        [ORDER BY coulmnName2 [ASC | DESC]]
        [LIMIT startRow,targetRows]
    【各子句的处理顺序】FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
    【关键词释义】
        + GROUP BY coulmnName : 将结果按 coulmnName 的值分组·,该属性列中值相等的分为一组
        + HAVING 条件表达式 : 若 GROUP BY 子句带HAVING短语,则: 只有满足指定条件的组才予以输出
*/

三 查询案例 -- 单表查询

3.1 单表查询:选择表中的若干列

3.1.1 查询指定列/全部列
-- 1查询全体学生的姓名、学号、所在专业
SELECT s.sname,s.sno,s.sdept 
    FROM student AS s;
技术分享图片
3.1.2 查询经过计算后的值的列
-- 2查询全体学生的姓名及其出生年份
SELECT s.sname,year(now())-s.sage 
    FROM student AS s;
技术分享图片
-- 3查询全体学生的姓名、出生年份和所在院系(要求:用小写字母表示专业名)
SELECT s.sname,year(now())-s.sage, LOWER(s.sdept) 
    FROM student AS s;
技术分享图片

3.2 单表查询:选择表中的若干行(元组/记录)

3.2.1 消除取值重复的行(DISTINCT)

若不消除查询结果中的重复行,则:不声明 DISTINCT ,即使用默认的 ALL

-- 4查询已选过课程的学生学号
SELECT DISTINCT s.sno 
    FROM student AS s;
技术分享图片

3.3 WHERE子句 :查询满足条件的若干行(元组/记录)

查询满足指定条件的元组可通过 WHERE 子句 实现。
但,记住:【WHERE子句】中是不能用【聚集函数】作为条件表达式的;
WHERE 子句 常用的查询条件,如下图所示:


技术分享图片

-- 5查询计算机科学系(CS)全体学生的名单
SELECT s.sno,s.sname
    FROM student AS s
    WHERE s.sdept='CS'
技术分享图片
-- 6查询考试不及格的学生的学号和姓名 (多表查询)
SELECT s.sno, s.sname 
    FROM student AS s
    WHERE s.sno IN (
            SELECT sc.sno 
                FROM select_course AS sc
                WHERE sc.grade<60
    );
技术分享图片
-- 7查询计算机科学专业(CS)、数学专业(MA)和信息专业(IS)学生的姓名和性别
SELECT s.sname, s.ssex 
    FROM student AS s
    WHERE s.sdept IN ('CS', 'MA', 'IS');
技术分享图片

(涉及字符串的匹配)

-- 8查询姓'刘'的学生的姓名、学号和性别
SELECT s.sname, s.sno, s.ssex 
    FROM student AS s
    WHERE s.sname LIKE '刘%'; -- %表示满足任意长度(length≥0)的字符串
-- 9查询第二个字为'晨'的学生的姓名、学号和性别
SELECT s.sname, s.sno, s.ssex 
    FROM student AS s
    WHERE s.sname LIKE '_晨'; -- _表示任意的单个字符

(涉及空值的查询)

-- 10某些学生选修课程后没有参加考试,故存在选课记录;但没有考试成绩。
-- 查询:缺少成绩的学生的学号和对应的课程号
SELECT sc.sno, sc.cno
    FROM select_course AS sc
    WHERE sc.grade IS NULL; /* Grade为空值; 此处 IS 无法用等号(=)替代 */

(涉及同一表中多重条件的查询)

-- 11查询:计算机科学专业中年龄在20岁以下的学生的学号和姓名
SELECT s.sno, s.sname
    FROM student AS s
    WHERE s.sdept='CS' AND s.sage<20;

(涉及聚集函数)
注意1: 【WHERE子句】中是不能用聚集函数作为条件表达式的;
注意2: 聚集函数只能用于【SELECT子句】和【GROUP BY中的HAVING子句】

-- 12查询:选修了课程的学生人数
SELECT COUNT(DISTINCT s.sno) AS 选课总人数
    FROM student AS s;
-- 之所以DISTINCT,是因为1名学生可以选N个课程
-- 13查询:选修1号课程的学生平均成绩
SELECT AVG(sc.grade)
    FROM select_course AS sc
    WHERE sc.cno='1';

3.4 GROUP BY 子句

Page 98...待续~

参考文献

[数据库]MySQL之SQL查询

原文:https://www.cnblogs.com/johnnyzen/p/12535602.html


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶