一、查询进阶
-
链接查询
-
子查询
-
联合查询
得到交叉连接的结果
select * from 表1,表2;
得到自然连接的结果
select * from 表1,表2 where 表1.字段=表2.字段;
【案例】select * from tb1,tb2 where tb1.classid = tb2.classid;
【案例】#1 查询显示学生的班级名称、学生姓名、班级id
select name, class, classes.classid from students,classes where students.classid = classes.classid;
【案例】#2 查询显示学生的姓名和老师的姓名
#表1:学生表:students,关键有两个字段:学生姓名和老师的id,字段名name teacherid
#表2:老师表:teachers,关键有两个字段:老师姓名和老师的id,字段名name tid
select s.name,t.name from students as s,teachers as t where s.teacherid=t.tid;
#3 查询各个班级所开设的课程名,结果显示班级名和课程名
# 首先分析三张表的关联关系
#表1,班级表:classes,表中有班级id和班级名称,字段名classid和class
#表2,课程表:courses,表中有课程id和课程名,字段名courseid和course
#表3,班级课程关联关系表:coc,表中班级id和课程id,字段名classid和courseid
select class,course from classes,courses,coc where classes.classid=coc.classid and Courses.CourseID=coc.courseID;
字段别名
- 给字段去一个新的名字
- 显示结果中,字段名会直接用新的名字显示出来
mysql
# 格式:
select 字段名 as 新名字 from 表名 ...
# 【案例】:查看学员的姓名和年龄,显示结果中,字段名分别是 学员姓名 和 学员年龄
select name as "学员姓名",age as "学员年龄" from students;
表别名
select 字段 from 表名 as 新名
注意:如果用了新的名字,那么必须使用,否则报错
案例:在进行联合查询的时候,为表定义别名
- 为students表取别名叫做s
- 为classes表取别名叫做c
mysql
select name, c.classid from students as s,classes as c where s.classid=c.classid;
使用自然链接存在问题:
-
会导致数据缺失
-
解决方法:用左外链接、右外链接
-
左表:前面的
-
右表:后面的
-
左外链接
-
显示结果以左表为准,左表中的数据会全部出现,右边中的数据,有就显示,没有的显示为空
左表 left join 右表 on 条件
右外链接
-
显示结果以右表为准,右表中的数据会全部出现,左边中的数据,有就显示,没有的显示为空
左表 right join 右表 on 条件
案例:显示每个学生的姓名和班级名【没有班级的学生也要显示出来】
mysql
select name,class from students left join classes on students.classid=classes.classid;
2、子查询
-
在查询语句中,使用另外一个语句的查询结果
案例:查询所有年龄大于平均年龄的学生
mysql
select * from students where age>(select avg(age) from students);
二、视图
1、数据库设计方法【了解】
-
ER模型:表和表的关联关系
关系的类别:
-
一对一
-
一对多
-
多对多
概念
-
主键:唯一标识表中的一条记录
-
外键:用于将两张表建立关系
案例:【了解】 mysql # 创建表tb2 create table tb2( classid int primary key, # 第一个字段是id,是主键 name char(30)) # 第二个字段是name, # 创建表tb1 create table tb1( id int primary key, # 第一个字段id,是主键 name char(30), # 第二个字段是name, classid int, # 第三个字段是classid,是整数 foreign key(classid) references tb2(classid)); # 将classid这字段转换成外键,指向表tb2的classid这个字段