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中不存在关于 差 操作的关键字,所以需要利用其它(如本方法)方法实现
原文地址:https://www.cnblogs.com/viplanyue/p/12700428.html