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;