《数据库系统概论》 -- 3.3DML之数据查询

SELECT语句一般格式

  SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>...]

  FROM <表名或视图名> [,<表名或视图名>...]|(<SELECT语句>)[AS] <别名>

  [WHERE <条件表达式>]

  [GROUP BY <列名1>[,<列名2>...] [HAVING <条件表达式>]]

  [ORDER BY <列名3>[,<列名4>...] [ASC|DESC]];

SELECT语句注意事项

  1.distinct后跟多个列,结果为多个列的一起去重后的结果

  2.目标列表达式

    *
    <表名>.*
    COUNT([DISTINCT|ALL] *)
    [<表名>.]<属性列名表达式>
    属性列名表达式可以是由属性列、做用于属性列的聚集函数和常量的任意算术运算(+-*/)组成的运算公式

  3.聚集函数的一般格式

    

    COUNT(*)计算时空值也计算在内,其他的不统计空值

    聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句

      聚集函数用于SELECT子句:对象为基本表或视图

      聚集函数用于GROUP BY的HAVING子句:对象为GROUP BY分出来的组

  4.WHERE子句的条件表达式可选格式

    

    BETWEEN AND包括边界值,NOT BETWEEN AND不包括边界值,需注意如果使用between and 限定日期需要注意,如果and后的日期是到天的,那么默认为00:00:00 例如:and 后的日期为2013年3月24日,就等价于2013-3-24 00:00:00 ,那么2013-3-24 18:28:38的数据就差不到了,需要进行to_char处理。

    AND的优先级大于OR

  5.其他关键词:
    连接查询
      <表1> [<LEFT|RIGHT> OUTER] JOIN <表2> [ON <条件表达式> | USING <公共列名>]
    集合查询
      <SELECT查询> <UNION|INTERSECT|EXCEPT> <SELECT查询>

      参加集合查询的各查询结果的列数必须相同;对应项的数据类型也必须相同

      并集UNION会自动去重

  6.子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序

  7.聚集函数实现子查询的效率要比直接用ANY/ALL的效率高

  8.mysql的FROM子句中不支持as t(d1,d2...),主要是不支持t(d1,d2...)

  9.如果表格数据多,可以在要查找的列上建立索引

举例:(很长---------------------------------------------------------------)

单表查询

  查询指定列

    查询全体学生的学号与姓名

      SELECT
Sno, Sname FROM Student;

    查询全体学生的姓名、学号、所在系

      SELECT Sname, Sno, Sdept FROM Student;

  查询全部列

    查询全体学生的详细记录

      SELECT
* FROM Student;

  查询经过计算的值--算术运算

    查询全体学生的姓名及其出生年份

      SELECT Sname, 2017-Sage FROM Student;

    查询全体学生的姓名、出生年份和所在院系,所在院系用小写字母表示

      SELECT Sname, ‘Year of Birth:‘,
2017-Sage,LOWER(Sdept) FROM Student;

    <目标列表达式>别名

      SELECT
Sname, ‘Year of Birth:‘ BIRTH,2017-Sage BIRTHDAY, LOWER(Sdept) DEPARTMENT from
Student;

  选择表中的若干元组

    比较大小--逻辑运算

      查询计算机科学系全体学生的名单

        SELECT
Sname FROM Student WHERE Sdept=‘CS‘;

      查询所有年龄在20岁以下的学生姓名及其年龄

        SELECT
Sname, Sage FROM Student WHERE Sage<20;

      查询考试成绩不及格的学生的学号

        SELECT
DISTINCT Sno FROM SC WHERE Grade<60;

    确定范围--[NOT] BETWEEN AND

      查询年龄在20~23岁之间的学生姓名、系别和年龄(包括20和23)

        SELECT
Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;

      查询年龄不在20~23岁之间的学生姓名、系别和年龄

        SELECT
Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;

    确定集合--[NOT] IN

      查询既不是计算科学系、数学系,也不是信息系的学生的姓名和性别

        SELECT
Sname,Ssex FROM Student WHERE Sdept NOT IN (‘CS‘,‘MA‘,‘IS‘);

    字符匹配--[NOT] LIKE

      查询学号为201215121的学生的详细情况

        SELECT
* FROM Student WHERE Sno LIKE ‘201215121‘;

      查询所有姓刘的学生的姓名、学号和性别

        SELECT
Sname,Sno,Ssex FROM Student WHERE Sname LIKE ‘刘%‘;

      查询姓“欧阳”且全名为三个汉字的学生的姓名

        SELECT Sname FROM Student WHERE Sname LIKE
‘欧阳_‘;

      查询名字中第二个字为“阳”的学生的姓名和学号

        SELECT
Sname, Sno FROM Student WHERE Sname LIKE ‘_阳%‘;

      查询所有不姓刘的学生的姓名、学号和性别

        SELECT
Sname, Sno,Ssex FROM Student WHERE Sname NOT LIKE ‘刘%‘;

      查询DB_Design课程的课程号和学分

        SELECT
Cno, Ccredit FROM Course WHERE Cname LIKE ‘DB\_Design‘ ESCAPE ‘\‘;

      查询以‘DB_‘开头,且倒数第三个字符为i的课程的详细情况

        SELECT
* FROM Course WHERE Cname LIKE ‘DB\_%i__‘ ESCAPE ‘\‘;

    涉及空值的查询--IS [NOT] NULL

      查询缺少成绩的学生的学号和相应的课程号

        SELECT
Sno,Cno FROM SC WHERE Grade IS NULL;

      查询所有有成绩的学生学号和课程号

        SELECT
Sno,Cno FROM SC WHERE Grade IS NOT NULL;

    多重条件查询--<AND|OR|NOT>

      查询计算机科学系年龄在20岁以下的学生姓名

        SELECT Sname FROM Student WHERE Sdept=‘IS‘
AND Sage<20;

      AND的优先级大于OR

    元组排序--ORDER
BY

      查询选修了3号课程的学生的学号及其成绩,结果按分数降序排列

        SELECT Sno, Grade FROM SC WHERE Cno=‘3‘
ORDER BY Grade DESC;

      默认升序ASC,降序用DESC表示

      查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按其年龄降序排列

        SELECT
* FROM Student ORDER BY Sdept, Sage DESC;

    聚集函数

      元组分组--GROUP
BY [HAVING]

        查询各个课程号及相应的选课人数

          SELECT
Cno,Count(Sno) FROM SC ORDER BY Cno;

        查询选修了三门以上的课程的学生序号

          SELECT
Sno FROM SC ORDER BY Sno HAVING COUNT(Cno)>=3;

        查询平均成绩大于90分的学生的学号和他的平均成绩

          SELECT
Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)>90;

多表查询--连接查询

  查询每个学生及其选课课程的情况(等值连接查询)保留重复列

    SELECT Student.*, SC.* FROM Student, SC
WHERE Student.Sno=SC.Sno;

  查询每个学生及其选课课程的情况(自然连接查询)去除重复列

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

  查询选修2号课程且成绩在90分以上的所有学生的学号和姓名

    SELECT Student.Sno,Sname FROM Student,SC
WHERE Student.Sno=SC.Sno AND Cno=‘2‘ AND Grade>90;

  自身连接

    查询每一门课的间接先修课(即先修课的选修课)

      SELECT
C1.Cno,C2.Cpno FROM Course C1,Course C2 WHERE C2.Cno=C1.Cpno;

  外连接--[LEFT|RIGHT] [OUTER] JOIN [ON <条件表达式>|USING <列名>]

    查询每个学生及其选修课程的情况

      SELECT Student.Sno,Sname,Cno,Grade FROM
Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);

      SELECT
[Student.]Sno,Sname,Cno,Grade FROM Student LEFT OUTER JOIN SC USING (Sno);

多表连接

  查询每个学生的学号、姓名、选修的课程名及成绩

    SELECT Student.Sno,Sname,Cname,Grade FROM
Student,SC,Course WHERE Student.Sno=SC.Sno AND Course.Cno=SC.Cno;

    查询过程:先进行两个表的连接,再将其结果与第三个表进行连接

嵌套查询

  带有IN谓词的子查询

    不相关子查询

    查询与“刘晨”在同一个系学习的学生

      SELECT Sname From Student WHERE Sdept IN

      (SELECT
Sdept FROM Student WHERE Sname=‘刘晨‘);

    不相关子查询

    查询选修了“信息系统”的学生学号和姓名

      SELECT Sno,Sname FROM Student WHERE Sno IN

      (SELECT Sno FROM SC WHERE Cno IN

      (SELECT
Cno FROM Course WHERE Cname=‘信息系统‘));

  带有比较运算符的子查询(子查询返回单值)

    相关子查询

    找出每个学生超过他自己选修课程平均成绩的课程号

      SELECT Sno,Cno FROM SC SC1 WHERE

      Grade>=(SELECT AVG(Grade) FROM SC SC2
WHERE SC2.Sno=SC1.Sno);

  带有ANY(SOME)或ALL谓词的子查询(子查询返回多值)--<ANY|SOME>

    查询非计算机科学系中,比计算机科学系任意一个学生年龄小的学生姓名和年龄

      SELECT Sname,Sage FROM Student WHERE
Sage<ANY(

      SELECT
Sage FROM Student WHERE Sdept=‘CS‘) AND Sdept!=‘CS‘;

    查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名

      SELECT Sname From Student WHERE Sage<ALL(

      SELECT
Sage FROM Student WHERE Sdept=‘CS‘) AND Sdept!=‘CS‘;

  带有EXISTS谓词的子查询--[NOT] EXISTS

    查询所有选修了1号课程的学生姓名

      SELECT Sname FROM Student WHERE EXISTS (

      SELECT * FROM SC WHERE Sno=Student.Sno AND
Cno =‘1‘);

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

      拿所有课程去这个学生的选修课程里面对,不存在没有的,即可

      SELECT Sname FROM Student WHERE NOT EXISTS
(

      (SELECT * FROM Course WHERE Cno NOT IN (

      SELECT
Cno FROM SC WHERE Sno=Student.Sno)));

    查询至少选修了学生201215122选修的全部课程的学生号码

      拿201215122选秀的全部课程去每个学生选修的课程里面对,如果每个都有,则返回该学生的号码

      SELECT Sno FROM Student WHERE NOT EXISTS (

      SELECT Cno FROM SC WHERE Sno=‘201215122‘
AND Cno NOT IN (

      SELECT Cno FROM SC WHERE Sno=Student.Sno

      ));

集合查询--<UNION|INTERSECT|EXCEPT>

  查询计算机科学系的学生及年龄不大于19岁的学生

    SELECT * FROM Student WHERE Sdept=‘IS‘

    UNION

    SELECT
* FROM Student WHERE Sage<=19;

  查询选修了课程1或者选修了课程2的学生

    SELECT Sno FROM SC WHERE Cno=‘1‘

    UNION

    SELECT
Sno FROM SC WHERE Cno=‘2‘;

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

    SELECT * FROM Student WHERE Sdept=‘IS‘

    INTERSECT

    SELECT
* FROM Student WHERE Sage<=19;

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

    SELECT * FROM Student WHERE Sdept=‘IS‘

    INTERSECT

    SELECT
* FROM Student WHERE Sage<=19;

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

    SELECT * FROM Student WHERE Sdept=‘IS‘

    EXCEPT

    SELECT
* FROM Student WHERE Sage<=19;

基于派生表的查询--<select查询> AS <别名>

  SELECT子查询出现在FROM子句中,该子查询称为临时派生表

  找出每个学生超过他自己选修课程平均成绩的课程号

    SELECT Sno FROM SC, (SELECT Sno, AVG(Grade)
FROM SC GROUP BY Sno ) AS Avg_sc(avg_sno,avg_grade)

    WHERE Sno=avg_sno AND Grade>=avg_grade;

    注:mysql中写法:mysql不支持as t(d1,d2...)

    SELECT Sno,Cno FROM SC, (SELECT Sno avg_sno,
AVG(Grade) avg_grade FROM SC GROUP BY Sno ) AS Avg_sc

    WHERE
Sno=avg_sno AND Grade>=avg_grade;* FROM Student;

时间: 2024-10-19 23:56:29

《数据库系统概论》 -- 3.3DML之数据查询的相关文章

《数据库系统概论》 -- 6关系数据理论

关系模式五元组 R<U,D,DOM,F> R--关系名 U--属性(组) D--U中的属性所来自的域 DOM--属性到域的映射 F--U中的数据依赖(函数依赖.多值依赖.连接依赖等) 数据依赖不良会带来的危害 数据冗余 更新异常 插入异常 删除异常 函数依赖 概念         X,Y是R的子集,不存在任意两个元组在X上的取值相等,而在Y上的取值不等,称Y函数依赖于X,记作X→Y. 关系举例         Student(Sno,Sname,Cno,Cname,Sdept,Dept_man

数据库系统概论(第四版)习题解答

数据库系统概论(第四版) 第1章 绪论 1 .试述数据.数据库.数据库系统.数据库管理系统的概念. 答:( l )数据( Data ) :描述事物的符号记录称为数据.数据的种类有数字.文字.图形.图像.声音.正文等.数据与其语义是不可分的.解析在现代计算机系统中数据的概念是广义的.早期的计算机系统主要用于科学计算,处理的数据是整数.实数.浮点数等传统数学中的数据.现代计算机能存储和处理的对象十分广泛,表示这些对象的数据也越来越复杂.数据与其语义是不可分的. 500 这个数字可以表示一件物品的价格

数据库系统概论学习笔记-第一章绪论

数据库系统概论-第一章绪论 写在前面:寒假来临,除却走亲戚和同学聚餐,王者荣耀等游戏上分花销一点时间之外,自认为要花一点时间学习数据库和Android,以此来为下学期和共建项目打下一丢丢的基础.为了鞭策自己,定了一个小目标( 一个亿),每个两至三天我会发表一篇数据库或Android学习笔记.还是那句话你的才华撑不住你的野心时,那就静下来学习吧 . 数据库系统概述 数据库常用的术语和基本概念 数据库基本概念 数据(Data) 数据是数据库中存储的基本对象,可以对数据做如下定义:描述事物的符号记录称

《数据库系统概论(第5版)》课后习答案 王珊、萨师煊编著版 课后题解析 高等教育出版社出版 答

<数据库系统概论(第5版)>课后习答案 王珊.萨师煊编著版 课后题解析 高等教育出版社出版 答案与解析 <数据库系统概论(第5版)> 王珊.萨师煊编著版 第二篇 第1章 课后答案与解析 完整答案在页面最下方 前言第一篇 基 础 篇 课后习题答案与解析第1章 绪论 课后习题答案与解析1.1 数据库系统概述1.2 数据模型1.3 数据库系统的结构1.4 数据库系统的组成1.5 小结习题本章参考文献第2章 关系数据库 课后习题答案与解析2.1 关系数据结构及形式化定义2.2 关系操作2.

《数据库系统概论》 -- 3.1SQL概论和DDL

3.1 SQL特点 综合统一 集数据定义语言.数据操纵语言.数据控制语言的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动 关系模型中实体和实体间的联系均用关系表示,数据结构的单一性带来了数据操作符的统一性 高度非过程化 存取路径的选择以及SQL的操作过程由系统自动完成,提高了数据独立性 面向集合的操作方式 relation-at-a-time 以同一种语法结构提供多种使用方式 独立的语言:可以直接命令行键入SQL命令操作 嵌入式语言:也可以嵌入到高级语言(C.C++.JAVA)

MongoDB数据查询

启动MongoDB:sudo service mongodb start,mongo 经测试,键可加引号也可不加,但是值一般要加引号,数值类型除外 MongoDB区分大小写,命名通常采用驼峰式命名法 MongoDB在使用数据库,插入集合等情况下,若数据库/集合不存在将自动创建 数据查询find() db.<集合名>.find({<键名>:<值>,...}) 格式化结果集:后加.pretty()即db.<CollectionName>.find({key:'v

用python操作mysql数据库(之数据查询结果返回字典类型)

#!/usr/bin/env python # -*- coding: utf-8 -*- import MySQLdb #建立连接 conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='1qaz#EDC',db='test_db') cur = conn.cursor(MySQLdb.cursors.DictCursor) #建立游标时,加上"MySQLdb.cursors.DictCursor",让数据查询结果返回字

SharePoint服务器端对象模型 之 使用CAML进展数据查询

SharePoint服务器端对象模型 之 使用CAML进行数据查询 一.概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列表条目的集合. 除去列表上的查询之外,在SharePoint中还大量存在着各种各样的查询,比如针对回收站的SPRecycleBinQuery.针对审计的SPAuditQuery.针对变更的SPChangeQuery等等,不过这些查询在实际项目中使用到的频率并不是很高.本章节还是着重介绍列表查询功能.

6、SQL Server 数据查询

一.使用SELECT检索数据 数据查询是SQL语言的中心内容,SELECT 语句的作用是让数据库服务器根据客户要求检索出所需要的信息资料,并按照规定的格式进行整理,返回给客户端. SELECT 语句的基本结构 [WITH<common_tale_expression>] SELECT select_list [INTO new_table_name] [FROM table_source][where search_condition] [GROUP BY group_by_expressio