|
本帖最后由 billtian 于 2020-10-28 18:36 编辑
找了一个十几小时的mysql课程 看了下适合0基础入门 推荐给大家
https://www.bilibili.com/video/BV1jz4y1Z7ev?p=74
同求类似Java课程 30到50小时的课程有推荐吗?
笔记也贴一下 供大家参考
sql
DQL 数据查询语言 select
DML 数据操作语言 insert delete update
DDL 数据定义语言 create drop alter
TCL 事务控制语言 commit rollback
DCL 数据控制语言 grant revoke
mysql -uroot -p***;
source *.sql;
show databases;
use bjpowernode;
show tables;
desc dept /emp /salgrad;
select * from emp;
select database() /version();
show creat table emp;
select ename,sal*12 as '年薪' from emp;
select ename from emp where sal=5000;
select sal from emp where ename='SIMITH';
select ename,sal from emp where sal between 1000 and 3000; 包含1000和3000
select ename,from emp where ename between 'A' and 'C'; 不包含C
select ename,sal from emp order by sal asc/desc;
select ename,sal from emp order by sal desc,ename asc;
分组函数/多行处理函数(自动忽略null)
count 计数 sum求和 avg平均 max最大值 min最小值
select sum(sal) from emp;
单行处理函数
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
group by having
select max(sal),job from emp group by job; select 不能出现未参与分组的字段 否则结果无意义
select deptno,job,max(sal) from emp group by deptno,job;
select max(sal),deptno grom emp group by deptno having max(sal)>2900;
去重
select distinct job from emp;
select distinct deptno,job from emp;
连接查询
内连接:等值连接 非等值连接 自连接
外连接:左外连接(左连接)右外连接(右连接)
全连接
笛卡尔积现象
select e.ename,d.dname from emp e join dept d;
等值连接
select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;
非等值连接
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
自连接
select a.ename as '员工',b.ename as '领导' from emp a inner join emp b on a.mgr = b.empno;
外连接 左外连接(左连接) 左边是主表 右外连接(右连接)右边是主表
附表无匹配数据 自动null匹配
找出所以员工的领导(包括老板)
select a.ename as '员工',b.ename as '领导' from emp a left join emp b on a.mgr = b.empno;
找出哪个部门没有员工
select d.* from emp e right join dept d on e.deptno=d.deptno where e.empno is null;
找出高于平均薪资的员工 的姓名部门薪资等级及领导(where嵌套select)
select e.ename,d.dname,s.grade,e1.ename
from emp e
join dept d
on e.deptno = d.deptno
join salgrade s
on e.sal between s.losal and s.hisal
left join emp e1
on e.mgr=e1.empno;
找出每个部门平均薪资的等级 (from嵌套select)
select t.*,s.grade
from (select deptno,avg(sal) as avgsal from emp group by deptno) t
join salgrade s
on t.avgsal between s.losal and s.hisal;
找出每个部门平均的薪资等级
select e.deptno,avg(s.grade)
from emp e
join salgrade s
on e.sal between s.losal and s.hisal
group by e.deptno;
找出每个员工所在的部门名称,要求显示员工名和部门名(select嵌套select)
select e.ename,e.deptno,
(select d.dname from dept d where e.deptno=d.deptno) daname
from emp e;
三张表的连接查询
找不每个员工的部门名和工资等级以及领导
select e.ename '员工',d.dname '部门',s.grade '工资等级',e1.ename '领导'
from emp e join dept d on e.deptno = d.deptno
join salgrade s on e.sal between s.losal and s.hisal
join emp e1 on e.mgr = e1.empno;
union 可以将查询结果相加
找出工作岗位是SALESMAN和MANAGER
1)select ename,job from emp where job = 'SALESMAN' or job = 'MANAGER';
2)select ename,job from emp where job in ('SALESMAN','MANAGER');
3)select ename,job from emp where job = 'SALESMAN'
union select ename,job from emp where job = 'MANAGER';
两张不相干的表拼接在一起
select ename from emp union select dname from dept;
两个查询必须列数相同
limit (重点中的重点,以后分页查询全靠他了)
mysql特有 取结果集中的部分数据 limit startIndex length
取出工资前五名的员工
select ename,sal from emp order by sal desc limit 0,5;
select ename,sal from emp order by sal desc limit 5;
执行顺序select 5 from 1 where 2 group by 4 having 4 order by 6 limit 7
取出工资第4到第9名的员工
select ename,sal from emp order by sal desc limit 3,6;
通用标准分页sql 每页显示pagesize条
limit (pageno-1)pagesize,pagesize
DQL 结束
创建表
creat table 表名(字段名 数据类型,字段名 数据类型,......);
mysql当中字段数据类型
int 整数型 (java中的int)
bigint 长整型 (java中的long)
float double 浮点型(java中的float double)
char 定长字符串(java中的String)
varchar 可变长字符串 最长255(java中的StringBuffer/StringBuilder)
date 日期 (java中的java.sql.Date)
BLOB 二进制大对象(存储图片、视频等流媒体信息 java中的Object)
CLOB 字符大对象(存储较大文本 可存储4G的字符串java中的Object)
create table t_stu
(no bigint,
name varchar(255),
sex char(1)default 1,
classno varchar(255),
birth char(10)
);
insert into t_stu(no,name,classno,birth)values(1,'zhangsan','gaosan1ban','2003-8-7');
insert into t_stu(name,classno,birth,no)values('lisi','gaosan1ban','2003-8-7',2);
insert into t_stu values(3,'wangxiaohua','0','gaosan1ban','2002-10-7');
insert into t_stu(name)values('wangdamazi');
insert into t_stu(no,name,sex,classno,birth)
values(4,'jack','1','gaosan1ban','2003-5-12'),
(5,'rose','0','gaosan1ban','2002-12-28');
drop table if exists t_student;
表的复制
查询结果当作表复制出来
create table emp1 as select * from emp;
create table dept1 as select * from emp;
查询结果插入表格
insert into emp1 select * from emp;
修改数据
update dept1 set loc='shanghai',dname='renshibu' where deptno=10;
删除数据
delete from dept1 where deptno=10;
delete 不释放空间 效率低
删除大表
truncate table emp1;(表被截断,不可回滚!!!)
crud是指在做计算处理时的增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。
crud主要被用在描述软件系统中数据库或者持久层的基本操作功能。
约束(Constraint)
非空约束(not null)不能为NULL
唯一约束(unique)不能重复
主键约束(primary key)PK 既不能为NULL也不能重复
外键约束(foreign key)FK
检查约束(check)mysql 目前不支持
非空约束(not null)不能为NULL
drop table if exists t_user;
create table t_user(
id int,
username varchar(255)not null,
password varchar(255)
);
insert into t_user(id,password)values(1,'123');
ERROR 1364 (HY000): Field 'username' doesn't have a default value
insert into t_user(id,username,password)values(1,'lisi','123');
唯一性约束(unique)字段具有唯一性,不能重复,但可以为NULL
drop table if exists t_user;
create table t_user(
id int,
username varchar(255)unique,
password varchar(255)
);
insert into t_user values(1,'zhangsan','123');
insert into t_user values(2,'zhangsan','123');
ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'username'
drop table if exists t_user;
create table t_user(
id int,
usercode varchar(255)unique, //列级约束
username varchar(255)unique
);
insert into t_user values(1,'111','zs');
insert into t_user values(2,'111','ls');
ERROR 1062 (23000): Duplicate entry '111' for key 'usercode'
drop table if exists t_user;
create table t_user(
id int,
usercode varchar(255),
username varchar(255),
unique(usercode,username) //表级约束
);
insert into t_user values(1,'111','zs');
insert into t_user values(2,'111','ls');
insert into t_user values(3,'111','ww');
主键约束
drop table if exists t_user;
create table t_user(
id int primary key,
username varchar(255),
email varchar(255)
);
insert into t_user values(1,'zs','zs@123.com');
insert into t_user values(2,'ls','ls@123.com');
insert into t_user values(3,'mw','mw@123.com');
主键字段不能为空 也不能重复 表的设计三范式有要求,任何一张表都有主键
主键作用 唯一标识 一张表只能有一个主键约束(多个字段可联合成复合主键 不建议用 违背三范式)
主键值划分 按字段数分 单一主键 复合主键 按性质分 自然主键 业务主键
主键值 最好是个自然数 不推荐与业务挂钩的字段做主键 单一自然主键
drop table if exists t_user;
create table t_user(
id int primary key auto_increment,
username varchar(255)
);
insert into t_user(username)values('zhangsan');
insert into t_user(username)values('lisi');
insert into t_user(username)values('zhangsan');
insert into t_user(username)values('wangwu');
外键约束
外键约foreign key 外键字段 外键值
父子表 创建先创建父表 添加数据先添加父表 删除数据或表先删除子表
drop table if exists t_student;
drop table if exists t_class;
create table t_class
(
cno int,
cname varchar(255),
primary key(cno)
);
create table t_student
(
sno int,
sname varchar(255),
classno int,
primary key(sno),
foreign key(classno) references t_class(cno)
);
insert into t_class values(101,'aaaaaaaaaaaaaa');
insert into t_class values(102,'asfdfdfdfdfdfd');
insert into t_student values(1,'zs',101);
insert into t_student values(2,'ls',101);
insert into t_student values(3,'ww',101);
insert into t_student values(4,'ml',101);
insert into t_student values(5,'nq',102);
insert into t_student values(6,'wmz',102);
select * from t_class;
select * from t_student;
外键可以为NULL 外键字段引用其他表字段不一定是主键 但必须具有唯一性
事务 一个完整的业务单元,不可再分
保证两条DML语句同时成功 或同时失败就需要使用事务级制
和事务相关的只有DML语句(insert delete update)
事务包括四大特性ACID
A:原子性
C:一致性
I:隔离性
D:持久性
隔离性
第一级别:读未提交(read uncommitted)脏读
第二级别:读已提交(read committed)不可重复读 (Oracle默认级别)
第三级别:可重复读(repeatable read)读到的数据是幻想(MySQL默认级别)
第四级别:序列化(serializable) 解决了所有问题 效率低
事务演示
MySQL默认自动提交 执行任何一条DML语句就提交一次
关闭自动提交 start transaction;
提交commit;
drop table if exists t_user;
create table t_user(
id int primary key auto_increment,
username varchar(255)
);
insert into t_user(username)values('zhangsan');
rollback;
设置隔离级别
set global transaction isolation level read uncommitted;
查看隔离级别
select @@global.tx_isolation;
索引index
索引相当于目录 查询一张表有两种模式 全表扫描 根据索引检索(效率很高)
什么时候添加索引 数据量大 该字段很少DML操作 经常出现在where子句中
主键和具有unique约束的字段会自动添加索引
查看sql执行计划
explain select ename,sal from emp where sal = 5000;
创建索引
create index emp_sal_index on emp(sal);
删除索引 drop index emp_sal_index on emp;
分类 单一索引 复合索引 主键索引 唯一索引
索引失效 模糊查询
select ename from emp where ename like '%A%'
视图view
create view myview as select empno,ename from emp;(只有DQL语句可以以视图创建出来)
drop view myview;
对视图进行增删改查会影响原表数据
视图的作用 保密 不能看到原表 程序员只对视图进行CRUD
DBA命令
数据导出
mysqldump bjpowernode > d:\bjpowernode.sql -uroot -p*** 导出整个库
mysqldump bjpowernode emp > d:\bjpowernode.sql -uroot -p*** 导出指定表
数据导入
create database bjpowernode
use bjpowernode
source d:\bjpowernode.sql
三范式
每一张表都有主键 字段原子性不可再分
所有非主键字段完全依赖主键 不能产生部分依赖
所有非主键字段直接依赖主键 不能产生传递依赖
多对对 三张表 关系表两个外键
一对多 两张表 多的表加外键
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|