结构化查询语言(Structured Query Language),后续通常简称SQL。SQL是用于存取数据以及查询、更新和管理关系数据库系统的标准语言。20世纪70年代由IBM公司开发,目前应用于各种关系型数据库。SQL是一套标准,百分之九十以上的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 |
在介绍SQL书写规范之前,先简单了解几个概念:
关键字:是SQL语言保留的字符串,有着的特殊的功能。
语句:是一条完整的SQL命令。数据库只能执行一条完整的SQL命令。
子句:是部分SQL命令。一个SQL语句可能会有多个子句构成。
为了增加程序的可读性,在写SQL的时候,通常需要遵守如下规范:
1、一条SQL语句可以单行书写,也可以书写多行,以分号结尾。建议多行书写,增强代码可读性,通常每条子句占一行。
2、适当增加缩进或空格,提高程序的可读性。
3、SQL语句不区分大小写,也就是说SELECT,select,Select,执行时效果是一样的,关键字最好使用大写,其它语法元素(如列名、表名等)小写。
4、不能使用关键字,关键字不可以缩写、分开以及跨行书写,如SELECT不可以写成SEL或SELE CT等形式。
通过简单查询,可以查询表中的所有列或者指定列,通过算术运算符、列别名以及消除重复行可以改变查询结果的显示方式。
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 |
如上两种查询方式的结果完全相同,建议使用第二种方式,可读性强,效率稍高。
SELECT 列名1[,列名2,...列名n]
FROM table;
说明:
1、[ ] 中括号里面的内容可以省略;
2、想显示哪列,写对应的列名就可以。
例:查询所有部门的部门编号、部门所在地
SELECT deptno,loc
FROM dept;
查询结果如下:
DEPTNO |
LOC |
10 |
NEW YORK |
20 |
DALLAS |
30 |
CHICAGO |
40 |
BOSTON |
可以在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 |
例:比较如下两条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 |
...... |
...... |
...... |
空值用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 |
..... |
..... |
..... |
..... |
空值参与算术运算,运算后的结果仍为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 |
...... |
...... |
...... |
...... |
用ifnull(comm,0)来解决空值的问题,如果comm不为空,就返回原值 ,如果为空则返回默认值0
select ename,sal,comm,sal+ifnull(comm,0)
from emp;
查询结果
列别名用来给查询语句中的列或者表达式重新命名,使语句的可读性更强。
语法:
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;
重复行是查询结果中有完全相同的数据行,如下面结果中第一行和第二行就是重复行。
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语句的查询结果为:显示员工表中,每个部门有哪些不同的岗位类型。