做一点关于mysql的笔记。
记一下笔记参考文章https://blog.youkuaiyun.com/szw_yx/article/details/104695519
MySQL在表中插入中文时报错:ERROR 1366 (HY000)/ Incorrect string value/ ‘\xE6\x9D\x8E\xE5\x8B\x87’ for column 'S怎么解决
在创建的表后面加上一句ENGINE=InnoDB DEFAULT CHARSET=utf8;就行。
或者:
修改数据库的字符集:
alter database test character set utf8;
修改数据表的字符集:
alter table Student character set utf8;
修改数据表字段的字符集:
alter table Student change Sname Sname varchar(10) character set utf8;
连接查询
内连接:相当于查询A、B交集部分数据
外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
自连接:当前表与自身的连接查询,自连接必须使用表别名
managerid就是它所属领导的id
所属领导也是企业的员工 所以managerid指的就是当前表的主键 员工的id
金庸是老板,张无忌的领导就是金庸,杨道和韦一笑的老板就是张无忌,就是这样的一层关系
自连接
– managerid 就是它所属领导的id
– 不要把emp看作一张表 要把它看作两张表 一个a表 一个b表
– 连接条件:员工的managerid关联的是领导的主键id
select * from emp,dept;
-- 为什么只出来金庸的因为emp中其他的dept_id都为空 不满足emp.dept_id = dept_id这个连接条件
-- 找这两个的关系emp.dept_id = dept_id
select * from emp ,dept where emp.dept_id = dept_id;
-- 查询每一个员工的姓名及关联部门表的部门名称(隐式内连接实现)
-- 连接条件emp.dept_id = dept_id
-- dept_id为Null的连接不到的
select emp.name,dept.name from emp,dept where emp.dept_id = dept_id;
-- 给他们起个别名 效果一样 把关键位置对应换对应的名字就行不要搞错
select e.name,d.name from emp e ,dept d where e.dept_id = dept_id;
select c.name,r.name from emp c, dept r where c.dept_id = dept_id;
-- 显示内连接 多了一个INNER JOIN... ON... 在逗号那添加INNER JOIN where改成on
-- 效果和隐式内连接一样
-- 连接条件emp.dept_id = dept_id一样的
select e.name,d.name from emp e inner join dept d on e.dept_id = d.id;
-- 查询emp表的所有数据 e.* 和对应的部门信息(注意这里是部门 d.name)
-- 左外连接 (包含左边和相交的部分) 所以dept_id为null的也连接了
select e.name,d.name from emp e left outer join dept d on e.dept_id = d.id;
-- 查询dept 表的所有数据 d.* 和对应的员工信息(注意这里是信息 e.*)
-- 右外连接 (包含右边和相交的部分)
-- emp e right outer join dept d
select d.*, e.* from emp e right outer join dept d on e.dept_id = d.id;
-- 左外连接 互换一下他俩的位置和改一下左右
-- dept d left outer join emp e
select d.*, e.* from dept d left outer join emp e on e.dept_id = d.id;
-- 自连接
-- managerid 就是它所属领导的id
-- 不要把emp看作一张表 要把它看作两张表 一个a表 一个b表
-- 连接条件:员工的managerid关联的是领导的主键id
-- 查询员工 及其 所属领导的名字
-- 在自连接中必须要给表起别名 不然谁是谁都分不清楚
select a.name,b.name from emp a, emp b where a.managerid = b.id;
-- 查询所有员工emp及领导的名字 员工没有领导也要查出来
-- 就是说要用左右外连接 内连接查询的是两张表交集的部分
-- 自连接可内可外
select a.name,b.name from emp a left join emp b on a.managerid = b.id;
-- 联合查询 把查询出来的两结果合并
select * from emp where salary<5000
union all
select * from emp where age >50;
-- 把查询出来的两结果合并 去重
select * from emp where salary<5000
union
select * from emp where age >50;
-- 标量子查询
-- 查询“销售部”员工的所有信息
-- a 查询“销售部”的id
select id from dept where name = '销售部' ;
-- b 根据销售部门id 查询员工信息 (就是把那个查询“销售部"id搬过来到后边 根据id查询员工信息)拆解解决问题
select id from emp where dept_id = (select id from dept where name = '销售部' ) ;
select entrydate from emp where name = '金庸';
-- 同理
select * from emp where entrydate > (select entrydate from emp where name = '金庸');
-- 列子查询 一列多行 操作符in
-- 1 查询'销售部'and '市场部'的所有员工信息
-- a 先查对应的Id
select id from dept where name = '销售部'or name = '市场部';
-- 2 4对应着销售部市场部的id哦
select * from emp where dept_id in (2,4);
-- b 根据查到的id来查询emp中所有员工信息
select * from emp where dept_id in(select id from dept where name = '销售部' or name = '市场部');
-- 查询比 财务部 所有人工资都高的员工信息
-- 拆解
-- 查询财务部人员工资
-- 先查询财务部人员id 根据查出来的id来查询他们所有的工资
select id from dept where name = '财务部';
select salary from emp where dept_id = (select id from dept where name = '财务部');
-- 然后查询比所有属于财务部人员工资都高的员工信息
-- all 表子查询里面所有的都要满足
select * from emp where salary>all(select salary from emp where dept_id = (select id from dept where name = '财务部'));
-- 查询比研发部其中任意一人工资高的员工信息
-- 先查询到研发部所有人的工资
select id from dept where name = '研发部';
select salary from emp where dept_id = (select id from dept where name = '研发部');
-- 再查询想要的 any任一
select * from emp where salary> any(select salary from emp where dept_id = (select id from dept where name = '研发部'));
-- 行子查询
-- 查询与 "张无忌" 的薪资及直属领导相同的员工信息 ;
-- 先查询"张无忌" 的薪资及直属领导员工信息 ;
select salary,managerid from emp where name = '张无忌';
select * from emp where (managerid , salary) = (select salary,managerid from emp where name = '张无忌');
-- 表子查询
-- 查询与 "韦一笑" , "常遇春" 的职位和薪资相同的员工信息
select salary,job from emp where name in ('韦一笑','常遇春');
-- 多行 用in
select * from emp where (salary,job) in (select salary,job from emp where name in ('韦一笑','常遇春'));
-- 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息
-- 先查询入职日超过2006 - 01 -01
select * from emp where entrydate > '2006 - 01 -01';
-- 再左外连接
select * from (select * from emp where entrydate > '2006 - 01 -01') e left join dept d on e.dept_id = d.id;
个人理解笔记全部在代码中了,真的是自己敲出来自己理解的了。