当前位置:   article > 正文

SQL之数据查询_sql中查询其中一个

sql中查询其中一个

SQL 92标准的数据查询语法格式:

  1. SELECT [ALL | DISTINCT] <属性列表名> /*如果没有指定DISTINCT短语,则默认为ALL,即保留结果中取
  2. 值重复的行*/
  3. FROM<表名或视图名> [,<表名或视图名>]...
  4. [WHERE<条件表达式>]
  5. [GROUP BY <列名>]
  6. [HAVING <条件表达式>]
  7. [ORDER BY <列名> [ASC | DESC] ];

SELECT类似于关系代数中的投影运算;WHERE子句的功能类似关系代数中的选择运算

GROUP将结果按照<列名> 旳值进行分组,该属性列名相等的分一组,每个组产生结果表中的一条记录,通常使用集函数,若带有HAVING短语,则结果只有满足条件的组才被选择出来。

ORDER BY 将查询的结果进行排序显示(ASC--升序;DESC--降序;默认升序)


  • SELECT子句中可以出现计算表达式
  1. SELECT 学号,2019-出生年份
  2. FROM 学生; 
  • 添加列别名
  1. COLUMN AS <别名> 或者 <别名>
  2. 例:
  3. SELECT 学号,2019-出生年份 AS 年龄
  4. FROM 学生; 
常用查询条件
查询条件谓词
比较=、<>、>、<、>=、<=
算术运算+、-、*、/
确定范围BETWEEN AND,NOT BETWEEN AND
确定集合IN,NOT IN
字符匹配(模糊匹配)LIKE,NOT LIKE
空值IS NOLL,IS NOT NOLL
多重条件AND,OR

通配符:%代表任意长度;_代表任意单个字符

若要查询的字符本身含有%、_,此时需要借助ESCAPE'\'对通配符进行转义(如ABC_CNAME)

  1. SELECT 学号,课程名
  2. FROM SC;
  3. WHERE 课程名 LIKE 'ABC\_CNAME' ESCAPE'\'
  4. /*ESCAPE'\'表示‘\’为转码字符,则在‘\’后的‘_’不在具有通配符的含义*/ 

  


常用集函数
COUNT([DISTINCT|ALL] *)统计元组个数
COUNT([DISTINCT|ALL ] <列名>)统计一列中值的个数
SUM([DISTINCT|ALL ] <列名>)计算一列值的总和
AVG([DISTINCT|ALL ] <列名>)计算一列值的平均值
MAX([DISTINCT|ALL ] <列名>)求一列值中的最大值
MIN([DISTINCT|ALL ] <列名>)求一列值中的最小值
  • 连接查询

连接方法可分为theta方式和ANSI方式两种:

  使用WHERE条件连接的方法属于theta方式,要实现外部连接需要在字句中设置特殊字符+、*;

  使用JOIN关键字配合USING、ON等连接条件完成外部连接为ANSI方式;

外连接查询 

右外链接:规定所有记录都应该从链接语句右侧的表中返回。即使左侧的表中并没有匹配的记录,右表中该记录依然会返回,此时,左表的列将返回NULL值。

***内连接:只有满足连接条件的元组,即左右表中均有匹配的记录,才能作为结果返回***

  1. SELECT sname,cno,grade
  2. FROM S,SC
  3. WHERE SC.sno=(+)S.sno;--在等号左边(左外链接)--theta
  4. SELECT sname,cno,grade
  5. FROM S,SC
  6. RIGHT OUTER JOIN C ON SC.sno=(+)S.sno; --ANSI
  •  集合运算连接查询
运算符
UNION
INTERSECT
EXCEPT
均自动去除重复,若想保留在运算符后加ALL
  1. (SELECT sno,cno,grade
  2. FROM SC
  3. WHERE cno='011001')
  4. EXCEPT
  5. (SELECT sno,cno,grade
  6. FROM SCsno,cno,grade
  7. WHERE cno='011002')--选修了011001号课程的学生中没有选修011002号课程的学生的sno,cno,grade
  • 嵌套查询

 由里向外依次处理

  1. SELECT sname
  2. FROM S
  3. WHERE sno IN
  4. (SELECT sno
  5. FROM SC
  6. WHERE cno='011001');
  7. /*SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询
  8. 需要注意:子查询SELECT语句中不能使用ORDER BY子句,ORDER BY语句只对最终查询结果排序*/

带有EXISTS谓词的子查询

EXISTS代表存在量词,带有EXISTS谓词的子查询不返回数据,只产生逻辑值true or false。

  1. --查询选修了01001课程的学生学号和姓名
  2. SELECT sname,sno
  3. FROM S
  4. WHERE EXISTS
  5. (SELECT * --此处的目标列表达式通常用*,因为此处返回真假值,给出列名无实际意义
  6. FROM SC
  7. WHERE S.sno=SC.sno
  8. AND SC.cno='01001');
  9. /*执行顺序:
  10. 从S表中依次取出每个元组的sno,用此值去检查SC表。
  11. 若SC表存在这样的元组,其sno与此S.sno相等,并且该学生学习的课程号为01001.则取此学生的sno,sname送入结果表*/

几个典型的除法问题:

1.查询至少选修了001号学生选修的全部课程的学生学号

  1. SELECT DISTINCT sno
  2. FROM SC AS A
  3. WHERE NOT EXISTS
  4. (SELECT *
  5. FROM SC AS B
  6. WHERE B.sno='001'
  7. AND NOT EXISTS
  8. (SELECT *
  9. FROM SC ASC
  10. WHERE A.sno=B.sno
  11. AND B.cno=C.cno));

2.查询选修了全部课程的学生姓名

  1. SELECT sname
  2. FROM S
  3. WHERE NOT EXISTS
  4. (SELECT *
  5. FROM C
  6. WHERE NOT EXISTS
  7. (SELECT *
  8. FROM SC
  9. WHERE sno=S.sno
  10. AND cno=C.cno));

3.查询被所有学生都选修的课程名

  1. SELECT cname
  2. FROM C
  3. WHERE NOT EXISTS
  4. (SELECT *
  5. FROM S
  6. WHERE NOT EXISTS
  7. (SELECT *
  8. FROM SC
  9. WHERE sno=S.sno
  10. AND cno=C.cno));

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/997145
推荐阅读
相关标签
  

闽ICP备14008679号