3.3 数据查询 DQL

3.3 数据查询 DQL

  • SELECT

格式

SELECT ALL|DISTINCT
FROM 
WHERE <条件表达式> 
GROUP BY <列名> [HAVING <条件表达式>]
ORDER BY <列名> [ ASC | DESC ] ];
  • ALL,默认情况下为ALL,即所有数据行,可改为DISTINCT,即去掉结果中的重复行
  • INTO,将结果插入新的表
  • FROM,指定被查询的数据来自哪些表
  • WHERE,只有满足WHERE的数据行才筛选出来
  • GROUP BY,对查询结果分组,进行统计,再可用HAVING定义分组的条件
  • ORDER BY,对结果排序。ASC升序、DESC降序。若未选定,则默认ASC

从表单中读出指定列

【例】学生信息表(Student)原始数据

读出所有数据

SELECT *
FROM Student;

读出部分列

SELECT StudentID, StudentName, Major
FROM Student;

从Student表中查询专业(Major)有几种,并去掉重复的结果

SELECT DISTINCT Major
FROM Student;

从单表读取指定的行

SQL查询语句在对数据表读取指定行时,必须使用WHERE子句来选择符合指定条件的元组数据。查询条件可以有 多个,但它们需要使用AND(与)、OR(或)等逻辑运算符进行条件表达式的连接。

读取某专业的男生的全部信息:

SELECT *
FROM Student
WHERE Major=’软件工程’ AND StudentGender=’男’;

从单表读取指定的行和列

读取某专业的男生的部分信息:

SELECT StudentID, StudentName, StudentGender, Major
FROM Student
WHERE Major=’软件工程’ AND StudentGender=’男’;

WHERE设定条件

  • 关键词:BETWEEN、AND、OR、LIKE、NOT LIKE
  • 通配符:_代表一个未指定的, %代表一个或多个未指定的字符
  • 比较运算符: > 、 < 、>= 、<= 、>< 、 =

【例】若要从Student表中查询出生日期在某区间

SELECT *
FROM Student
WHERE BirthDay BETWEEN '2000-01-01' AND '2000-12-30';

或者用比较运算符 >= <=

SELECT *
FROM Student
WHERE BirthDay >= ' 2000-01-01' AND BirthDay <=' 2000-12-30'

SELECT	first_name,last_name,phone,department
FROM	employee
WHERE	department = 'Accounting' OR phone = '360-285-8410';

【例】通配符_

SELECT *
FROM Student
WHERE StudentName LIKE ’林_';

【例】通配符%

SELECT *
FROM Student
WHERE Major LIKE ’计算机%';

【例】若要从Student表中查询专业为非“计算机”的学生数据,如下

SELECT *
FROM Student
WHERE Major NOT LIKE ’计算机%'

使用IN关键字:读取Accounting、Finance、Marketing部门工作的雇员。

SELECT	*
FROM	employee
WHERE	department IN ('Accounting','Finance','Marketing');
 

使用IS NULL关键词在WHERE子句中查找电话号码含有Null的行

SELECT   first_name,last_name,phone,department

FROM    employee

WHERE  phone IS NULL;

查询结果排序

  • ORDER BY

【例】若要从Student表中按学生出生日期升序输出学生数据

SELECT *
FROM Student
ORDER BY BirthDay ASC;

【例】首先按专业名升序排列,然后再按出生日期降序排列,

SELECT *
FROM Student
ORDER BY Major ASC, BirthDay DESC;
SELECT		department , COUNT(*) AS num_of_employees
FROM		employee
WHERE		employee_number < 6
GROUP BY	department
HAVING		COUNT(*) > 1;

错误的情况

除了后面将提到的GROUP BY语句外,列的名称是不允许和内置函数一起混合使用。以下语句不规范。
/******此句错误********/
SELECT	max_hours, SUM(max_hours)
FROM	project
WHERE	project_id <= 3;

除了后面将提到的GROUP BY语句外,列的名称是不允许和内置函数一起混合使用。以下语句不规范。内置函数是不能用于WHERE子句中的。以下语句不规范。
/******此句错误********/
SELECT	project_id, max_hours
FROM	project
WHERE	max_hours < AVG(max_hours);

查询---内置函数

用函数,对SELECT查询结果进行处理

函数分类

  • 系统自带的、自定义的。
  • 典型DBMS自带的:聚合函数、算术函数、字符串函数、日期时间函数、数据类型转换函数

1.聚合函数

  • AVG( )
  • COUNT( )
  • MIN( )
  • MAX( )
  • SUM( )

【例1】若要统计Student表中的学生人数,在SELECT语句中可 以使用COUNT()函数来计算

SELECT COUNT(*)
FROM Student;

观察到,结果中没有对应的列名

【例1+】用AS,对计算结果命名一个列名

SELECT COUNT(*) AS 学生人数
FROM Student;

使用COUNT()函数还可以按指定列统计满足条件的元组行数。

【例2】多个的统计

SELECT COUNT(Major) AS 学生专业数
		COUNT(*) AS 学生人数
FROM Student;

上面的查询语句执行结果为数值10,该结果显然不正确。其原因是查询统计中包含了若干相同专业的学生行。

【例2+】用关键词DISTINCT消除结果集中的重复

SELECT COUNT(DISTINCT Major) AS 学生专业数
FROM Student

【例3】找出Student表中年龄最大和年龄最小的学生出生日期

SELECT MIN(BirthDay) AS 最大年龄出生日期, Max(BirthDay) AS 最小年龄出生日期
FROM Student;

2.算术函数

  • SIN( )
  • COS( )
  • TAN( )
  • ASIN( ) 【求角度】
  • EXP( )
  • LOG( )
  • ROUND( ) 【四舍五入取整】

【例0】学生课程成绩表(Grade)原始数据如图3-32所示。

当需要对成绩数据进行四舍五入处理时,可以使用ROUND()算术函数进行处理

这些函数都遵循一个公共的调用习惯:第一个参数是待格式化的值,而第二个是定义输出或输入格式的模板

SELECT studentid, studentname, coursename, ROUND(grade, 0) AS Grade
FROM Grade;

3.字符串函数

用字符串函数对字符串表达式进行处理。这类函数输入数据的类型可以是字符串,也可以是数值类型,但数据输出为字符串类型。

【例3-31】若计算出Student表中各个学生的Email字符串长度

SELECT StudentID, StudentName, Email, LENGTH(Email) AS 邮箱长度
FROM Student;

在进行字符串处理时,空格也会作为一个字符。若要去掉字符串中的空格字符,需要使用LTRIM()、RTRIM()等空 格字符处理函数。

4.日期时间函数

对时间、日期进行处理,输入数据为日期时间类型,输出结果可以是日期、时间、字符串或数值类型数据。

【例3-32】读取系统当前日期数据,然后分别显示系统日期的年、月、日数据,其查询SQL语句如下。

SELECT date_part('year', current_date) as 年,date_part('month', current_date) as 月,
date_part('day', current_date) as 日;

上例的系统日期SQL处理使用了current_date函数获取当前日期数据,然后使用date_part函数,分别提取当前日期的 年、月、日数据。

5.数据类型转换函数

为了便于数据处理,SQL提供了不同数据类型之间的格式化转换函数。

  • TO_CHAR( )
    • 各种类型都转换为字符串
  • TO_DATE( )
    • 字符串转换为日期
  • TO_NUMBER
    • 字符串转换为数字
  • TO_TIMESTAMP
    • 字符串转换为时间戳

【例】在学生课程成绩数据中,分数(Grade)列数据类型为Numeric(3,1),其列数据中带有1位小 数。为了将该成绩数据转换为不带小数2位字符输出,可以使用数据类型转换函数处理,其查询SQL语句如下。

SELECT StudentID, StudentName, Coursename, TO_CHAR(Grade, '99' ) AS Grade FROM Grade;

查询---结果分组

  • GROUP BY
  • WHERE
  • HAVING

【例1】统计Student表中各个专业的学生人数

SELECT Major AS 专业, COUNT(StudentID) AS 学生人数
FROM Student
GROUP BY Major;

【例1+】统计各专业人数时, 再限定只显示人数大于3的专业人数。用 HAVING 加入限定条件

SELECT Major AS 专业, COUNT(StudentID) AS 学生人数
FROM Student
GROUP BY Major
HAVING COUNT(*)>3;

在SQL查询语句中,还可以同时使用HAVING子句和WHERE子句分别限定查询条件。

但是要先WHERE后HAVING

【例】若要分专业统计Student表中男生人数,但限定只显示人数大于2的人数

SELECT Major AS 专业, COUNT(StudentID) AS 学生人数
FROM Student
WHERE StudentGender=’男’
GROUP BY Major
HAVING COUNT(*)>2;

posted @ 2022-03-22 17:50  Dinesaw  阅读(62)  评论(0编辑  收藏  举报