1. 列的别名
- as:全称:alias(别名),可以省略
- 列的别名可以使用一对""引起来,不要使用''。
- 作用:重命名一个列 ;便于计算
- 紧跟列名,也可以在列名和别名之间加入关键字AS,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。
- AS 可以省略
- 建议别名简短,见名知意
- 举例
SELECT last_name AS name
FROM employees;
SELECT last_name AS name, department_id "部门id"
FROM employees;
SELECT last_name AS name, department_id "部门id", salary * 12 "annual sal"
FROM employees;
# 2. 去除重复行
- 查询员工表中一共有哪些部门id
SELECT DISTINCT department_id
FROM employees;
#错误的:没有去重的情况
SELECT department_id
FROM employees;
#仅仅是没有报错,但是没有实际意义。
SELECT DISTINCT department_id,salary
FROM employees;
这里有两点需要注意:
- DISTINCT 需要放到所有列名的前面,如果写成
SELECT salary, DISTINCT department_id FROM employees
会报错。 - DISTINCT 其实是对后面所有列名的组合进行去重,你能看到最后的结果是 74 条,因为这 74 个部门id不同,都有 salary 这个属性值。如果想要看都有哪些不同的部门(department_id),只需要写DISTINCT department_id即可,后面不需要再加其他的列名了。
3. 空值参与运算
- 所有运算符或列值遇到
null
值,运算的结果都为null
-
null
不等同于0,'','null'
SELECT * FROM employees;
- 空值参与运算:结果一定也为空。
SELECT employee_id,salary "月工资",salary * (1 + commission_pct) * 12 "年工资",commission_pct
FROM employees;
- 实际问题的解决方案:引入
IFNULL
IFNULL(a,b) :如果参数a不是null,就加入计算,如果是null就拿参数b来计算
SELECT employee_id,salary "月工资",salary * (1 + IFNULL(commission_pct,0)) * 12 "年工资",commission_pct
FROM employees;
- 注意,在 MySQL 里面, 空值不等于空字符串。一个空字符串的长度是 0,而一个空值的长度是空。而且,在 MySQL 里面,空值是占用空间的。
4. 着重号 ``
- 因为 ORDER 是排序的关键字,所以不能直接作为表名,如果有重名的order表,就使用着重号引起来
- 错误的
SELECT * FROM order
> 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
- 正确的
mysql> SELECT * FROM `ORDER`;
+----------+------------+
| order_id | order_name |
+----------+------------+
| 1 | shkstart |
| 2 | tomcat |
| 3 | dubbo |
+----------+------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM `order`;
+----------+------------+
| order_id | order_name |
+----------+------------+
| 1 | shkstart |
| 2 | tomcat |
| 3 | dubbo |
+----------+------------+
3 rows in set (0.00 sec)
- 结论
需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,请在SQL语句中使用一对``(着重号)引起来。
5. 查询常数
- SELECT 查询还可以对常数进行查询。就是在 SELECT 查询结果中增加一列固定的常数列。这列的取值是我们指定的,而不是从数据表中动态取出的。
- 你可能会问为什么我们还要对常数进行查询呢?
- SQL 中的 SELECT 语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。
- 比如说,对
employees
数据表中的员工姓名进行查询,同时增加一列字段corporation
,这个字段固定值为“兮动人
”,可以这样写: - 加入常数就会在每一行的前面增加一个常数,比如加个公司名为:“兮动人”
SELECT '兮动人' as corporation, last_name
FROM employees;
6. 显示表结构
DESCRIBE employees; #显示了表中字段的详细信息
或
DESC employees;
其中,各个字段的含义分别解释如下:
- Field:表示字段名称。
- Type:表示字段类型,这里 barcode、goodsname 是文本型的,price 是整数类型的。
- Null:表示该列是否可以存储NULL值。
- Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
- Default:表示该列是否有默认值,如果有,那么值是多少。
- Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。
7. 过滤元素
- 练习:查询90号部门的员工信息
SELECT *
FROM employees
#过滤条件,声明在FROM结构的后面
WHERE department_id = 90;
- 练习:查询
last_name
为'King
'的员工信息
SELECT *
FROM EMPLOYEES
WHERE LAST_NAME = 'King';
- 注意:mysql在Windows下大小写不敏感,不区分大小写的,如上的字符串 '
King
' 也是可以任意大小写的
8. 练习
- 查询员工12个月的工资总和,并起别名为
ANNUAL SALARY
SELECT employee_id, last_name, salary * 12 "ANNUAL SALARY"
FROM employees
- 查询
employees
表中去除重复的job_id
以后的数据
SELECT DISTINCT job_id
FROM employees
- 查询工资大于
12000
的员工姓名和工资
SELECT last_name salary
FROM employees
WHERE salary > 12000;
- 查询员工号为
176
的员工的姓名和部门号
SELECT last_name department_id
FROM employees
WHERE employee_id = 176
- 显示表
departments
的结构
DESC departments;