zoukankan      html  css  js  c++  java
  • 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中不存在关于 差 操作的关键字,所以需要利用其它(如本方法)方法实现
  • 相关阅读:
    python数据分析与展示
    人生苦短,我学python。
    数学
    解决git for windows 和 vim for windows 的 vim 显示中文乱码的问题
    解决win7连接IPsec报错789和809错误
    python安装pandas库
    vim配置文件
    0x03-数据和C
    Ubutun安装问题记录
    Django-rest-framework --- 三大认证
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700428.html
Copyright © 2011-2022 走看看