数据库基础知识2

数据操作–查询

2.1 连接查询
当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回
内连接: 查询结果为两个表匹配到的数据

select * from 表1 
inner join 表2 on 表1 .列=表2 .列

注意:多个表连接时,必须有相同数据的列。内连接指 按照相同数据的列匹配时,结果只显示匹配到的数据。
扩展:内连接的另一种语法(通常不使用,效率低)

select * from 表1 ,表2 where   表1 .列=表2 .列
select * from students as stu
inner join scores as sc  on stu.studentno=sc.studentno
inner join courses as cou on sc.courseno=cou.courseno

为了方便书写,通常会给表起别名

select stu.name ,cou.name,sc.score  from students as stu
inner join scores as sc  on stu.studentno=sc.studentno
inner join courses as cou on sc.courseno=cou.courseno
where stu.name='王昭君' and cou.name='数据库'

在连接查询中,如果显示指定的列,通常在字段前写表名

左连接: 查询的结果为两个表匹配到的数据加左表特有的数据,对于右表中不存在的数据使用null;left 前边的是左表,后边的是右表;

select * from 表1 
left join 表2 on 表1 .列=表2 .列
select * from 表1 
left join 表2 on 表1 .列=表2 .列
(---left  左边的sql语句生成临时结果为左表)
left join 表3 on 表3.列=表2.列

右连接: 查询的结果为两个表匹配到的数据加右表特有的数据,对于左表中不存在的数据使用null

select * from 表1 
right join 表2 on 表1 .列=表2 .列

right前边为左表,后边为右表,右连接会把 右边所有数据放到结果中,在左表中匹配不到的数据会以null来填充。

自关联
连续查询的一种应用,对同一个表查询多次,把查询多次得到的结果连接组成新的结果
注意:因为是对同一个表进行连接,都要写别名
应用场景:通常把具有上下级关系的数据存到同一个表中,方便扩展。( 省,市,区县,乡)

子查询
在一个select语句中,嵌入了另外一个select语句,那么嵌入的那个select语句称之为子查询语句。

子查询是嵌入到主查询中
子查询是辅助主查询的,要么充当条件,要么充当数据源
子查询是可以独立存在的语句,是一条完整的select语句

1.子查询充当条件

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

子查询返回的结果只有一个值(一行一列),这种称之为标量子查询

select * from scores  where studentno  in (select studentno from students where age=18)

子查询返回的结果是一列(一列多行),这种称之为列子查询

age=20 and class='一班'
(age,class)=(20,一班)
select * from students  where(age,class)= (select age,class from students where name='李华')

子查询返回的结果是一行(一行多列),这种称之为行子查询

2.子查询充当数据源

select * from scores as sc 
inner join  (select * from courses where name in ('数据库',‘系统测试’)) as temp 
on sc.courseno=temp.courseno;  /效率更高

子查询返回的结果是多行多列(相当于一个表),这种称之为表子查询
注意:子查询充当数据源时,必须起别名

子查询的关键字:
in 范围
主查询 where 条件 in (列子查询)
any | some 任意一个
主查询 where 列 = any (列子查询)
在条件查询的结果中匹配任意一个即可,等价于in
也可以换成 大于(大于其中的任意一个,大于最小值) 小于(小于其中任意一个,小于最大值)
all
主查询 where 列 = all (列子查询): 等于里面所有
主查询 where 列 != all (列子查询): 不等于其中所有
主查询 where 列 < all (列子查询): 小于其中的最小值
主查询 where 列 > all (列子查询): 大于其中的最大值

PS:内容来源于视频教学,自己稍作整理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值