5. 空值参与运算
空值:null
在 MySQL 中, 空值不等于空字符串。一个空字符串是长度为 0 的字符串,而一个空值是表示没有具体值。
null 不等同于 0 (数值为0,不为空),''
(长度为0的字符串,不为空),'null'
(字符串,不为空)。
SELECT * FROM employees;
空值参与运算,结果一定也为空。
SELECT employee_id, salary AS "月工资", salary*(1+commission_pct)*12 AS "年工资", commission_pct FROM employees;
由于有些记录的 commission_pct 中值为空,所以该记录对应的计算出来的“年工资”也为空。
实际问题的解决方案:引入 IFNULL()
SELECT employee_id, salary AS "月工资", # 如果 commission_pct 为空,使用 0 进行代替 salary*(1+IFNULL(commission_pct, 0))*12 AS "年工资", commission_pct FROM employees;
6. 着重号
着重号:` (键盘左上角,1旁边)
当表名或字段名与关键字一样时,需要使用着重号将表名或字段名引起来。
SELECT * FROM ORDER;
报错
[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER' at line 1
SELECT * FROM `order`;
我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,在 SQL 语句中使用一对 `(着重号)引起来。
7. 查询常数
常数会与查询结果的每行进行拼接。
SELECT 'hello', 123, employee_id, last_name FROM employees;
8. 显示表结构
语法:
DESCRIBE 表名;
简写:
DESC 表名;
显示employees表的结构:
DESCRIBE employees;
DESC employees;
查询结果,显示了表中字段的详细信息。
- 其中,各个字段的含义分别解释如下:
- (1) Field:表示字段名称。
- (2) Type:表示字段类型
- (3) Null:表示该列是否可以存储 NULL 值。
- (4) Key:表示该列是否已编制索引。PRI 表示该列是表主键的一部分;UNI 表示该列是 UNIQUE 索引的一部分;MUL 表示在列中某个给定值允许出现多次。
- (5) Default:表示该列是否有默认值,如果有,那么值是多少。
- (6) Extra:表示可以获取的与给定列有关的附加信息,例如 AUTO_INCREMENT 等。
9. 过滤数据
使用 WHERE 字句,将不满足条件的行过滤掉,WHERE 子句紧随 FROM 子句,过滤条件声明在 FROM 结构的后面。
语法:
SELECT 字段1, 字段2, ... FROM 表名 WHERE 过滤条件;
查询90号部门的员工信息:
SELECT * FROM employees WHERE department_id=90;
查询 last_name 为 ‘King’ 的员工信息:
SELECT * FROM employees WHERE last_name='King';
SELECT * FROM employees WHERE last_name='king';
该语句的查询结果与上面相同
原因:在 windows 环境下,对大小写不敏感导致 MySQL 中对大小写也不敏感,但是由于 MySQL 的不严谨导致字符串中的大小写也不进行区分,所以上面的两句结果相同。
在其他数据中不会出现这种情况。
在 windows 环境下不区分大小,指的是字段名,表名,关键字,不包括引号内的字符串。
10. 基本的SELECT语句练习
【题目】
# 1.查询员工12个月的工资总和,并起别名为ANNUAL SALARY # 2.查询employees表中去除重复的job_id以后的数据 # 3.查询工资大于12000的员工姓名和工资 # 4.查询员工号为176的员工的姓名和部门号 # 5.显示表 departments 的结构,并查询其中的全部数据
【答案】
1.查询员工12个月的工资总和,并起别名为ANNUAL SALARY
# 理解 1 :计算12月的基本工资 SELECT employee_id, last_name, salary*12 AS "ANNUAL SALARY" FROM employees;
# 理解 2 :计算12月的基本工资和奖金 SELECT employee_id, last_name, salary*12*(1+IFNULL(commission_pct,0)) 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; DESCRIBE departments;
SELECT * FROM departments;