# mysql学习笔记(1)
## 一、 mysql安装与登录
mysql安装:
* 重点要选择语言 utf-8
* 设置一下密码 不能太简单
* 数据库登录
``` mysql
//-u 后面接用户名,-p 后面接密码
mysql -uroot -p****
```
## 二、mysql卸载
1. 双击mysql安装包,点击remove卸载即可
2. 删除残留
ProgramData(c盘下的隐藏文件)下面的mysql删掉
Program Files 下面的mysql强行删掉
## 三、DB DBMS SQL
* 之间关系:
DB:database
DBMS :database management system(数据库管理系统:mysql oracle DB2 sybase sqlserver)
SQl:结构话查询语言,是一门标准通用的语言,标准的sql适用于所有的数据库产品
* SQl属于高级语言,写出来的sql语句,可以读懂啥意思
* SQL语句执行的时候,实际上内部也会进行编译,然后执行sql(sql语句的编译由DBMS完成)
* DBMS执行SQL操作DB
## 四、表的理解
1. 什么是表?
table是数据库的基本组成单元,所以数据都以表的形式组织,目的是可读性强
* 表分为行和列,行:数据/记录(data),列:字段(column)
* 字段属性:字段名,数据类型,相关的约束
## 五、sql语句
DQL(数据查询语句):查询语句,凡是select语句都是DQL
DML(数据操作语句):inset delete update,对表中的数据进行增删改。
DDL(数据定义语句):create drop alter,对表结构的增删改
TCL(事务控制语言):commit提交事务,rollback回滚事务
DCL(数据控制语言):grant授权,revoke撤销权限等
## 六、导入初始化数据
1. 登录
2. 产看那些数据:show databases; (不是SQL)
3. 创建属于我们自己的数据库
create database bjpowernode; (no sql)
4. 使用bjpowernode数据
use bjpowernode; (no sql)
5. 查看当前使用的数据中有哪些表?
show tables; (no sql)
6. 初始化数据
musql>source 路径……
## 七、对sql脚本的理解
bjpowernode.sql, 这是个“sql脚本”,直接使用source命令可以执行sql脚本
sql脚本中的数据量大,使用source命令完成初始化。
* 删掉数据库:drop database bjpowernode
## 八、mysql的常用命令
#### (1)简单的操作
1. 查看当前使用数据库
select database()
2. 常看当前的版本
select version()
3. 终止语句:\c
4. 退出musql:\q、QUIT、EXIT
5. 查看创建表的语句
show create table emp
#### (2)简单的查询语句
``` SQL
select 字段名,字段名,…… from 表名;
```
* 任何一条sql语句以; 结尾
* sql语句不区分大小写
* 字段可以运算
* 字段修改名字
``` SQL
//别名如果是中文,用单引号,mysql支持双引号,但是别的不支持,所以建议用单引号
select 字段名,字段名 as 别名,…… from 表名;
```
查询所有字段 字段名用*,尽量少用,效率太低
##### 1. 条件查询
语法:执行顺序是from=>where=>select
``` sql
select string ,string,……from 表名 where 条件;
```
条件查询
=, <, >, >=, <=,
between … and …(>=and<=), is null(is not null)
and, or, in(包含,相当于多个or),not(非), like(模糊查询,支持%或是下划线匹配)
``` sql
job='a' or job='b'; 等同于 job in ('a', 'b');
```
%代表任意多个字符,_代表任意1个字符
``` sql
select name from emp where name like 's%'//首字母是s的
select name from emp where name like '%s%'//含有s的
select name from emp where name like '%\_%'//含有_的
select name from emp where name like '_s%'//第二个字母是s的
select name from emp where name like '__s%'//第三个字母是s的
```
##### 2. 排序(升序,降序)
升序:语法
``` sql
//薪资排序,默认升序
select sal from emp order by sal;
//asc表示升序,desc表示降序
select sal from emp order by sal asc;
select sal from emp order by sal desc;
//按照薪资的降序排,相同按照名字的降序排(by后面靠前的优先级高)
select enamel,sal from emp order by sal desc,ename asc;
//按照第几列排序,1是第一列,2是第二列
select enamel,sal from emp order by 1;
```
``` sql
//执行顺序
select - (3) from - (1) where - (2) order by - (4)
```
##### 3. 分组函数(多行处理函数)
count计算、sum求和、avg平均值、max最大值、min最小值
* 所有的分组函数都是对 `某一组` 数据进行操作的
* 分组函数自动忽略null
* sql语句中分组函数不可以直接使用在where当中
* count(*)和count(具体字段)区别,*是总记录个数,具体字段统计不为空的个数
``` sql
//找出工资总和
select sum(sal) from emp
//找出最高工资
select max(sal) from emp
//找出最低工资
select min(sal) from emp
//找出平均工资
select avg(sal) from emp
//找出总人数
select count(*) from emp
//找出高于平均工资
select avg(sal) from emp where sal > avg(sal);//ERROR 1111 无效的使用了分组函数
```
##### 4. 单行处理函数
* 输入单行,输出单行
* 计算的时候存在NULL的时候,输出的为NULL
ifnull()控制处理函数:可能为null的数据,被当作XXX处理
``` sql
select ename,ifnull(sal, 0) as comm from emp; df
```
#### (3)分组查询
##### group by 和 having
* group by 按照摸个字段或某些字段进行分组
* having:having是对分组之后的数据进行再次过滤
案例:找出每个岗位最高薪资
``` sql
select max(sal) from emp group by job;
```
* 注意:分组函数一般和group by联合使用。并且任何一个分组函数都是在group by语句执行结束后才会执行,当以条sql语句没有group by的话,整张表的数据会自成一组。
分组函数不能用在where中,因为他是在where之后执行。
* 先分组后查询
``` sql
select * (5) from * (1) where * (2) group by * (3) having * (4) order by * (6)
```
* 当sql语句有group by时,select中只能有跟分组函数和参与分组的字段
``` sql
//error
select ename,max(sal),job from emp group by job;//mysql中会执行,不会报错,但是ename字段查到的数据没有任何意义。
```
找出每个部门中的不同岗位的不同薪资
``` sql
select deptno, job, max(sal) from emp group by deptno, job
```
找出每个部门的最高薪资,要求显示大于2500的数据
``` sql
select max(sal),deptno from emp group by deptno having max(sal)>2500;//效率太低,因为找出了每个分组的最高薪资,但是低于2500的不显示,浪费了资源
select max(sal), deptno from emp where sal>2500 group by deptno;//先过滤掉小于2500的,然后在分组查询
```
* 注:先用where,搞不定再用having过滤。如果案例中把大于2500改为大于平均值的数据,就应该用having,应为where后面无法用分组函数avg()
#### (4)查询结果集的去重
``` sql
select distinct job from emp
```
* distinct只能放在所有字段的最前面
* 后面有两个字段的时候,表示联合去重
#### (5)链接查询
##### 1. 什么是链接查询
* 在实际开发找那个,大部分情况下都是从单张表中查询数据,一般都是多张表联合查询去除最终的结果。
* 在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,两张表
##### 2. 连接查询的分类
* 内连接:
等值连接 非等值连接 自链接
* 外连接: 左外连接(左连接) 右外连接(右链接)
* 全连接(用的少)
##### 3. 笛卡尔积现象
* 当两张表进行链接查询的时候,没有任何条件限制,最终的查询结果条数为两个表记录条数的乘积
* 表的别名:执行效率高 可读性高
#### (6)内连接
##### 1. 等值连接,条件是等量关系
*案例,查询每个员工的部门名称,要求显示员工名和部门名
``` sql
··· a inner join b on 链接条件 //inner可以省略
//SQL92
select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
//SQL99
select e.ename,d.dname from emp e join emp d on e.deptno=d.deptno;
```
sql99语法结构更清晰,表的连接条件和后来的where条件分离
##### 2. 非等值连接
*案例,找出每个员工的工资等级,要求显示员工名、工资、工资等级 分emp员工表和salgrade工资等级表
``` sql
select e.name, e.sal, f.grade from emp join salgrade on e.sal between s.losal and s.hisal;
```
##### 3. 自链接
* 一张表看作两张表,自己连自己
* 案例,找出每个员工的上级领导,要求显示员工名和对应的领导名,//员工的领导编号=领导的员工编号
``` sql
//数据库中的表名为emp
//a表为员工表,b表为领导表 (其实a表和b表是一张表emp)
select a.ename as 'table1',b.ename as 'table2' from emp a join emp b on a.mgr=b.empno
```
#### (7) 外连接
*内连接:假设a和b表进行链接,使用内连接的话,凡是a表和b表能够匹配上的记录查出来,叫内连接,ab俩个表没有主副之分
*外连接:假设a表和b表进行链接,使用外连接的话,ab两张表中有一张是主表,一张是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表数据匹配上,副表自动模拟出NULL与之匹配。
*外连接的分类:
1.左外连接(左连接)左表是主表,
2.右外连接(右链接)右表是主表
3.左连接有右链接的写法,右链接也会有对应的左连接的写法
语法:
``` sql
select a.ename as 'table1' ,b.ename as 'table2' from emp a left outer join emp b on ···
//left(right)代表左边的表是主表,主表的数据无条件的全部查除,副表如果无数据,用NULL补全。
//同理 outer可以省略
```
#### (8)三个表链接
* a连b,然后a再连c。写两个join on
* 如果是外连接,注意些好left(right)的位置