1、结构化查询语言
1. 什么是SQL
结构化查询语言(Structured Query Language),后续通常简称SQL。SQL是用于存取数据以及查询、更新和管理关系数据库系统的标准语言。20世纪70年代由IBM公司开发,目前应用于各种关系型数据库。SQL是一套标准,百分之九十以上的SQL在各种关系型数据库中都是通用的,每种关系型数据库也有少量自己特定的操作方言。
2. SQL语言分类
SQL语言可分为如下5种
分类 | 名称 | 用途 | 代表关键字 |
DDL (Data Definition Language) | 数据定义语言 | 用来定义数据库、表及其它对象的结构 | CREATE、DROP、ALTER |
DML (Data Manipulation Language) | 数据操作语言 | 用来增加、修改、删除表中的数据 | INSERT、DELETE、UPDATE |
DQL (Data Query Language) | 数据查询语言 | 用来查询表中的数据 | SELECT、FROM、WHERE、ORDER BY 、GROUP BY、HAVING |
DCL (Data Control Language) | 数据控制语言 | 用来授予和收回权限 | GRANT、REVOKE |
TCL (Transaction Control Language) | 事务处理语言 | 用来对数据进行提交和回滚 | COMMIT、ROLLBACK |
3. SQL语言书写规范
在介绍SQL书写规范之前,先简单了解几个概念:
关键字:是SQL语言保留的字符串,有着的特殊的功能。
语句:是一条完整的SQL命令。数据库只能执行一条完整的SQL命令。
子句:是部分SQL命令。一个SQL语句可能会有多个子句构成。
为了增加程序的可读性,在写SQL的时候,通常需要遵守如下规范:
1、一条SQL语句可以单行书写,也可以书写多行,以分号结尾。建议多行书写,增强代码可读性,通常每条子句占一行。
2、适当增加缩进或空格,提高程序的可读性。
3、SQL语句不区分大小写,也就是说SELECT,select,Select,执行时效果是一样的,关键字最好使用大写,其它语法元素(如列名、表名等)小写。
4、不能使用关键字,关键字不可以缩写、分开以及跨行书写,如SELECT不可以写成SEL或SELE CT等形式。
2、DQL-简单查询
1. SELECT简单查询作用
通过简单查询,可以查询表中的所有列或者指定列,通过算术运算符、列别名以及消除重复行可以改变查询结果的显示方式。
2. SELECT查询所有列
2.1 语法
SELECT * | 列名1,列名2,...列名n
FROM table;
说明:
1、“*”号代表指定表中的所有列名;
2、“|” 代表“或者”的含义,所以SELECT子句后面可以既可以写“*”,也可以写所有的列名,不能两种方式都写;
3、如果使用第二种方式,每个列名之间必须要用逗号分隔,最后一个列名后面不写逗号;
4、FROM子句后面写要查询的表名;
5、SQL语句的最后需要加分号;
例:查询所有部门信息
SELECT * FROM dept;
或者
SELECT deptno,dname,loc FROM dept;
DEPTNO | DNAME | LOC |
10 | ACCOUNTING | NEW YORK |
20 | RESEARCH | DALLAS |
30 | SALES | CHICAGO |
40 | OPERATIONS | BOSTON |
如上两种查询方式的结果完全相同,建议使用第二种方式,可读性强,效率稍高。
3. SELECT查询指定列
3.1 语法
SELECT 列名1[,列名2,...列名n]
FROM table;
说明:
1、[ ] 中括号里面的内容可以省略;
2、想显示哪列,写对应的列名就可以。
例:查询所有部门的部门编号、部门所在地
SELECT deptno,loc
FROM dept;
查询结果如下:
DEPTNO | LOC |
10 | NEW YORK |
20 | DALLAS |
30 | CHICAGO |
40 | BOSTON |
4. 算术运算符
4.1 算术运算符作用
可以在SELECT子句中使用算术运算符(只对数值型数据起作用),来改变查询结果的显示方式。
算术运算符包括:
运算符 | 作用 |
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
例:查询每个员工的姓名,工资,以及工资增加300后的金额。
SELECT ename, sal, sal+300
FROM emp;
查询结果如下:
ENAME | SAL | SAL+300 |
KING | 5000 | 5300 |
BLAKE | 2850 | 3150 |
CLARK | 2450 | 2750 |
JONES | 2975 | 3275 |
MARTIN | 1250 | 1550 |
ALLEN | 1600 | 1900 |
4.2 算术运算符优先级
- 乘除优先于加减
- 相同优先级按照从左至右的顺序依次计算
- 可以使用括号提升优先级
例:比较如下两条SQL语句的查询结果,理解算术运算符优先级。
语句1:
SELECT ename, sal, 12*sal+100
FROM emp;
语句2:
SELECT ename, sal, 12*(sal+100)
FROM emp;
语句1的查询结果如下:
ENAME | SAL | 12*SAL+100 |
KING | 5000 | 60100 |
BLAKE | 2850 | 34300 |
CLARK | 2450 | 29500 |
JONES | 2975 | 35800 |
MARTIN | 1250 | 15100 |
...... | ...... | ...... |
语句2的查询结果如下:
ENAME | SAL | 12*(SAL+100) |
KING | 5000 | 61200 |
BLAKE | 2850 | 35400 |
CLARK | 2450 | 30600 |
JONES | 2975 | 36900 |
MARTIN | 1250 | 16200 |
...... | ...... | ...... |
5. 空值
5.1 空值的含义
空值用NULL表示,表示一种无效的、未知的值,空值不是零,也不是空格。
例:查询员工姓名,岗位,工资,津贴
SELECT ename, job, sal, comm
FROM emp;
查询结果如下,其中SMITH的津贴为NULL值。
ENAME | JOB | SAL | COMM |
SMITH | CLERK | 800.00 | NULL |
ALLEN | SALESMAN | 1600.00 | 300.00 |
WARD | SALESMAN | 1250.00 | 500.00 |
..... | ..... | ..... | ..... |
5.2 空值参与运算
空值参与算术运算,运算后的结果仍为NULL
例:查询员工姓名,工资,津贴,以及工资和津贴的和。
SELECT ename,sal,comm,sal+comm
FROM emp;
查询结果如下,可以看到空值参与算术运算后,结果仍为空值
ENAME | SAL | COMM | SAL+COMM |
SMITH | 800 | NULL | NULL |
ALLEN | 1600 | 300 | 1900 |
WARD | 1250 | 500 | 1750 |
JONES | 2975 | NULL | NULL |
...... | ...... | ...... | ...... |
5.3 空值的解决方法(扩展)
用ifnull(comm,0)来解决空值的问题,如果comm不为空,就返回原值 ,如果为空则返回默认值0
select ename,sal,comm,sal+ifnull(comm,0)
from emp;
查询结果
6. 列别名
6.1列别名作用及语法
列别名用来给查询语句中的列或者表达式重新命名,使语句的可读性更强。
语法:
SELECT 列名1 | 表达式1 [as] [列别名1],
列名2 | 表达式2 [as] [列别名2],
..列名n | 表达式n [as] [列别名n]
FROM table;
说明:
1、列别名可以直接写在列名或者表达式的后面,也可以加as关键子,加不加as没有任何区别,通常不加。
2、如果SELECT子句中有计算表达式,通常使用列别名。
例:查询员工姓名,工资,年薪(年薪=工资*12)
SELECT NAME , SAL , SAL*12 YearSal
FROM EMP;
查询结果如下:注意列的标题显示的是别名
ENAME | SAL | YearSal |
SMITH | 800 | 9600 |
ALLEN | 1600 | 19200 |
WARD | 1250 | 15000 |
JONES | 2975 | 35700 |
...... | ...... | ...... |
注意:以下情况列别名两侧需要添加双引号
1、列别名中包含有空格
2、列别名中包含有特殊字符,如%,- 等。
例:查询员工姓名,工资,年薪(列别名要求Year Sal , 注意中间有空格)
SELECT NAME , SAL , SAL*12 "Year Sal"
FROM EMP;
6.2 课堂练习(2分钟)
- 查询出所有员工姓名、工资,以及工资上调20%之后的数值。
7. 消除重复行
7.1 消除重复行作用及语法
重复行是查询结果中有完全相同的数据行,如下面结果中第一行和第二行就是重复行。
JOB | DEPTNO |
SALESMAN | 30 |
SALESMAN | 30 |
MANAGER | 30 |
消除重复行是消除相同的查询结果,只保留一行重复数据,使用关键字 DISTINCT 来完成。
语法:
SELECT DISTINCT 列名1,列名2,....列名n
FROM table;
例:执行如下SQL语句,观察结果。
SELECT DISTINCT deptno
FROM emp;
DEPTNO |
10 |
20 |
30 |
上述SQL语句的查询结果为:显示员工表中有几种不同的部门编号。
也可以使用DISTINCT关键字消除多列重复数据(同时考虑所有列的数据重复)
例:执行如下SQL语句,观察结果。
SELECT DISTINCT deptno,job
FROM emp;
DEPTNO | JOB |
20 | CLERK |
30 | SALESMAN |
20 | MANAGER |
30 | MANAGER |
10 | MANAGER |
20 | ANALYST |
10 | PRESIDENT |
30 | CLERK |
10 | CLERK |
可以看出,上述SQL语句的查询结果为:显示员工表中,每个部门有哪些不同的岗位类型。