***一、SQL语言分类
- DQL语言(数据查询语言)select
- DML语言(数据操纵语言)insert update delete
- DDL语言(数据定义语言)create alter drop
- DCL语言(数据控制语言)commit rollback
二、Mysql语法规范
- ***不分大小写
- ;结尾
- 单行注释:#
- 单行注释:–
- 多行注释:/* */
- sql语句可以写在一行或多行,各子句一般分行写
- 关键字不能缩写不能分行
- 用缩进提高语句的可读性
三、SQLyog使用
删除表 创建表 执行sql语句 保存sql语句 打开sql文件
四、查询操作练习
导入数据
- 基础查询:
SELECT 100;
SELECT 'john'; /*显示常量*/
SELECT 98*23; /*显示表达式*/
SELECT LENGTH('john');
SELECT VERSION(); /*显示函数(方法)*/
SELECT last_name FROM employees; /*显示表中的字段*/
SELECT last_name,phone_number,first_name,salary,commission_pct,manager_id FROM employees; /*显示表中的多个字段*/
SELECT * FROM employees; /*显示表中所有字段*/
select last_name AS 姓,first_name AS 名 FROM employees; /*起别名*/
select last_name 姓,first_name 名 FROM employees; /*起别名*/
select last_name "out name" FROM employees; /*起别名*/
SELECT DISTINCT department_id FROM employees; /*去重 查询employees中的所有部门编号*/
注意事项:SELECT 显示; 起别名 as 去重 DISTINCT
2. 条件查询
语法: select 字段 from 表名
where 条件;
分类: <=>安全等于
and && or || not |
优先级:not>and>or
#一、按条件表达式查询
#案例1:查询月薪>5000的员工信息
SELECT * FROM employees WHERE salary>5000;
#二、按逻辑表达式查询
#案例1:查询月薪在5000到12000的员工工资和姓名
SELECT salary,last_name FROM employees WHERE salary>= 5000 ANDsalary<=12000;
3. 模糊查询
1.like
一般搭配着通配符使用,用作字符型的判断通配符:
% 任意多个字符
_ 任意单个字符 1
2.between and
特点:在…之间
①等价于 使用 字段>=值1 and 字段<=值2
②两个临界值是包含的 [1,10]
③两个临界值不能颠倒顺序
3.in
特点:判断某个字段的值是否在某个列表内in(值1,值2,…)
等价于 or
4.is null/is not nul
#查询姓名中包含字符E的员工信息 like
select *from employees
where last_name LIKE '%e%';
#显示出表employees部门编号在80-100之间 的姓名、职位 betweenand
SELECT last_name,job_id,department_id
FROM employees
WHERE department_id BETWEEN 80 AND 100;
WHERE department_id BETWEEN 100 AND 80;
#案例1:显示出表employees的manager_id 是 100,101,110 的员工姓名、职位 in
SELECT last_name,job_id,manager_id
FROM employees
WHERE manager_id IN(100,101,110);
#案例1:查询没有奖金的员工 is null/is not null
SELECT * FROM employees
WHERE commission_pct IS NULL;
4. 排序查询
语法:
select 字段|表达式|常量
from 表
【where 条件】
order by 排序的字段;
1.升序 asc
降序 desc
默认是 升序asc
2.可以按表达式、函数、别名、多个字段进行排序
3.一般来讲order by放到查询的语句的最后,在不使用分页的情况下
#一、按单个字段进行排序
SELECT * FROM employees ORDER BY salary ;
SELECT * FROM employees ORDER BY salary DESC;
#二、按多个字段进行排序
SELECT * FROM employees
ORDER BY salary DESC,employee_id ASC;
#三、按表达式排序
#案例:按年薪降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
#四、按别名排序
#案例:按年薪降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 DESC;
#五、按函数排序
#案例:按姓名中的字节长度大小降序
SELECT last_name,LENGTH(last_name)
FROM employees
ORDER BY LENGTH(last_name) DESC;
***
## ***
五、分组函数与查询**
分组函数
分类:
max():最大值min():最小值sum():和avg():平均值count():计算非空的个数这些是通用的,sqlserver、oracle、mysql 都是一样的
特点:
1、sum、avg只支持数值型,count、max、min支持任何类型
2、这几个分组函数,都忽略null值
3、count()分组函数,支持以下写法count() 建议使用count(1)表示 查询结果集的行数
注意:count(1)性能没有count()高
因为count(*),sql服务器对其进行了优化 效率高
分组查询
分组查询一般都会用到分组函数
语法:
select 分组函数 别名,分组后的字段
from 表
【where 分组前筛选】
group by 分组的字段
【having 分组后筛选】
【order by 排序的字段】
从上到下依次顺序,不能颠倒顺序
分组查询的特点:
1、按多个字段分组,字段间用逗号隔开,没有顺序要求
2、可以和分组函数一起查询的字段,只能是分组后的字段,不能是任意字段
3、分组筛选 针对的表 位置 使用的关键字
分组前筛选 原始表 group by的前面 where
分组后筛选 分组后的结果集 group by的后面 having
顺序:where——group by——having
4、having和group by支持别名
#一、普通的分组查询
#01 案例:查询各部门的最高工资和部门号
SELECT MAX(salary),department_id FROM employees
GROUP BY department_id;
#二、按多个字段分组
#案例:查询每个工种、每个部门的平均工资
SELECT AVG(salary),job_id,department_id
FROM employees
GROUP BY job_id,department_id;
#三、分组查询+筛选having
#筛选条件分两类:
#分组前筛选:筛选的条件针对的是原始表
#分组后筛选:筛选的条件针对的是分组后的结果集
# 针对的表 位置 使用的关键字
#分组前筛选 原始表 group by的前面 where
#分组后筛选 分组后的结果集 group by的后面 having
#where——group by——having
#案例1:查询有奖金的,每个部门的最高奖金率
SELECT MAX(commission_pct) 最高奖金率,department_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY department_id;
#四、having子句支持别名
#案例:查询每个地区的部门个数,求个数大于2的部门个数和地区号
SELECT COUNT(*) 个数,location_id
FROM departments
GROUP BY location_id
HAVING 个数>2;
#五、排序 order by 支持别名
#案例:查询员工姓名中包含字符a,每个部门的最低工资高于3000的部门编号
,按照最低工资降序排序
SELECT department_id,MIN(salary) 最低工资
FROM employees
WHERE last_name LIKE '%a%'
GROUP BY department_id
HAVING MIN(salary)>3000
ORDER BY 最低工资 DESC;
*** 六、连接查询*****
概念:查询的字段来自于多个表
语法:
select
字段1,字段2
from 表1,表2
【where 连接条件】
笛卡尔乘积:
产生原因:没有加连接条件,导致结果为 表1 的行数*表2 的行
解决方法:添加上有效的`myemployees
分类:
一、传统模式的多表连接
等值连接(where)——非等值连接
二、sql99推出的标准,使用join关键字实现连接
内连接——外连接
三、自连接
一、传统模式的多表连接也叫等值连接
特点有
①表的顺序没有要求
②n表连接,至少需要n-1个连接条件
③一般需要为表起别名,这样可以提高语句简洁度,并且防止字段有歧义
④可以添加分组、排序、筛选,一起混合使用
#①案例1:查询员工名、部门名
SELECT `last_name`,`department_name`
FROM `employees`,`departments`
WHERE`employees`.`department_id`=`departments`.`department_id`;