数据库知识整理——SQL数据查询(1)

SQL语言对数据库的操作十分灵活、方便,原因在于 SELECT 语句中成分丰富多样的元组,有许多可选形式,尤其是目标列和条件表达式。

SELECT基本结构

语句格式

注意点:SOL 查询中的子句顺序为 SELECT、FROM、WHERE、GROUP BY、HAVING 和 ORDERBY。其中,SELECT、FROM 是必需的,HAVING 条件子句只能与 GROUP BY 搭配起来使用。

  • SELECT子句:列出查询的属性、或者对应属性的聚合函数(如AVG、COUNT、MAX、MIN、SUM)。
  • FROM子句:指定查询操作的数据表或视图,当存在多个表时,会首先执行笛卡尔积操作。
  • WHERE子句:过滤行数据的条件,常用运算符:=<>><>=<=BETWEENLIKEINIS NULL等,后面不能跟聚合函数

  • GROUP BY 子句:对结果集进行分组

  • HAVING 子句:对分组后的结果进行过滤,通常与聚合函数一起使用

  • ORDER BY 子句:对结果集进行排序

一个简单示例

对应的关系代数表达式:

简单查询

仅使用SELECT、FROM、WHERE保留字

如:查询学生-课程数据库中计算机系 CS 学生的学号、姓名及年龄。

SELECT Sno,Sname,Age
FROM S
WHERE SD = 'CS':

连接查询

若查询涉及两个以上的表,则称为连接查询。

如:检索选修了课程号“C1”的学生的学号和姓名

SELECTSno, Sname
FROM S, SC
WHERES.Sno=SC.Sno AND SC.Cno='C1'

内连接(INNER JOIN)

只返回两个表中匹配的行,使用INNER JOIN关键字,不用关键字时默认为内连接。内连接是在笛卡尔积的基础上增加连接条件,连接条件如下:

  • 等值连接

表之间通过“等于”关系连接起来。

例如:查询所有学生的姓名、课程号和分数列

SELECT student.姓名, score.课程号, score.分数
FROM student, score
WHERE student.学号 = score.学号
  • 非等值连接

与等值连接相反,指表之间的连接关系不是“等于”

例如:查询所有分数大于60的学生的姓名、课程号

SELECT student.姓名, score.课程号, score.分数
FROM student, score
WHERE score.分数>60
  • 自连接:表与自身连接,可以使得一个表的某行和同一表中的另一方连接起来。

例如:查询‘3-105课程’的成绩高于‘109’号学生成绩的所有学生记录,并按成绩从高到低排序

SELECT x.课程号, x.学号, x.分数
FROM score x, score y
WHERE x.课程号='3-105' AND x.分数 > y.分数 AND y.学号='109' AND y.课程号='3-105'
ORDER BY x.分数 DESC

外连接(OUTER JOIN)

内连接的话如果某行在其中一个表中没有匹配项,则不会出现在结果中。而外连接会返回至少一个表中的所有行,即使另一个表中没有匹配项。未匹配的部分以NULL填充。

  • 左外连接(LEFT JOIN): 返回左表所有记录和右表匹配记录

返回左表的所有行,即使右表无匹配。右表无匹配时显示NULL

SELECT course.课程名,teacher.姓名
FROM course LEFT JOIN teacher 
ON (course.任课教师编号=teacher.教师编号)

执行结果:

  • 右外连接(RIGHT JOIN): 返回右表所有记录和左表匹配记录

返回右表的所有行,即使左表无匹配。左表无匹配时显示NULL

SELECT course.课程名,teacher.姓名
FROM course RIGHT JOIN teacher 
ON(course.任课教师编号=teacher.教师编号)

执行结果:

  • 全外连接(FULL JOIN): 返回两表所有记录

返回两表的所有行,无匹配的部分以NULL填充。

SELECT course.课程名,teacher.姓名
FROM course FULL JOIN teacher 
ON(course.任课教师编号=teacher.教师编号)

执行结果:

    交叉连接(CROSS JOIN)

    交叉连接(Cross Join)是数据库中的一种连接操作,返回两个表的笛卡尔积。它将第一个表的每一行与第二个表的每一行组合,生成的结果集行数等于两表行数的乘积。交叉连接不依赖任何匹配条件,仅单纯合并数据。

    -- 显式语法
    SELECT * FROM table1 CROSS JOIN table2;
    
    -- 隐式语法(通过逗号分隔表)
    SELECT * FROM table1, table2;
    
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值