SELECT语句
1、基本结构
SELECT 列 FROM 表
SELECT * FROM departments;
> 通过通配符可以获取不知道所需要的列的名称。
> 除非需要使用表中所有的字段数据,最好不要使用通配符‘*’。
> 获取不需要的列数据会降低查询和所使用的应用程序的效率。
> 在生产环境下,不推荐你直接使用SELECT * 进行查询。
SELECT department_id, location_id
FROM departments;
2、别名 AS
- 通过AS重命名一个列,AS 可以省略。
- 列的别名,尽量使用双引号(" "),以便在别名中包含空格或特殊的字符并区分大小写。
SELECT last_name AS name, commission_pct comm
FROM employees;
SELECT last_name "Name", salary*12 "Annual Salary"
FROM employees;
SELECT employee_id AS id, first_name fname, job_id "jid"
FROM employees;
3、增加字段
查询表中数据,对结果增加一列字段test ,字段固定值为’练习’。
SELECT '练习' AS test, employee_id
FROM employees;
4、去重 DISTINCT
- 使用关键字DISTINCT去除重复行。
- DISTINCT 需要放到所有列名的前面。
- DISTINCT 对后面所有列名的组合进行去重。
SELECT DISTINCT department_id
FROM employees;
5、着重号 ‘’
当表名、字段等和保留字、数据库系统或常用方法冲突时,使用一对 ``(着重号)引起来。
SELECT * FROM ORDER; #错误,字段名和关键字ORDER冲突
SELECT * FROM `order`; #正确用法
6、过滤数据 WHERE
- 使用WHERE 将不满足条件的行过滤掉。
- WHERE子句紧随 FROM子句。
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件;
SELECT employee_id, last_name, job_id, department_id
FROM employees
WHERE department_id = 90;
7、显示表结构 DESCRIBE / DESC
- 使用DESCRIBE 或 DESC 命令查询表结构。
DESCRIBE employees;
或
DESC employees;
各个字段的含义分别解释如下:
Field:表示字段名称。
Type:表示字段类型。
Null:表示该列是否可以存储NULL值。
Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一
部分;MUL表示在列中某个给定值允许出现多次。
Default:表示该列是否有默认值,如果有,那么值是多少。
Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。
8、空值运算NULL
- 所有运算符或列值遇到NULL值,运算的结果都为NULL。
- 空值不等于空字符串。空值NULL是占用空间的。
SELECT employee_id,salary,commission_pct,
12 * salary * (1 + commission_pct) "annual_sal"
FROM employees;
9、SELECT的执行过程
- SELECT查询结构
#方式1:
SELECT ...,....,...
FROM ...,...,....
WHERE 多表的连接条件
AND 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...
#方式2:
SELECT ...,....,...
FROM ... JOIN ...
ON 多表的连接条件
JOIN ...
ON ...
WHERE 不包含组函数的过滤条件
AND/OR 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...
- SELECT执行顺序
- 关键字的顺序是不能颠倒的:
SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … LIMIT… - SELECT 语句的执行顺序:
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT - 在 SELECT 语句执行步骤的时,每个步骤都会产生一个虚拟表,然后将这个虚拟表传入下一个步骤中作为输入。
- 需要注意的是,这些步骤隐含在 SQL 的执行过程中,对于我们来说是不可见的。
- SELECT 是先执行 FROM 这一步的。
10、练习
# 1.查询员工12个月的工资总和,并起别名为ANNUAL SALARY
SELECT employee_id, salary*12 AS 'annual salary'
FROM employees;
# 2.查询employees表中去除重复的job_id以后的数据
SELECT DISTINCT job_id
FROM employees;
# 3.查询工资大于12000的员工姓名和工资
SELECT last_name, salary
FROM employees
WHERE salary > 12000;
# 4.查询员工号为176的员工的姓名和部门号
SELECT last_name, department_id
FROM employees
WHERE employee_id = 176;
# 5.显示表 departments 的结构,并查询其中的全部数据
DESC departments;
SELECT * FROM departments;