***一、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的员工信息 likeselect *from employeeswhere last_name LIKE \'%e%\';#显示出表employees部门编号在80-100之间 的姓名、职位 betweenandSELECT last_name,job_id,department_idFROM employeesWHERE department_id BETWEEN 80 AND 100;WHERE department_id BETWEEN 100 AND 80;#案例1:显示出表employees的manager_id 是 100,101,110 的员工姓名、职位 inSELECT last_name,job_id,manager_idFROM employeesWHERE manager_id IN(100,101,110);#案例1:查询没有奖金的员工 is null/is not nullSELECT * FROM employeesWHERE 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 employeesORDER BY salary DESC,employee_id ASC;#三、按表达式排序#案例:按年薪降序SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪FROM employeesORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;#四、按别名排序#案例:按年薪降序SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪FROM employeesORDER BY 年薪 DESC;#五、按函数排序#案例:按姓名中的字节长度大小降序SELECT last_name,LENGTH(last_name)FROM employeesORDER 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 employeesGROUP BY department_id;#二、按多个字段分组#案例:查询每个工种、每个部门的平均工资SELECT AVG(salary),job_id,department_idFROM employeesGROUP BY job_id,department_id;#三、分组查询+筛选having#筛选条件分两类:#分组前筛选:筛选的条件针对的是原始表#分组后筛选:筛选的条件针对的是分组后的结果集# 针对的表 位置 使用的关键字#分组前筛选 原始表 group by的前面 where#分组后筛选 分组后的结果集 group by的后面 having#where——group by——having#案例1:查询有奖金的,每个部门的最高奖金率SELECT MAX(commission_pct) 最高奖金率,department_idFROM employeesWHERE commission_pct IS NOT NULLGROUP BY department_id;#四、having子句支持别名#案例:查询每个地区的部门个数,求个数大于2的部门个数和地区号SELECT COUNT(*) 个数,location_idFROM departmentsGROUP BY location_idHAVING 个数>2;#五、排序 order by 支持别名#案例:查询员工姓名中包含字符a,每个部门的最低工资高于3000的部门编号,按照最低工资降序排序SELECT department_id,MIN(salary) 最低工资FROM employeesWHERE last_name LIKE \'%a%\'GROUP BY department_idHAVING MIN(salary)>3000ORDER 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`;