MySQL 基础+高级篇- 数据库 -sql -尚硅谷(基础篇)
2020-03-16 23:50 cascle 阅读(1244) 评论(0) 编辑 收藏 举报MySQL初级
第一章.为什么要学习数据库
实现数据持久化
使用完整的管理系统统一管理,易于查询
第二章.数据库相关概念
DBMS:Database Management System。数据库时通过DBMS创建和操作的容器
DB:Database,存储数据的仓库。保存了一系列有组织有格式规范的数据
SQL:Structure Query Language。专门与数据库管理系统通信的语言
SQL优点:
第三章.数据库存储数据的特点
1.数据放到表里,表放到库里
2.一个数据库里可以有多张表,每个表有自己的名字,名字唯一
3.表具有特性,定义了数据在表中如何存储。表类似类
4.表由一个或多个列组成,叫做字段。列类似属性
5.表中数据按行存储。行类似对象
第四章.初识MySQL
MySQL产品介绍
DBMS:分两类,基于共享文件系统的和基于C/S架构的
MySQL基于客户端服务端架构
MySQL产品安装
安装好后要配置
MySQL产品卸载
控制面板里卸载,安装路径里删除,ProgramData里删除,删除注册表(预防配置影响新安装的软件),删除Application Data里的MySQL
配置文件:my.ini
MySQL服务的启动和和停止
是个daemon,各个系统里找启动/停止服务的办法
windows:net stop 服务名。star启动
MySQL服务的登录和登出
mysql -h 地址 -P 端口号 -u 用户 -p 密码。选型和参数之间可以没有空格
exit退出
配置环境变量:
把安装路径bin加入Path环境变量
MySQL的常见命令和语法规范
show databases(;或者\g):显示数据库
use 数据库名;:使用进入数据库
show tables;:显示当前数据库里的表名
show tables from 数据库:显示某个数据库里的表名
select database();:显示当前位于哪个数据库
desc 表名;:显示表的schema
查看MySQL版本:
select version();
mysql --version
mysql -V
MySQL语法规范
1.不区分大小写,关键字大写,表名,列名小写
2.每条命令分号结尾
3.每条命令根据需要缩进换行。建议关键字一行
4.注释是#和--空格 来当行注释,/* */多行
图形界面客户端:
SQLyog和Navicat
第五章.DQL语言的学习
myemployees库的四张表
1.departments:
2.employees:
3.jobs:
4.locations:
基础查询
select 查询列表 from 表名
查询列表:表中字段,常量,表达式,函数
查询结果是虚拟表格
1.查询表格中的单个字段
select last_name from employees;
2.查询表格中的多个字段
select last_name,salary,email from employees;
3.查询表格中的所有字段
select * from employees;
细节补充:
use myemployees;
``着重号代表不转义,关键字也可以在里边使用
查询常量:
select 100;结果的字段名是100,即常量
查询表达式:
select 100*98;结果的列字段名是“100*98”
查询函数:
select database();结果列的字段名是database()
结果列起别名:
方式一:
select 100*98 as result from employees;
好处:1.结果清晰2.别名区分重名字段,比如自连接
方式二:
select last_name 姓 from employees;省略as
如果别名有空格,用着重号包起来
去重:
select distinct departmeng_id from employees;
+号的作用:
列合并用contat函数而不是+号
+号只能做数值运算符,不能用在非数值字符上,否则字符被转换成0;只有+的操作数有一个是null,结果就是null
concat作用:
字符连接用concat
select concat(last_name,first_name) as 姓名 from employees;
ifnull:
如果是第一个参数是null,返回第二个参数。可以用来在做concat的时候修饰可能是null值的列
条件查询
select 查询列表 from 表名 where 【筛选条件】;
筛选条件分类:
1.按条件表达式筛选:条件运算符,> < = != <> >= <=
select * from from employees where salary > 12000;
2.按逻辑表达式筛选:逻辑运算符,&& || ! and or not,连接条件表达式
select last_name, salary from employees where salary > 1000 && salary <= 20000;
3.模糊查询:like, between and,in,is null
like:不是完全匹配,包含部分字符
select * from employees where last_name like '%a%';通配符用%
一般和通配符搭配使用。
%:任意多个字符,可以是0个
_:任意单个字符
\为转义
'_$_' escape '$'表明转义字符为💲,也可以是任意字符
between and:在某个范围内,闭区间,提高语句简洁度。两边的值不满足交换律
select * from employees where saly between 10000 and 150000
in:值在一个散列集合里。提高语句简洁度。集合里的值类型要统一或者兼容。不支持通配符
select * from employees where job_id in ('IT_PROT', 'AD_VP')
is (not)null:判断null值。等号和不等号不能判断null值,这个不能判断列值是否是普通类型数值
select last_name, commission_pct from employees where commission_pct is null;
安全等于:<=>,可以判断null值,普通类型的值也可以
排序查询
order by 排序列表 acc | desc,排序列表可以用逗号分隔
select * from employees order by salary desc
常见函数
调用:select 函数名() from 表
分类:
单行函数:每一行处理,一对一映射
分组函数:多行统计,多对一
单行函数分类:
字符函数:
length:字符串字节长度
concat:拼接字符串
upper:换成大写
lower:换成小写
substring,substr:截取字符串,索引从1开始
instr:子串在字符串里的索引
trim:去前后空格,trim("a" from "aaaaBBBBBaaaaBBBBaaa")则结果为 BBBBBaaaaBBBB
lpad:左边填充字符,最后字符长度为第二个参数指定,可能裁剪
rpad:右填充
replace:替换字符,全部替换
数学函数:
round:四舍五入;两个参数取小数点位数
ceil:向上取整
floor:向下取整
truncate:截断,取小数点后位数
mod:取余数,和%一样
日期函数:
now:当前时间日期
curdate:当前日期
curtime:当前时间
获取指定的部分,比如年月日:year,month,monthname
str_to_date:将字符串转为日期
date_format:将日期转为字符
datediff:算日期差距
其他函数:
verson:数据库管理软件版本
database:当前数据库
user:当前用户
流程控制函数:
if:参数类似三元运算符
case:
使用1:
case 表达式
when 常量1 then
when 常量2 then
else
end
使用2:多重if
case
when 条件1 then
when 条件2 then
else
end
分组函数
sum
avg
max
min
count
参数类型:sum,avg处理数值型数据,max,min,count处理任何类型;忽略null值
和distinct搭配:sum(distinct 列名),去重后相加,主要给count用
count函数:可用四个参数
参数为*:任何列,只要有非空的,就被统计进去
count(1):每一行加个值为1的列
*一般效率最高
和分组函数一同查询的字段有限制:
要求是groupby的字段。否则普通字段的话返回的是一组值里的一个,没意义
分组查询
1.介绍
select column(不能是随便的一列), group_func(column)
from table
where condition
group by (分组条件一般是column)
将相同column值的行聚合在一起,可以应用聚合函数,多对一,column相当于一个key带着一个数组
2.筛选
分组前筛选:针对每一行筛选,where条件指定
分组后筛选:针对聚合结果筛选,having条件指定
筛选总结:筛选数据源不同,原始表或者分组后结果集。分组函数做条件放having字句里,为了性能尽量用分组前筛选
按函数分组:group by后接函数/表达式,这是对每一行算一下添加一个新列(单行函数)
按多个字段分组:多个字段可以组成联合主键唯一标识一个特性,可以一起select出更清楚。即是多个列都一样的行才能分成一个组内
分组查询顺序:order by后加聚合条件的列名
总结:group by支持按照单个字段分组,也支持按照多个字段分组,也支持表达式/函数分组
连接查询
多表查询
1.笛卡尔积
from a,b:默认就是笛卡尔乘积,没有加任何连接条件。两个表每一行一一匹配
通过where子句,设置连接条件,筛选里边的行
2.连接查询分类
按年代分类:
- sql92标准
- sql99标准
按功能分类:
内连接
- 等值连接
- 非等值连接
- 自连接
外连接
- 左外连接
- 右外连接
- 全外连接
交叉连接
3.等值连接
where指定两个表的列表达式对比条件,列名有重复的要加表前缀
from子句中用as为表起别名(或者不加as)。起过表别名后,不能再使用原表名
结果是两个表的交集,相应列在两个表里都要有
有筛选的查询:用AND附加在where条件后
多表查询就是几个表,找相应列符合条件,条件可以是多个表达式逻辑组合;换句话说就是几个表挑列
n表连接,至少n-1个连接条件
4.非等值连接
where子句里用非等于号,因为两个表里的数据不能用等于判断,可能需要是范围值
5.自连接
相当于等值连接,但只有一个表,一个表分饰两个角色
sql99语法
1.介绍
select 列名
from 表1
【连接类型】join 表2
on 连接条件
内连接:inner
左外:left 【outer】
右外:right 【outer】
全外:full 【outer】
交叉连接:cross
2.等值连接
与之前类似,叫了on, join结构更清楚
3.非等值连接
与之前类似,叫了on, join结构更清楚
4.自连接
与之前类似,叫了on, join结构更清楚
5.左右外连接
查询a表内容不在b表里的行,即一个表中有另一个表中没有的记录
一种主从结构,左外连接以左边的表为主表,右外连接以右边的表为主表
结果集为内连接结果+主表中有从表中没有的
判断在不在一般用主键
6.全外连接
MySQL不支持,用联合查询代替
是把交集部分查出来+左表有右表没有+右表有左表没有
7.交叉连接
笛卡尔乘积
select 列名
from 表1
cross join 表2
总结:join可以有七种,分别查交集,表1+交集,表2+交集,表1,表2,全部,全部-交集
子查询
1.介绍
出现在其他语句中的select语句,叫做子查询或者内查询
外部查询语句是主查询或者内查询
分类:
按结果集的行数不同
标量子查询:一行一列
列子查询:一列多行
行子查询:一行多列
表子查询:多行多列
2.where
子查询结果当作条件参数
特点:
1.子查询放在小括号内
2.子查询放在条件的右侧
3.标量子查询配合单行操作符使用,>,<等;列子查询配合多行操作符使用,in 、not in、any、some、all
4.子查询优先于主查询先执行,主查询的条件用到了子查询结果
非法使用子查询:数目不对的话,会报错;空的子查询结果集结果是空
1.标量
子查询结果是一个标量,一行一列
2.列
子查询结果是一个列多行
3.行
一行多列或者多行多列
where条件里向量化,where (列1,列2) = (子查询(每个列可以是一个函数,得到一行))
3.select
仅仅支持标量子查询
子查询结果当作结果集中的一列
可以把当前行相应的列值,送到子查询里当参数,返回的是一个标量,匹配主查询里一行,当作结果集
一般可以用表连接替代
4.from
支持表子查询
子查询结果当作中间表
子查询的结果集当成一个表来连接。要用as起个别名方便后面引用
5.exists
相关子查询,仅仅支持表子查询
子查询结果当作条件结果
exists(子查询)
一个子查询里有没有值,有返回1,没有返回0
用在where里,先执行主查询,再执行子查询,过滤,判断是否在在行。where的本质是返回的值为1,该行保留
分页查询
limit子句
limt offset, size
offset从0开始
offset公式是(page-1)* size
union联合查询
并集
将多条查询语句结果,合并为一个结果集(行数相加)
把or这个大的条件,拆成多个,结果集去重
可以实现全连接,但是没办法两个表横着拼接,只能竖着拼
查询多个表,多个表没有关系,但是查询信息一致
要求:
1.两个表列数一致
2.列的顺序要一致,不然歧义
3.结果集去重,UNION ALL不去重
第六章.DML语言的学习
插入语句
insert
表明 列名 新值
第一种插入:
insert into 表名(列名1,……) values(值1,……)
插入的值要与列类型兼容
可以为空的列,不写就是插入null;或者写列名,值用null填充;列的顺序可以调换
列和值数量要一致
列名可以省略,默认是所有列,顺序不能变
第二种插入:
insert into 表名 set 列名=值,列名=值
对比总结:
方式1支持插入多行
方式1支持子查询,把子查询(比如其他表)的结果插入,一个select语句放的都是常量返回的也是一行
修改语句
update
修改单表:
update 表
set 列=新值,列=新值
where
修改多表:
级联更新
update 表1
连接表2
set 列=值(针对连接后表的列)
where
删除语句
delete
第一种删除:
delete from 表名 where
第二章删除:
truncate table 表名:删除这个表里的数据
truncate删除后,自增长列重新开始,delete不会
truncate没有返回值;delete返回影响几行
truncate不能回滚,delete可以回滚
第七章.DLL语言的学习
创建/修改/删除/查询库和表
create
alter
drop
show
库和表的管理
库:
create database 数据库名
create database if not exists 数据库名,数据库存在也不会报错
更改库的字符集:alter database 库名 character set 【】
drop database ,删库
表:
创建:create table 表名(列名 类型 (长度) 约束,)
修改:修改列名,类型,约束,添加列,删除列,修改表名
修改列名:alter table 表名 change column 旧列名 新列名 类型
修改类型:alter table 表名 modify column 列名 类型
添加列:alter table 表名 add column 新列名 类型
删除列:alter table 表名 drop column 列名
重命名表:alter table 表名 rename to 新表名
删除:
drop table 表
复制:
1.仅仅复制表结构
create table 表名 like 现有表
2.复制内容
create table 表名
select * from 表,用子查询返回一个临时表
只复制部分列名:子查询where都是假
常见数据类型介绍
- 数值型
- 整型
- 小数
- 定点数
- 浮点数
- 字符型
- 较短的文本
- char
- varchar
- 较长的文本
- text
- blob
- 日期型
整型:
分类:
Tinyint:1
Smallint:2
Mediumint:3
Int,integer:4
BigInt:8
特点:
设置无符号,有符号:
int类型后边跟unsigned,即为无符号,否则默认为有符号
超出了范围,会有警告报错,数值为0或者插不进去
Int (7)设置显示结果宽度,zerofill可以用0填充显示位并且int默认是无符号
小数:
浮点:
float:4
double:8
定点:
dec(m,d):m+2
decimal(m,d):m+2
特点:m代表整数部位+小数部位,d代表小数部位。如果超过范围,插入临界值
默认decimal是10,0;float和double没有限制
定点型精度较高,如货币运算
所选择的类型越简单越好
字符型:
char(m):最长m个字符,空间固定m个字符,m默认为1
varchar(m):最长m个字符,空间根据实际字符数来取,m不可以省略
bit(m):
binary
varbinary
enum:最多两个字节,必须是列表中的一个值。enum(“a”, “b”)。不区分大小写
set:和枚举类似,可以一次插入列表中的多个。 values(‘a,b,c’)
日期型:
date:4
datetime:8
timestamp:4,范围比datetime小,和实际时区相关,时间会跟着时区变
time:3
year:1
常见约束
限制数据,保证数据可靠准确性
六大约束:
not null:非空约束
default:默认约束,有默认值
primary key:主键约束,具有唯一性非空
unique:唯一约束,唯一性可为空
check:检查约束,满足一定条件才可以,MySQL不支持
foreign key(references):外键约束。从表添加该约束
show index from 表名:显示索引。主键,外键,唯一键自动生成索引
创建表和修改表时添加约束
约束分类:
列级
表级
外键约束对列级无效
非空和默认约束对表级约束无效
添加列级约束:
约束放在类型后面
添加表级约束:
列最后加约束,constraint 约束名 约束
主键和唯一区别:
唯一只可以插一个null
两个列可以组合成主键(定义的时候一起放括号里),唯一键,联合主键
外键特点:
在从表里设置外键关系
主表从表里要类型兼容,名称无所谓
外键在主表里要是key(主键或者唯一键)
插入数据先插入主表,删除数据时先删除从表
不同约束可以用空格间隔约束同一个列
修改表时添加约束:
修改表时(modify),直接在列后边加约束
表级约束:用Add加约束
修改表时删除约束:
modify的约束用null替代或者不写
表级约束:drop 约束类型 约束名
主键起约束名字也没有效果
外键级联删除:
最后加on delete cascade
外键级联置空:
on delete set null
标识列:
限制某个字段,又叫自增长列
id Int Primary Key auto_increment
变量auto_increment_increment auto_increment_offset定义步长与起始值,MySQL里不能设置起始值
起始值可以用第一条数据插入值来设定
标识列要和key搭配
一个表中只能有至多一个标识列
标识列只能是数值型
修改表时也可以设置标识列
第八章.TCL语言的学习
事物和事物处理
介绍:
事物:一组sql语句成为一个执行单元,要不全部执行,要不都不执行。一部失败则回滚
show engines显示存储引擎
acid:
1.原子性:事物不可分割
2.一致性:事物导致数据从一个一致性状态转换为另一个一致性状态
3.隔离性:事物并发不能互相干扰,需要隔离级别来控制
4.持久性:事物一旦提交,对数据改变是永久的
事物创建:
1.隐式事物:自动开启,关闭,比如delete/update/create,变量autocommit可以看
2.显示事物:先关闭自动提交,具有明显开始结束标志
set autocommit = 0;
start transaction;
commit or rollback,autommit自动开启
事物并发:
事物访问相同数据,竞争访问,在事物过程中会有以下问题:
1.脏读:t1读取了t2更新但是回滚的数据
2.不可重复读:t1读了一次,t2更新了一次,t1再读不一样
3.幻读:t1读,t2插入,t1再读,数据数量变了
隔离级别是隔离程度,隔离级别越高,并发性越差数据一致性越好
MySQL提供四种隔离级别:
1.read uncommitted:脏读,不可重复读,幻读都有
2.read commited:提交后再读。不可重复读,幻读都有。
3.repeatable read:事物里已有数据不能更改。幻读
4.serializable:没有问题
MySQL默认隔离级别是repeatable read
Oracle只有两个,read commited和serializable
查看隔离级别:
变量@@tx_isolation
设置隔离级别:set session transaction isolation level read uncommitted
设置全局隔离级别:set global transaction isolation level read uncommitted
回滚点:
savepoint 节点名;
rollback to 节点名
delete和truncate在事物中的区别:
truncate不能回滚
第九章.视图的讲解
介绍:
虚拟表
临时性,通过表动态生成,查询过一次的缓存。视图是sql语句,而不是查询结果
适合多次使用,sql比较复杂的情况
视图一般不带where之类的语句
重用sql,简化调用的sql,保护安全
创建:
create view 视图名
as
查询语句;
修改:
create or replace view 视图名
as
查询语句;
alter view 视图名
as
查询语句;
删除:
drop view 视图名1,视图名2
查看:
desc view1
show create view view1(显示创建视图过程)
视图里实现插入:
insert into view1 values()
更改和删除亦可,但是受到限制
具有以下元素的视图不能被更新
- 分组函数,distinct,group by,having,union,union all
- 常量视图
- select包含子查询
- join
- from一个不能更新的视图
- where子句的子查询引用了from子句中的表
不能有中间表
视图和表的区别
create view
create table
表占用物理空间
第十章.变量
分类:
1.系统变量
变量由系统提供的
查看所有变量
show global | session variables
查看满足条件的系统变量
show global | session variables like ‘%变量名%’
查看指定变量的值
select @@global | session.系统变量名
为某个系统变量赋值
set global | session 系统变量名 = 值
set @@global | session.系统变量名 = 值
什么也不写默认会话级别
1.全局变量
重启后全局变量修改无效,要改配置文件才行
2.会话变量
2.自定义变量
使用步骤:
声明
赋值
使用
1.用户变量
会话期有效
set @用户变量名=值
set @用户变量名:=值
select @用户变量名:=值
select 字段名 into 变量名 from 表
2.局部变量
作用域在begin end块中,且声明为第一句
声明:
declare 变量名 类型 default 默认值
赋值:
set 用户变量名=值
set 用户变量名:=值
select @用户变量名:=值
select 字段名 into 变量名 from 表
使用:
select 局部变量名
第十一章.存储过程和函数
提供代码重用性
简化操作
存储过程
一组预先编译好的SQL语句集合,类似批处理语句
可以有预编译,多条语句只需连接一次数据库
语法:
创建:
create procedure 存储过程名(参数列表)
begin
方法体
end
参数列表包含三部分:
参数模式 参数名 参数类型
参数模式:in out inout
存储过程只有一句话,begin end可以省略
delimiter 结束标志,重新设置存储过程结尾,默认是分号,但是在客户端不好用
使用:
call 存储过程名(实参列表)
空参列表:
不带参数,直接调用
in模式:
参数不带返回值
out模式:
保存返回值
inout模式:
参数既有输入,也保存返回值
存储过程删除:
drop procedure 存储过程名字
一次只能删除一个
存储过程查看:
show create procedure 存储过程名
函数
和存储过程区别:
函数有且只能有一个返回(适合处理数据);存储过程可以有0个或多个 (适合增删改)
创建函数:
create function 函数名(参数列表) returns 类型
begin
函数体
end
注意事项:
参数列表:参数名,参数类型
函数体:要有return语句
函数体只有一句话,省略begin end
调用函数:select 函数名(参数列表)
删除函数:
drop function 函数名
查看函数:
show create function 函数名
第十二章.流程控制结构
介绍
顺序结构
分级结构
循环结构
case:
类似switch,等值判断
case 值
when 值1 then;
when 值2 then;
else ;
end case;
类似if,区间判断
case
when 条件1 then;
when 条件2 then;
else;
end case;
既可以作为表达式,也可以做语句
if:
if 条件1 then ;
elseif 条件2 then;
else ;
end if;
循环:
分类:
while
loop
repeat
控制:
iterate 标签名
leave 标签名
标签: while 循环条件 do
循环体
end while 标签;
标签: loop
循环体
end loop 标签;
模拟死循环
标签:repeat
循环体
until 结束循环条件
end repeat 标签;
至少执行一次
第十三章 触发器
为某张表绑定好代码,当表中内容改变时(增删改),触发代码执行
触发器:事件类型,触发时间,触发对象
触发类型:增删改
触发时间:前后
触发对象:行记录
MySQL高级结构没有大括号,都是用字符符号代替
创建
create trigger 触发器名 触发时间 事件类型 on 表名 for each row
begin
end;
查看
show triggers 【like ‘pattern’】
show create trigger 触发器名字
\G:结果颠倒90度
触发器保存到information_schema.triggers表中
使用
某种情况发生,自动触发
删除
drop tirgger 触发器名字
记录
每个操作要执行,系统将操作的数据新旧状态记录下来
访问使用old.字段名和new.字段名
第十四章 游标
第十五章 事件
定时器,时间到了自动执行