php笛卡尔积和子查询,Mysql的多表查询(表添加,多表查询练习:笛卡尔积、内链接、外链接、子查询、UNION组合查询)...

1、表的建立

1.1建立学生表student_one

Sql语句:web

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;

加入数据:sql

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');

运行结果:

8c9218476ea60119325d89089516b1b2.pngsvg

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;

加入数据:spa

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','莉莉','女','舞蹈');

运行结果:

d96ddb76b7a7606b9481f32addee737d.png3d

1.3建立课程表course_one

Sql语句:code

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;

加入数据:xml

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');

运行结果:

b7652c8937a7027c836f683aa251e535.pngblog

1.4建立成绩表score_one

Sql语句:token

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');

运行结果:

196dce064ceb58a3e69cf3e7308a899a.png

2、基于多表的链接查询

多表查询的链接谓词

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

2.1笛卡尔积(交叉链接)

举例:

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

Sql语句:

SELECT *

FROM teacher_one

CROSS JOIN course_one;

运行结果:

f709ff23f806d86bb10041941424e54c.png

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.degree

FROM score_one JOIN student_one

ON score_one.sno = student_one.sno;

运行结果:

10aacfb2414468f21cef8e92819d7f70.png

2.2.2隐式内链接

语法:

SELECT 查询的字段

FROM table_a , table_b

WHERE table_a.外键 = table_b.主键;

举例:

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

Sql语句:

SELECT student_one.sno, student_one.sname, score_one.degree

FROM score_one, student_one

WHERE score_one.sno = student_one.sno;

运行结果:

feebd71631de48bd693919c0a123765c.png

2.3外链接查询

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

2.3.1左外链接

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

语法:

SELECT 查询的字段

FROM table1 LEFT JOIN table2

ON 条件

举例:

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

Sql语句:

SELECT teacher_one.tname,course_one.cname

FROM teacher_one LEFT JOIN course_one

ON course_one.tno = teacher_one.tno

运行结果:

3181ca5774ec76040ff673819440d305.png

2.3.2右外链接

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

语法

SELECT 查询的字段

FROM table1 RIGHT JOIN table2

ON 条件

举例:

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

Sql语句:

SELECT student_one.sno,student_one.sname,score_one.degree

FROM student_one RIGHT JOIN score_one

ON score_one.sno=student_one.sno

运行结果:

552140f9b738a0cc4ad82a518d284ae2.png

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.degree

FROM student_one LEFT JOIN score_one

ON score_one.sno = student_one.sno

WHERE student_one.sno IN (SELECT sno FROM student_one WHERE student_one.sno <3)

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

运行结果:

80ae51dd065ff382ddc8367279c29310.png

2.4.2使用EXISTS的子查询

EXISTS:

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

语法:

SELECT 查询的字段

FROM table

WHERE EXISTS (条件)

举例:

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

Sql语句:

SELECT teacher_one.tname, course_one.cname

FROM teacher_one LEFT JOIN course_one

ON course_one.tno = teacher_one.tno

WHERE EXISTS (SELECT tno FROM teacher_one WHERE teacher_one.tno <105)

运行结果:

d23a7bb6f54bc62f168a82f6c6d151ec.png

2.4.3使用 NOT EXISTS的子查询

NOT EXISTS:

与 EXISTS的做用相反,若是子查询没有返回行,则知足 NOT EXISTS的WHERE子句

语法:

SELECT 查询的字段

FROM table

WHERE NOT EXISTS (条件)

举例:

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

Sql语句:

SELECT *

FROM teacher_one

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

运行结果:

12d67b1803ddffce5fdb5e7f98db8e01.png

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

语法:

查询语句A

UNION

查询语句B

举例:

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

Sql语句:

SELECT sno,sname,YEAR(from_days(datediff(now(), sbirthday))) AS '年龄'

FROM student_one

WHERE ssex='男'

UNION ALL

SELECT sno,sname,YEAR(from_days(datediff(now(), sbirthday))) AS '年龄'

FROM student_one

WHERE sno=5

运行结果:

f36fc62c474f51d8625f5f316e9c3d99.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值