• 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中不存在关于 差 操作的关键字,所以需要利用其它(如本方法)方法实现
  • 相关阅读:
    做支付遇到的HttpClient大坑
    一个隐藏在支付系统很长时间的雷
    记一次自动恢复的支付故障
    从GopherChina 2019看当前的go语言
    记一次上线就跪的故障排查案例
    springboot 源码笔记
    计算多边形面积
    springboots Helloworld
    springboots 配置文件
    springboots 环境搭建
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700428.html
Copyright © 2020-2023  润新知