安装
打开mysql的安装目录,在安装目录的bin文件中,有一个mysqld的空文件,删除即可
基础
- sql语句以";"结尾
- sql不区分大小写
- 使用as设置小名,但是也可以省略。eg:my_table.name1 as '员工' 等于 my_table.name1 '员工'
- 字符串使用单引号''标注
1. 每一个字段包含的属性:字段名,数据类型,相关的约束
2. SQL语句的分类:
- DQL(数据查询语言): 查询语句,包含select的
- DML(数据操作语言): insert, delete, update, 对表中数据的增,删,改
- DDL(数据定义语言): create, drop, alter, 对表结构的增, 删,改
- TCL(事务控制语言): commit提交事务,rollback回滚事务。(TCL中的T是transaction)
- DCL(数据控制语言): grant授权,revoke撤销权限等。
3. 基础操作:
- mysql -umy_username -pmy_password
- show databases: 查看所有数据库(不是sql语句,只是mysql的命令)
- create database my_database: 创建数据库(不是sql语句,只是mysql的命令)
- use my_database: 使用某个数据库(不是sql语句,只是mysql的命令)
- select database(): 查看当前使用的数据库名(不是sql语句,只是mysql的命令)
- select version(): 查看mysql的版本号(不是sql语句,只是mysql的命令)
- show tables: 查看当前数据库中的所有表(不是sql语句,只是mysql的命令)
- source 我的数据文件.sql:初始化数据,表的结构存储在sql文件中
- drop database my_database: 删除数据库
- desc my_table: 查看表的结构
- c: 终止一条语句
- exit: 推出mysql
- show create table my_table: 查看创建表时执行的sql语句
4. sql脚本:
以sql为文件扩展名,在文件中编写sql语句,使用source命令执行sql文件(如上),来批量执行sql语句
5. 查询语句:
select 字段1 as 字段A,字段2 as 字段B ... from 表名 where 条件
字段中可以进行数值计算
条件中的运算符包括:
- =
- <>或!=
- <
- <=
- >
- >=
- between ... and ...
- is null
- and
- or
- in: 后面的范围使用()标注而不是[]
- not
- like:迷糊查询,使用"%"匹配零或任意多的字符,使用"_"匹配任意一个字符
- : 转义符
数据库中NULL 不是一个值,为空,不能说空值,不能使用=号来衡量。必须使用is null 或者is not null
使用"()"来控制优先级
select distinct name1 from my_table //distinct关键字删除结果集中重复的记录
distinct只能放在所有字段的最前端,后面所有字段联合起来去重
//统计岗位数量
select count(distinct job) from emp
6. 排序
order by
- select * from my_table order by name1 desc, name2 asc #先按照name1降序排序,name1相同时,按照name2升序排序
order by 后面可以使用前面用as定义的别名
7. 分组函数,多行处理函数(输入多行,输出1行)
通常和group by一起使用,在group by执行后再执行。
分组函数不可以直接出现在where子句当中。
例如:找出工资高于平均工资的员工名子
错误:selct name from my_table where sal > avg(sal); #此时会报错,因此分组函数在group by之后执行,而group by在where后执行,还没有分组就不能使用分组函数
正确:```sql
select name from my_table where sal > (select avg(sal) from my_table);
自动忽略NULL,只要NULL参与运算,结果就是NULL。可以使用ifnull来处理
* ifnull(name1, 0): 空处理函数,如果name1为null,则按0计算
* count: 计数
* sum: 求和
* avg:求平均值
* max: 最大值
* min: 最小值
count(*)和count(具体某个字段)的区别:
* count(*): 统计总记录条数(和字段无关)
* count(name1): 统计name1字段中不为NULL的数据总数
### 8. group by和having
* group by: 按照某个字段或者某些字段进行分组
没有group by时,整张表的数据自成一组
* having: 对分组后的数据进行再次过滤,相当于低优先级的where,不同优先级有其不可替代的功能
####案例:
找出每个工作岗位的最高薪资
```select max(sal), job from emp group by job;```
找出每个部门不同工作岗位的最高薪资
select dep, job, max(sal) from emp group by dep, job;
在sql语句中,有group by时,select的字段只能是分组函数和分组字段
```sql
//找出每个部门的最高薪资,要求显示薪资大于2000的数据
select dep, max(sal) from emp group by dep having max(sal) > 2900; //这种方式效率低
select dep, max(sal) from emp where sal > 2000 group by dep; //由于参加分组的数据变少,效率变高
#找出每个部门的平均薪资,要求显示薪资大于2000的数据
select dep, avg(sal) from emp group by dep having avg(sal) > 2900; //只能使用having方式不能使用where
总结完整的DQL语句的写法
//按优先级
select // 6
...
form // 1
...
where // 2
...
group by // 3
...
having // 4
...
order by // 5
...
连接查询
笛卡尔积现象:两张表的连接查询如果没有条件限制的话,结果集的数量是两张表的数量的乘积
1. 分类:
- 内连接:
等值连接
非等值连接:between ... and ...
自连接 - 外连接:
左外连接(左连接)
右外连接(右连接) - 全连接(几乎不用)
2. 内连接
2.1 等值连接
select
e.ename, d.dname
from
emp e
join //join 相当于inner join,inner可以省略
dep d
on
e.depid = d.depid
where
...
- join on用来关联两张表之间的关系的
2.2 非等值连接
连接条件中的关系是非等量关系
//显示每个员工的薪资等级
select
e.ename, e.sal, s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal;
2.3 自连接
一张表看作是两张表,自己连接自己
//找出每个员工的上级领导,要求显示员工名和对应的领导名。所有人均在emp表中,且mgr字段指向上级领导的编号,empno字段指向所有人的编号
select
a.ename as '员工名', b.ename as '领导名'
from
emp a
join
emp b
on a.mgr = b.empno;
3. 外连接
内外连接的区别:表A和表B进行连接
- 内连接:A和B没有主次之分,反是A表和B表能够匹配上的记录都查询出来
- 外连接:A和B一张是主表,一张是副表,主要查询主表中的内容,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配
分为两类: - 左外连接(左连接):左边的表是主表
- 右外连接(右连接):右边的表是主表
//查询每个员工的上级领导,显示员工名和领导名,有员工表和领导表(可能有的员工没有上级领导,但是也要显示员工)
select
a.ename '员工',b.ename '领导'
from
emp a
left join //如果a中的记录在b中匹配不到,则使用null来代替,而不是过滤掉这个记录,left outer join 相当于left join
emp b
on
a.mgr = b.empno;
//查询没有员工的部门
select
d.*
from
emp e
right join
dep d
on
e.depid = d.depid
where
e.empid id null
4. 全连接
类似左右连接,但是左右都是主表,A表中没有的记录不能影响B表的查询,B表中没有的记录不能影响A表的查询
5. 多张表的连接
//找出每一个员工的部门名称,工资等级,以及上级领导(有的员工没有上级领导,所以此处应该用外连接)
select
e. ename '员工', d.dname, s.grade, e1.ename '领导'
from
emp e
join
dep d
on
e.depid = d.depid
join
salgrade s
on
e.sal between s.losal and s.hisal
left join
emp e1
on
e.mgr = e1.empid