• MySQL入门,第八部分,多表查询(一)


    一、数据库脚本

    
    #--------------------------------------------------------------------------------
    #------------------------------创建数据库及写入数据------------------------------
    
    CREATE DATABASE SCDB;
    
    #--创建学生选课数据库 
    USE SCDB;
    
    #--创建学生表Student
    CREATE TABLE Student
    (
    	Sno CHAR(10) NOT NULL PRIMARY KEY,
    	Sname CHAR(10) NULL,
    	Age INT NULL,
    	Sex CHAR(1), 
    	Place CHAR(10)
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    #--查看表Student详细定义
    SHOW CREATE TABLE Student;
    
    #--给学生表Student插入数据
    INSERT INTO Student(Sno,Sname,Age,Sex,Place)
    VALUES('02001','王明',21,'男','广东'),
    ('02005','黄小英',22,'女','湖北'),
    ('03035','张小倩',20,'女','江西'),
    ('03061','李刚',21,'男','湖北'),
    ('04009','张珊',18,'女','浙江'),
    ('04027','肖文',19,'男','福建');
    
    #--创建课程表Course
    CREATE TABLE Course
    (
    	Cno CHAR(10) NOT NULL PRIMARY KEY,
    	Cname CHAR(10) NULL,
    	Credit INT NULL
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    #--给课程表Course插入数据
    INSERT INTO Course
    VALUES('C01','操作系统',3),
    ('C02','C语言',4),
    ('C03','数据结构',3),
    ('C04','数据库原理',2),
    ('C05','软件工程',2);
    
    #--创建选修表Study
    CREATE TABLE Study
    (
    	Sno NCHAR(10) NOT NULL REFERENCES Student(Sno),
    	Cno NCHAR(10) NOT NULL REFERENCES Course(Cno),
    	Grade INT NULL,
    	PRIMARY KEY (Sno,Cno)
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    #--给选修表Study插入数据
    INSERT INTO Study(Sno,Cno,Grade)
    VALUES('02001','C01',86),
    ('02001','C05',78),
    ('02005','C01',81),
    ('02005','C03',66),
    ('03035','C02',78),
    ('03035','C04',92),
    ('03061','C04',52),
    ('03061','C01',84),
    ('04009','C02',78),
    ('04009','C03',82),
    ('04027','C01',80);

    二、连接查询

    查询每个学生的每门课的成绩

    SELECT student.sno AS 学号, sname AS 学生, cname AS 课程, grade AS 考试成绩
    FROM student, study, course
    WHERE student.sno = study.sno AND study.cno = course.cno
    
    
    注意:
    有些属性不止在一个表中出现时,前面要加上所在的表
    多表关联查询时,一定要检查好查询条件,即where后面的逻辑思维

    三、并操作

    注意:该操作可以直接使用 OR 关键字实现

    union
    
    注意:
    1.如果两个结果集的列数相同,即使字段类型不相同,也可以使用此关键字进行连接,但是强烈不推荐这样做,这样并没有任何的实际意义,因为两个结果集的属性并不相同
    2.进行union连接后,结果集的属性名称以第一条结果集的属性名称为准
    3.进行union连接后,结果集默认是无重复值的,如果不想重复值被覆盖,则需要使用 union all
    SELECT sname
    FROM student
    WHERE place = '广东'
    UNION
    SELECT sname
    FROM student
    WHERE place = '湖北'

    四、交操作

    注意:该操作可以直接使用AND关键字实现

    查询籍贯为湖北的男生的信息

    SELECT * FROM
    (
    	(
    	SELECT *
    	FROM student
    	WHERE place = '湖北'
    	)
    	UNION ALL
    	(
    	SELECT *
    	FROM student
    	WHERE sex = '男'
    	)
    )
    AS temp
    GROUP BY sno
    HAVING COUNT(*) >= 2
    
    
    注意:
    因为mysql中不存在 交 的关键字,因此需要借助UNION ALL和分组查询实现

    五、差操作

    查询年龄大于等于20岁的男生的信息

    SELECT *
    FROM student
    WHERE age >= 20 AND sno NOT IN 
    (
    	SELECT sno
    	FROM student
    	WHERE sex = '女'
    )
    
    
    
    SELECT *
    FROM student
    WHERE age >= 20 AND sex <> '女'
    
    
    注意:
    mysql中不存在关于 差 操作的关键字,所以需要利用其它(如本方法)方法实现
  • 相关阅读:
    你知道吗,Flutter内置了10多种show
    强大的Flutter App升级功能
    Flutter 日期时间DatePicker控件及国际化
    你知道吗,Flutter内置了10多种Button控件
    Flutter Form表单控件超全总结
    Flutter 裁剪类组件 最全总结
    Flutter 拖拽控件Draggable看这一篇就够了
    Python 浮点数的冷知识
    Python 为了提升性能,竟运用了共享经济
    Python 之父的解析器系列之六:给 PEG 语法添加动作
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700428.html
Copyright © 2020-2023  润新知