DQL 语言
1 编写基本 SELECT 语句
SELECT 语句的作用是从数据库中返回信息。
1.1SELECT 语句作用
1.1.1列选择(投影操作)
能够使用 SELECT 语句的列选择功能选择表中的列,这些列是我们想要用查询返回 的。当我们查询时,可在选择查询的表中指定的列。
1.1.2行选择(选择操作)
能够使用 SELECT 语句的行选择功能选择表中的行,这些行是我们想要用查询返回 的。能够使用不同的标准限制所看见的行。
1.1.3连接(多表操作)
能够使用 SELECT 语句的连接功能来集合数据,这些数据虽然被存储在不同的表中, 但是我们可以通过连接查询到该数据。
1.2SELECT 语句基本结构
SELECT*|{[DISTINCT]column|expression[alias],…}FROMtable; SELECT 确定哪些列。 FROM 确定哪张表。
1.2.1基本 SELECT 语句
在最简单的形式中,SELECT 语句必须包含下面的内容: 一个 SELECT 子句,指定被显示的列 一个 FROM 子句,指定表,该表包含 SELECT 子句中的字段列表
1.2.2在语法中
SELECT 是一个或多个字段的列表 * 选择所有的列 DISTINCT 关键字表示禁止重复 column|expression 选择指定的字段或表达式 alias 给所选择的列不同的标题 FROMtable 指定包含列的表
1.3选择操作(投影操作)
1.3.1选择所有列
SELECT*FROMtable;
1.3.2选择指定的列
SELECTcolumnName,columnName FROMtable;
1.4SQL 语句语法要求
•SQL 语句对大小写不敏感 •SQL 语句可以写成一行或多行 • 关键字不能简写或分开折行 • 子句通常放在不同的行 • 缩进用于增强可读性
1.5SELECT 语句中的算术表达式
用算术运算符创建数字和日期数据的表达式。(±*/) 注意:如果对日期进行计算,我们只能对 DATE 和 TIMESTAMP 数据类型使用加和 减操作。
1.5.1运算符的优先级
• 乘法和除法比加法和减法的优先级高 • 相同优先级的运算符从左到右计算 • 圆括号用于强制优先计算,并且使语句更清晰
1.5.2示例
计算 employees 表中的员工全年薪水加 100 以后的薪水是多少? select employee_id , first_name ,salary *12 +100 from employees;
计算 employees 表中的员工薪水加 100 以后的全年薪水是多少? select employee_id,first_name ,(salary+100)*12 from employees;
1.6定义空值
空值是一个未分配的、未知的,或不适用的值 空值不是 0,也不是空格
1.6.1空值
如果一行中的某个列缺少数据值,该值被置为空值。空值和 0 或者空格不相同。0 是 一个数字,而空格是一个字符。任何数据类型的列都可以包含空值。可是,某些约束,如, NOTNULL 和 PRIMARYKEY,防止在列中使用空。
1.6.2算术表达式中的空值
包含空值的算术表达式计算结果为空。
1.6.3示例
select last_name ,12salarycommission_pct from employees;
1.7定义列别名
列别名: • 改变列标题的名字 • 紧跟在列名后面 – 在列名和别名之间可以有选项 AS 关键字 • 如果别名中包含有空格、或者特殊字符、或者大小写敏感,要求用双引号
在 SELECT 列表中的列名后面指定别名,列名和别名之间用空格分开。默认情况下, 别名标题用大写字母显示。如果别名中包含空格或者特殊字符(例如 # 或 &),或者 大小写敏感,将别名放在双引号 (“”) 中。
1.7.1示例
查询 employees 表中的 last_name,commission_pct 并将佣金列名改为 comm。 方式一:select last_name ,commission_pct as comm from employees; 方式二:select last_name name ,commission_pct comm from employees;
计算所有员工的全年薪水,将列名修改”AnnualSalary”。 方 式 一:select last_name name ,12salary as “Annual Salary” from employees; 方式二: selectlast_namename,12salary"AnnualSalary"fromemployees;
1.8连字运算符
连字运算符: • 连接列或者字符串到其它的列 • 用两个竖线表示 (||) • 构造一个字符表达式的合成列
我们能够用连字运算符 (||) ,进行列与列之间、列与算术表达式之间或者列与常数值 之间的连接,来创建一个字符表达式。连字运算符两边的列被合并成一个单个的输出列。
1.8.1示例
将 employees 表中的 LAST_NAME 和 JOB_ID 合并到一个单个的输出列中,并且指定 列别名 Employees。 select last_name || job_id as “Employee” from employees;
1.9文字字符串
文字字符串是包含在 SELECT 列表中的一个字符串,一个数字或者一个日期 • 日期和字符的文字字符串值必须用单引号括起来 • 每个文字字符串在每行输出一次
文字字符串不是列名或别名。对每个返回行打印一次。任意格式文本的文字字符串能够 被包含在查询结果中,并且作为 SELECT 列表中的列处理。日期和字符文字 必须 放在单 但引号 (’’) 中;数字不需要。
1.9.1示例
显示所有雇员的名字和工作代码,使用 isa 链接查询结果。列标题用 Employee Details。 select last_name || ’ is a ’ || job_id as “Employee Details” from employees;
1.10去除重复行
在 SELECT 语句中用 DISTINCT 关键字除去相同的行。为了在结果中除去相同的行, 在 SELECT 子句中的 SELECT 关键字后面紧跟 DISTINCT 关键字。
1.10.1 示例
在 Employees 表中查询 department_id 并去除重复数据。 select distinct department_id from employees;
1.11基本 select 语句小节练习
1.11.1 在下面的语句中有 4 个编码错误,你能找出他们吗?
SELECTemployee_id,last_name salx12ANNUALSALARY FROMemployees;
答案:1 在 employees 表中没有 sal 列,应该是 salary。 2 乘法运算符是“*”而不是“x”。 3 如果别名中包含空格,则需要在别名两侧添加双引号。 4 在 last_name 后少一个逗号。
1.11.2 显示 DEPARTMENTS 表的结构。选择表中的所有数
据。
答案:显示表结构: desc departments; 查询所有数据:select * from departments;
1.11.3 创建一个查询,显示每个雇员的 last name, job code, hiredate, 和 employee 号,employee 号显示在第一列, 给 HIRE_DATE 列指定一个别名 STARTDATE 。
答案:selectemployee_id,last_name,job_id,hire_date startdatefrom employees;
1.11.4 创建一个查询从 EMPLOYEES 表中显示唯一的工作
代码。
答案:select distinct job_id from employees;
1.11.5 显示 last_name,用 job_ID 连接,用逗号和空格分开, 用 EmployeeandTitle 作为列名。
答案:select last_name || ', ’ ||job_id from employees;