前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sql查询

sql查询

作者头像
h3110_w0r1d
发布2024-02-19 19:15:15
1090
发布2024-02-19 19:15:15
举报

连接查询

注意

  1. from字句后面的表名,可以用表原名,也可以为它起别名,一旦有了别名,整个查询语句中凡是涉及用表名的地方都要用表原名
  2. 查询语句中出现的所有列,若在所有涉及的表中是唯一的,则列明前可以不加表明前缀
  3. 如果不是唯一的,为了确定它的唯一性,必须在列名前加表名前缀

等值连接和非等值连接

两个表进行连接时,必须要有可比字段,两个可比字段的值进行逐一比较来决定当前两个元组是否可以连接

等值连接不会去重

代码语言:javascript
复制
select student.*,SC.*
from student,SC
where student.sno = SC.sno;

select SC.sno,SC.score,SG.grade
from SC,SG
where SC.score BETWEEN SG.minscore AND SG.maxscore;

内连接

显示内连接

on来连接两个连接列,where中写连接条件

显示内连接用inner join

内连接又叫自然连接,会去掉重复列的等值连接

代码语言:javascript
复制
select 目标列列表
from 表1 inner join 表2
on 表1.连接列=表2.连接列
where 查询条件

隐式内连接

where写连接列,and后跟条件

隐式内连接用’=’

代码语言:javascript
复制
select 目标列列表
from 表1,表2
where 表1.连接字段=表2.连接字段
and 其它查询条件

外连接

左外连接

以左边的表为基础,根据ON后面给出的两表的条件将两表连接起来

结果会将左表所有查询信息列出,右表只会列出ON后条件和左表满足的部分

语句left join… on

代码语言:javascript
复制
select a.device_id,question_id,result,level,gender,age
from
(
    select device_id,question_id,result,level
    from question_practice_detail
)a-表别名
left join
(
    select device_id,gender,age
    from user_profile
)b-表别名
on a.device_id=b.device_id;

左外连接的注意事项

在使用left join时,写在前面的表为匹配时的底表,使用on给出匹配条件,匹配条件可以不唯一

在表匹配时,一般我们会将要匹配的两段查询用括号括起来,并在括号末尾给予一串字母,作为表的别名

左外连接例题
代码语言:javascript
复制
select
    university,
    difficult_level,
    round(count(qpd.question_id) / count(distinct qpd.device_id),4) as avg_answer_cnt-- round(x,4)将x四舍五入至小数点后四位
    
from question_practice_detail as qpd

left join user_profile as up
on up.device_id=qpd.device_id

left join question_detail as qd
on qd.question_id=qpd.question_id

group by university,difficult_level;-- group by university按学校分组,group by difficult_level按不同难度的用户平均答题量

右外连接

左外连接的反向连接

代码语言:javascript
复制
Select a.device_id,question_id,result,level,gender,age
from
(
Select device_id,gender,age
From user_profile
)a -- 表别名
Right join
(
Select device_id,question_id,result,level
From question_practice_detail
)b -- 表别名
On a.device_id = b.device_id —给出链接条件

全外连接

将左右两个表先左外连接,在右外连接,然后两个结果并在一起

代码语言:javascript
复制
select 目标列列表
from 表1 full join 表2
on 表1.链接列=表2.链接列
where 查询条件

自身链接

链接操作不仅可以在多个表之间进行链接,而且可以时一个表与其自身进行连接,这样的表称为自身连接

因为两个表的表名和列名都相同,为了加以区分,必须给他们起两个别名,且各列前必须要有****表别名前缀

代码语言:javascript
复制
select FIRST.cno,SECOND.cpno
from course FIRST inner join course SECOND
on FIRST.cpno = SECOND.cno;

笛卡尔积

  1. 在写表和表的连接关系时,大多数情况下都必须要限制匹配条件,如果在匹配时没有限制匹配条件,这时就会导致笛卡尔积。
  2. 笛卡尔积时关系代数里一个概念,表示两个表中的每一行数据任意组合
  3. 假设A中有n行数据,b中有m行数据,没有限制匹配条件的话,最终输出的结果就会有n*m行数据
  4. 在互联网大体量数据情况下,每个表 可能有几百万几千万行数据,几千万*几千万最终得到的结果行数会是天文数字,所以在写匹配时,一定不要忘了加上匹配条件。

全称量词命题和存在量词命题

嵌套查询

嵌套查询的工作方式

先处理内查询,由内向外处理

外层查询利用内层查询的结果

代码语言:javascript
复制
select tag,count(tag) as tag_cnt
from exam_record
join examination_info on exam_record.exam_id = examination_info.exam_id
where uid in (
    select uid
    from exam_record
    where submit_time is not null
    group by score
    having count(exam_id) / count(distinct DATE_FORMAT(start_time,"%Y%m")) >= 3
)
group by tag
order by tag_cnt desc;
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 连接查询
    • 注意
      • 等值连接和非等值连接
        • 内连接
          • 显示内连接
          • 隐式内连接
        • 外连接
          • 左外连接
          • 左外连接的注意事项
          • 右外连接
          • 全外连接
          • 自身链接
          • 笛卡尔积
      • 全称量词命题和存在量词命题
      • 嵌套查询
        • 嵌套查询的工作方式
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com