MySQL的相关笔记整理

做一点关于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;

个人理解笔记全部在代码中了,真的是自己敲出来自己理解的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值