数据库表的查询

数据库的查询:

/选择查询结果输出列/*

1.表示选择一个表或视图中的所有列

SELECT *
FROM STUD
WHERE 专业='计算机'

2.选择一个表中的指定列

SELECT 学号,姓名,总学分
FROM STUD
WHERE 专业='计算机'

3.定义列别名

SELECT 学号 AS number,姓名 AS name
FROM STUD
WHERE 专业='计算机'
或者
SELECT 学号=number,姓名=name
FROM STUD
WHERE 专业='计算机'
当别名中有空格时,使用引号将标题括起来
SELECT 学号 AS ‘Student number’,姓名 AS name
FROM STUD
WHERE 专业='计算机'
不允许在WHERE子句中使用列别名。

4.替换查询结果中的数据

SELECT 学号,姓名,等级=//将总学分的列值改为等级
  CASE
      WHEN 总学分 IS NULL THEN'尚未选课'
      WHEN <50 THEN'不及格'
      WHEN >=50 AND <=52 THEN'合格'
      ELSE ‘优秀’
   END
FROM STUD
WHERE 专业='计算机'

5.计算列值

查询‘c03’号课程成绩加上10分后的学生学号和成绩,要求给出临时标题

SELECT Sno,Grade+10 as'成绩'
FROM Course,SC
WHERE Course.Cno=SC.Cno  AND  Course.Cno='C03'

6.消除结果集中的重复行

SELECT DISTINCT 专业
FROM STUD

7.限制结果集返回行数//返回结果集的前6行

SELECT TOP 6 姓名 ,专业
FROM STUD

8.聚合函数
1)SUM ,AVG

SELECT SUM(成绩) AS '总和',AVG(成绩) AS '平均分分'
FROM STUD
WHERE 课程号=‘101

2)MAX,MIN

SELECT MAX(成绩) AS '最高分',MIN(成绩) AS '最低分'
FROM STUD
WHERE 课程号=‘101

3)COUNT,统计组中满足条件的行数或总行数

SELECT COUNT(总学分) AS '总学分大于50人数'
FROM STUD
WHERE 总学分>50
如果使用COUNT(*)时将返回检索行的总数目,不论其是否包含空值,如果COUNT()括号中为列名的话,则忽略空值。

/选择查询条件 WHERE*/

1.表达式比较
当两个表达式值中有一个为空值或者都为空值时,比较运算符将返回UNKNOWN。
表达式比较符有 <>,!=不等于,!< 不小于,!> 不大于等运算符。

SELECT *
FROM STUD
WHERE 专业=‘通信工程’ AND 学分>=42

2.模式匹配

% 代表0个或多个任意字符
_ 代表单个字符
[]指定属于范围,如属于[0-9][absd]中的任何单个字符
[^]指定不属于范围,如不属于[^0-9][^absd]中的任何单个字符

SELECT *
FROM STUD
WHERE 姓名 LIKE '王_'
当含有转义字符时,LIKE '%5/%%' ESCAPE '/',这里表示任意位置包含5%的字符串。

3.范围比较(BETWEEN IN )

SELECT 出生时间
FROM STUD
WHERE 出生时间 NOT BETWEEN '1995-1-1' AND '1995-12-31'

SELECT *
FROM STDU
WHERE 专业 IN (‘软件工程’,‘通信工程’)

4.空值比较

SELECT *
FROM STUD
WHERE 备注 IS NULL

5.子查询,子查询中不能使用ORDER BY子句
1)IN,判断一个给定值是否在子查询结果集中,先执行子查询。

查询选修了课程名为“信息系统”的学生学号和姓名
    SELECT Sno,Sname      ③ 最后在Student关系中
    FROM    Student         取出Sno和Sname
    WHERE Sno  IN
             (SELECT Sno          ② 然后在SC关系中找出选
              FROM    SC             修了3号课程的学生学号
              WHERE  Cno IN
                     (SELECT Cno      ① 首先在Course关系中找出
                       FROM Course     “信息系统”的课程号,为3WHERE Cname= ‘信息系统’
                     )
              );

2)比较子查询(ALL,SUM,ANY)
这里写图片描述

找出每个学生超过他选修课程平均成绩的课程号。
   SELECT Sno, Cno
    FROM  SC  x
    WHERE Grade >=
    (
    SELECT AVG(Grade) 
        FROM  SC y
        WHERE y.Sno=x.Sno
    );

3)EXISTS子查询

查询没有选修1号课程的学生姓名。
     SELECT Sname
     FROM Student
     WHERE NOT EXISTSSELECT *
       FROM SC
       WHERE Sno = Student.Sno AND Cno='1');

/指定查询对象*FROM/
1.表或视图
2.导出表

SELECT Sname
FROM (
   SELECT Sname
   FROM STUD
   WHERE SCORE>50
)AS Student//表的别名
WHERE 性别=1

/连接多表*/
1.连接谓词
1)自然连接

 SELECT   Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
    FROM     Student,SC
    WHERE    Student.Sno = SC.Sno

2)多表连接

查询选修2号课程且成绩在90分以上的所有学生      
        SELECT Student.Sno, Sname
        FROM    Student, SC
        WHERE Student.Sno = SC.Sno
                                            /* 连接谓词*/
             AND    SC.Cno= ‘2AND SC.Grade > 90/* 其他限定条件 */

2.以JOIN关键字指定的连接

1)内连接 INNER JOIN
按照ON所指定的连接条件合并两个表,返回满足条件的行

查询每个学生的情况以及选修课的课程情况
SELECT *
FROM Student INNER JOIN SC
ON Student.sno=SC.sno

2)外连接 OUTER JOIN
其中的OUTER关键字均可省略
外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
左外连接(LEFT OUTER JOIN)结果表中除了包括满足连接条件的所有行外,还包括左表的所有行

查询每个学生及其选修课程的情况
   SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
    FROM  Student  LEFT OUTER JOIN SC ON Student.Sno=SC.Sno; 

右外连接(RIGHT OUTER JOIN)结果表中除了包括满足连接条件的所有行外,还包括右表的所有行

 查找选修了的课程和所有开设的课程名
  SELECT SC.*,课程名
  FROM SC RIGHT OUTER JOIN Course
  ON Sc.Sno=Course.Sno

完全外连接(FULL OUTER JOIN)结果表中除了包括满足连接条件的所有行外,还包括两个表的所有行

3)交叉连接 CROSS JOIN,实质是对两个表进行笛卡尔积运算
列出所有学生的可能选课情况:

SELECT 学号,姓名,课程号,课程名
FROM COURSE CROSS JOIN SC

/指定查询结果分组方法*GROUP BY/
根据字段对记录分组,对结果集进行分组,常和聚合函数搭配使用。
在SELECT之后的字段名,除了GROUP BY之后的字段名和聚合函数之外,不能有其他字段名。

SELECT 专业,COUNT(*) AS 人数
FROM Student
GROUP BY 专业

/指定查询结果分组后筛选条件*HAVING/
HAVING子句可以使用聚合函数,而WHERE不可以。常和GROUP BY搭配使用,对分组数据进行过滤。
子句的执行顺序: FROM->WHERE->GROUP BY->HAVING

SELECT 学号
FROM Student
WHERE 成绩>=80
GROUP BY 学号
HAVING COUNT(*) > 2

/指定查询结果排序顺序*ORDER BY/
1.对查询结果排序输出
对查询结果排序输出,ASC升序,DESC降序

SELECT *
FROM Student
WHERE 专业=‘通信工程’
ORDER BY 出生时间

2.对结果排序附加汇总
COMPUTE BY子句 常跟在ORDER BY子句之后搭配使用。

/其他参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同 */
1.INTO 将SELECT查询结果保存到新建的表中去 SELECT..INTO..FROM..WHERE
2.UNION(并) 将多个SELECT查询结果集合并成一个结果集

查询计算机科学系的学生及年龄不大于19岁的学生。
        SELECT *
        FROM Student
        WHERE Sdept= 'CS'
        UNION
        SELECT *
        FROM Student
        WHERE Sage<=19

UNION:将多个查询结果合并起来时,系统自动去掉重复元组。
UNION ALL:将多个查询结果合并起来时,保留重复元组

3.EXCEPT(交)
查询计算机科学系的学生与年龄不大于19岁的学生的交集

SELECT *
    FROM Student
    WHERE Sdept='CS' 
    INTERSECT
    SELECT *
    FROM Student
    WHERE Sage<=19 
实际上就是查询计算机科学系中年龄不大于19岁的学生

4**.INTERSECT(差)**

查询计算机科学系的学生与年龄不大于19岁的学生的差集。

    SELECT *
    FROM Student
    WHERE Sdept='CS'
    EXCEPT
    SELECT  *
    FROM Student
    WHERE Sage <=19;
实际上是查询计算机科学系中年龄大于19岁的学生

5.CTE 在SELECT语句的最前面可以使用一条WITH子句指定临时结果集。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值