这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战
一、多表查询
1.1 内连接
规则:返回两个表的公共记录。
语法:
1、select * from 表1 inner join 表2 on 表1.公共字段=表2.公共字段
(inner可以省略)
在MySql实体关系、数据库设计、查询语句、模糊搜索的测试数据基础上,再添加如下测试数据代码:
create table stuMarks (
examNo char(7) primary key,
stuNo varchar(6) not null,
writtenExam int,
labExam int
);
insert into stumarks values ('001','01', 80, 60);
insert into stumarks values ('002','05', 90, 55);
insert into stumarks values ('003','08', 88, 89);
insert into stumarks values ('004','09', 90, 92);
例题:
2、
select * from 表1, 表2 where 表1.公共字段=表2.公共字段;
1.2 左外连接
规则:以左边的表为准,右边如果没有对应的记录,显示null
语法:select * from 表1 left join 表2 on 表1.公共字段=表2.公共字段;
1.3 右外连接
规则:以右边的表为准,左边如果没有对应的记录,显示null
语法:select * from 表1 rightjoin 表2 on 表1.公共字段=表2.公共字段;
1.4 交叉连接
语法:select * from 表1 cross join 表2 on 条件字段;
返回笛卡尔积。
小结:
1、交叉连接如果没有连接条件返回笛卡尔积
2、如果有连接条件和内连接是一样的
1.5 自然连接
自动判断条件连接,判断的条件是依据同名字段
1、自然内连接(natural join)
2、自然左外连接(natural left join)
3、自然右外连接(natural right join)
小结: 1、表连接是通过同名字段来连接的 2、如果没有同名字段则返回笛卡尔积 3、同名的连接值显示一个,并且将该字段放在最前面
1.5.1 using
using用来指定连接字段,using也会做公共字段的优化,优化的规则和自然连接的是一样的。
例:
1.6 练习
1、显示地区及每个地区参加考试(writtenExam(笔试))的人数,并按人数降序排列:
2、显示有学生参加考试的地区
3、显示男生和女生的人数
方法一,分组查询:
方法二,union:
方法三,直接写条件:
4、显示每个地区男生、女生、总人数
二、子查询
语法:select * from 表1 where (子查询)
外面的查询称为父查询
子查询为父查询提供查询条件
2.1 标量子查询
特点:返回的结果是一个。
例题:查找笔试成绩是88的学生:
2.2 列子查询
如果标量子查询的结果返回多条记录,不能使用等于,用in 或 not in。 特点:列子查询的返回结果是一列。
1、查找笔试成绩大于80的同学:
2.3 行子查询
特点:子查询返回的结果是多个字段组成
1、找出语文成绩最高的男生和女生
2.4 表子查询
特点:将子查询的结果作为表
1、找出语文成绩最高的男生和女生
注意:from后面跟的是数据源,如果将子查询当成表来看,必须给结果集取别名。
2.5 exists 子查询
1、如果笔试成绩有人超过90分,就显示所有学生信息:
2、如果笔试成绩没有人超过90分,就显示所有学生信息:
在学习的MySQL的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。