700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Mysql的多表查询(表添加 多表查询练习:笛卡尔积 内连接 外连接 子查询 UNION组合查询)

Mysql的多表查询(表添加 多表查询练习:笛卡尔积 内连接 外连接 子查询 UNION组合查询)

时间:2021-04-14 11:23:09

相关推荐

Mysql的多表查询(表添加 多表查询练习:笛卡尔积 内连接 外连接 子查询 UNION组合查询)

/hanhanwanghaha宝藏女孩 欢迎您的关注!

欢迎关注微信公众号:宝藏女孩的成长日记

如有转载,请注明出处(如不注明,盗者必究)

目录

一、表的创建1.1创建学生表student_one1.2创建教师表teacher_one1.3创建课程表course_one1.4创建成绩表score_one二、基于多表的连接查询2.1笛卡尔积(交叉连接)2.2 内连接2.2.1显示内连接2.2.2隐式内连接2.3外连接查询2.3.1左外连接2.3.2右外连接2.4子查询2.4.1普通子查询2.4.2使用EXISTS的子查询2.4.3使用 NOT EXISTS的子查询2.5 组合查询(使用UNION运算符组合多个结果)

一、表的创建

1.1创建学生表student_one

Sql语句:

create table student_one(sno varchar(20) not null primary key,sname varchar(20) not null,ssex varchar(20) not null,sbirthday datetime,class varchar(20))charset=utf8;

加入数据:

insert into student_one values('1','陈奇','男','2000-11-02','1');insert into student_one values('2','陈飞','男','1999-12-05','2');insert into student_one values('3','周杰','女','1989-03-01','3');insert into student_one values('4','昆凌','男','1989-04-15','4');insert into student_one values('5','王丽','女','1999-05-16','5');insert into student_one values('6','蔡蔡','男','2000-08-17','6');

运行结果:

1.2创建教师表teacher_one

Sql语句:

create table teacher_one(tno varchar(20) not null primary key,tname varchar(20) not null,tsex varchar(20) not null,depart varchar(20) not null)charset=utf8;

加入数据:

insert into teacher_one values('100','斯内普','男','计算机');insert into teacher_one values('101','哈利波特','男','土木工程');insert into teacher_one values('102','德拉科','男','中文');insert into teacher_one values('103','郝敏','女','历史');insert into teacher_one values('104','莉莉','女','舞蹈');

运行结果:

1.3创建课程表course_one

Sql语句:

create table course_one(cno varchar(20) not null primary key,cname varchar(20) not null,tno varchar(20) not null,foreign key(tno) references teacher_one(tno))charset=utf8;

加入数据:

insert into course_one values('0-1','计算机导论','100');insert into course_one values('1-5','混凝土结构','101');insert into course_one values('2-1','古代文论','102');insert into course_one values('3-2','世界古代史','103');insert into course_one values('4-2','蒙古舞','104');

运行结果:

1.4创建成绩表score_one

Sql语句:

create table score_one(sno varchar(20) not null,foreign key(sno) references student_one(sno),cno varchar(20) not null,foreign key(cno) references course_one(cno),degree decimal)charset=utf8;

加入数据:

insert into score_one values('1','0-1','99');insert into score_one values('2','1-5','88');insert into score_one values('3','2-1','77');insert into score_one values('4','3-2','66');insert into score_one values('5','4-2','98');insert into score_one values('6','3-2','99');

运行结果:

二、基于多表的连接查询

多表查询的连接谓词

Join:将两个表连接在一起,可进行笛卡尔积、内连接、外连接

2.1笛卡尔积(交叉连接)

举例:

目的:将teacher_one表和course_one表做笛卡尔积

Sql语句:

SELECT *FROM teacher_oneCROSS JOIN course_one;

运行结果:

2.2 内连接

内连接是最常见的一种连接,它也被称为普通连接和自然连接,但是只连接匹配的行,所以内连接可能丢失信息

2.2.1显示内连接

语法

SELECT 查询的字段FROM table1 JOIN table2 ON table_b ON table_a.外键 = table_b.主键;

举例:

目的:将学生学号,名字,成绩查询出来

Sql语句:

SELECT student_one.sno, student_one.sname, score_one.degreeFROM score_one JOIN student_one ON score_one.sno = student_one.sno;

运行结果:

2.2.2隐式内连接

语法:

SELECT 查询的字段 FROM table_a , table_b WHERE table_a.外键 = table_b.主键;

举例:

目的:将学生学号,名字,成绩查询出来

Sql语句:

SELECT student_one.sno, student_one.sname, score_one.degreeFROM score_one, student_oneWHERE score_one.sno = student_one.sno;

运行结果:

2.3外连接查询

外连接查询扩充了内连接查询的功能,包含全外连接、左外连接、右外连接

2.3.1左外连接

保留第一个表所有行,而第二个表只包含与第一个表匹配的行,第二个表相应的空行为NULL值

语法:

SELECT 查询的字段FROM table1 LEFT JOIN table2 ON 条件

举例:

目的:将每位老师的所教的课程查询出来

Sql语句:

SELECT teacher_one.tname,ameFROM teacher_one LEFT JOIN course_one ON course_one.tno = teacher_one.tno

运行结果:

2.3.2右外连接

保留第二个表所有行,而第一个表只包含与第二个表匹配的行,第一个表相应的空行为NULL值,与左外连接相反

语法

SELECT 查询的字段 FROM table1 RIGHT JOIN table2 ON 条件

举例:

目的:将学生的学号,姓名,成绩查询出来

Sql语句:

SELECT student_one.sno,student_one.sname,score_one.degreeFROM student_one RIGHT JOIN score_oneON score_one.sno=student_one.sno

运行结果:

2.4子查询

2.4.1普通子查询

一条select语句结果作为另一条select语句的(查询条件,查询结果等)。

语法:

SELECT 查询的字段FROM table_a WHERE 字段 = (SELECT 字段 FROM table_a [WHERE 条件])

举例:

目的:将sno小于3的同学的成绩查询出来

Sql语句:

SELECT student_one.sname, score_one.degreeFROM student_one LEFT JOIN score_oneON score_one.sno = student_one.snoWHERE student_one.sno IN (SELECT sno FROM student_one WHERE student_one.sno <3)

注意:当子查询产生一系列的值时,用IN,如果只有单个的值,就用=

运行结果:

2.4.2使用EXISTS的子查询

EXISTS

EXISTS搜索条件并不真正使用子查询的结果,它仅仅测试子查询是否产生任何结果

语法:

SELECT 查询的字段FROM tableWHERE EXISTS (条件)

举例:

目的:查询teacher_one表里面是否存在教师编号小于105的教师,不存在返回NULL

Sql语句:

SELECT teacher_one.tname, ameFROM teacher_one LEFT JOIN course_oneON course_one.tno = teacher_one.tnoWHERE EXISTS (SELECT tno FROM teacher_one WHERE teacher_one.tno <105)

运行结果:

2.4.3使用 NOT EXISTS的子查询

NOT EXISTS

与 EXISTS的作用相反,如果子查询没有返回行,则满足 NOT EXISTS的WHERE子句

语法:

SELECT 查询的字段FROM tableWHERE NOT EXISTS (条件)

举例:

目的:查询teacher_one表里面是否存在教师编号等于109的教师,存在返回NULL,不存在返回数据

Sql语句:

SELECT *FROM teacher_oneWHERE NOT EXISTS (SELECT tno FROM teacher_one WHERE tno=109)

运行结果:

2.5 组合查询(使用UNION运算符组合多个结果)

语法:

查询语句AUNION查询语句B

举例:

目的:将性别为男,学号为5的同学的学号,姓名,年龄都查询出来

Sql语句:

SELECT sno,sname,YEAR(from_days(datediff(now(), sbirthday))) AS '年龄'FROM student_oneWHERE ssex='男'UNION ALLSELECT sno,sname,YEAR(from_days(datediff(now(), sbirthday))) AS '年龄'FROM student_oneWHERE sno=5

运行结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。