关于数据库的查询进阶——(第五课)

查询链接分为:

  • 链接查询
  • 子查询
  • 联合查询

1、链接查询

  • 将两张或者多张表联合起来进行查询,叫做链接查询【join】,有两种
    • 交叉链接:
      • 表中每一行,分别和其它表的每一样组成一个新的行
      • 新表的行数是两个表的行数相乘,列数是两个表的列数相加
  • 自然链接【内链接,等值链接】
    • 将多个表中,符合条件的进行链接

得到交叉链接的结果

select * from 表1,表2;

得到自然链接的结果

select * from 表1,表2 where 表1.字段=表2.字段;

案例:

#1 查询显示学生的班级名称、学生姓名、班级id
select stuid,name,class from students,classes where students.classid=classes.classid;

#2 查询显示学生的姓名和老师的姓名
#表1:学生表:students,关键有两个字段:学生姓名和老师的id,字段名name teacherid
#表2:老师表:teachers,关键有两个字段:老师姓名和老师的id,字段名name tid

select students.name,teachers.name from students,teachers where students.teacherid=teachers.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;

字段别名

  • 给字段取一个新的名字
  • 显示结果中,字段名会直接用新的名字显示出来

#格式:

select 字段名 as 姓名字 from 表明;

# 案例:查看学员的姓名和年龄,显示结果中,字段名分别是 学员姓名 和 学员年龄

select name as "学员姓名",age as "学员年龄" from students;

表别名

select 字段 from 表明 as 新名

注意:如果用了新的名字,那么必须使用,否则报错

案例:在进行联合查询的时候,为表定义别名

  • 为students表取别名为s
  • 为classes表取别名叫做c

select name, c.classid from students as s,classes as c where s.classid=c.classid;

使用自然链接存在的问题:

  • 会导致数据缺失
  • 解决方法:用左外链接,右外链接
    • 左表:前面的
    • 右表:后面的

左外链接

  • 显示结果以左表为准,左表中的数据会全部出现,右表中的数据,有的就显示,没有就不显示

左表 left join 左表 on 条件

右外链接

  • 显示结果以右表为准,右表中的数据会全部出现,左表中的数据,有的就显示,没有就不显示

右表 left join 左表 on 条件

  • 案例:显示每个学生的姓名和班级名【没有班级的学生也要显示出来】

select name,class from students left join classes on students.classid=classes.classid;

子查询

  • 在查询语句中,使用另外一个语句的查询结果

案例:查询所有年龄大于平均年龄的学生

select * from students where age>(select avg(age) from students);

试图

1、数据库设计方法【了解】

ER模型:表和表的关联关系

关系的类别:

  • 一对一
  • 一对多
  • 多对多

概念

  • 主键:唯一标识表中的一条记录
  • 外键:用于将两张表建立关系

案例:【了解】

# 创建表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这个字段

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值