一、SQL分类
- DDL:数据定义语言 CREATE 、 ALTER 、DROP
- DML:数据库操作语言 INSERT 、 DELETE 、UPDATE
- DCL:数据控制语言 COMMIT 、 ROLLBACK 、 SAVEPOINT
二、基本查询语句
1.查询
SELECT 字段1,字段2 FROM 表名
2.列的别名
SELECT employee_id 员工号,last_name AS 名字,department_id FROM employees as e ;
3.出重
SELECT DISTINCT department_id FROM employees;
4.空值参与运算,结果为null
# 空值不等于0,'','null'
SELECT employee_id,salary "月工资",salary * ( 1 + commission_pct) * 12 "年工资" FROM employees;
#实际问题解决方案,引入IFNULL,用0替换null
SELECT employee_id,salary "月工资",salary * ( 1 + IFNULL(commission_pct,0)) * 12 "年工资",commission_pct FROM employees;
5.着重号 ``
#ORDER是一个sql关键字,如果有冲突,使用着重号
SELECT * FROM `order`
6.查询常数
SELECT '常数',123,employee_id,last_name
FROM employees
7.显示表结构
# 显示表中字段的详细信息
DESCRIBE employees
8.过滤数据
# 查询depid是90号的信息
SELECT * FROM employees
WHERE department_id = 90;
三、运算符
1.算术运算符
2.比较运算符
正确返回1,错误返回0
# 字符串隐式转换,如果转换数值不成功,则看做0
# 如果等号两边有数字,则字符串转成数值进行比较
SELECT 1 = 2,1 != 2,1 = 'a',0 = 'a';
# 如果两边都是字符串,则比较字符串的ANSI
SELECT 'a' = 'a' ,'a' = 'b';
# 只要有NULL参与,返回结果就为NULL
SELECT * FROM employees WHERE commission_pct = NULL;
安全等于 <=> 可以比较NULL值
SELECT 1 <=> NULL, NULL <=> NULL;
# 可以查询数据为NULL的行
SELECT employee_id,commission_pct FROM employees WHERE commission_pct <=> NULL;
3.比较运算符
SELECT 'shkstart' REGEXP '^s','shkstart' REGEXP 't$','shkstart' REGEXP 'hk'
FROM DUAL;
4.逻辑运算符
在Mysql中,逻辑运算符的返回结果为1、0或者NULL。AND优先级高于OR
# 10或20
SELECT last_name,salary
FROM employees
WHERE department_id = 10 OR department_id = 20;
# 工资不在6000到8000
SELECT last_name,salary
FROM employees
WHERE salary NOT between 6000 and 8000;
# XOR 逻辑异或
# 满足50 不满足 大于6000
# 不满足50 满足大于6000
SELECT last_name,salary,department_id
FROM employees
WHERE department_id = 50 XOR salary > 6000;
5.位运算符
四、排序与分页
1.排序
1.1排序规则
- 使用ORDER BY 子句排序
- ASC:升序
- DESC:降序
- ORDER BY 子句在SELECT语句的结尾。
- 如果没有排序操作,默认情况下查询返回的数据是按照添加数据的顺序显示的。
# 按照salary从高到低
SELECT * FROM employees
ORDER BY salary DESC ;
2.分页
# limit(偏移量,每页条数)
# 每页显示20条记录,从第一页开始
SELECT employee_id,last_name
FROM employees
LIMIT 0,20;
五、多表查询
1.笛卡尔积
每个员工都跟每个部门匹配了一遍,默认交叉连接
匹配模式,缺少连接条件
# 查询员工的姓名、部门,查询出2889条数据
SELECT employee_id,department_name
FROM employees,departments;
#107条
SELECT *
FROM employees;
#27条
SELECT *
FROM departments;
2.正确连接方式,需要有连接条件
SELECT employee_id,department_name
FROM employees,departments
WHERE employees.department_id = departments.department_id;
3.等值连接、非等值连接
#非等值连接
SELECT last_name,salary,grade_level
FROM employees e ,job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;
4.自连接、非自连接
#自连接
#查询员工id,员工姓名,管理者id和姓名
SELECT emp.employee_id,emp.last_name,mgr.employee_id 管理者id,mgr.last_name 管理者姓名
FROM employees emp,employees mgr
WHERE emp.manager_id = mgr.employee_id;
5.内连接、外连接
- 内连接:合并具有同一列的两个以上的表的行,
结果集不包含一个表与另一个表不匹配的行
SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.department_id = d.department_id;
- 外连接:合并具有同一列的两个以上的表的行,
结果集包含一个表与另一个表匹配的行
还查到了左表或者右表不匹配的行 - 左连接:额外返回左表中不满足条件的行
- 右连接:额外返回右表中不满足条件的行
#左连接
SELECT last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.department_id = d.department_id;