MYSQL学习笔记
MySQL
1.数据库基础
DB
数据库(database),用来存储有组织的数据的大仓库
DBMS
数据库管理系统(database management system),又成为数据库软件,数据库是通过DBMS创建和操作的容器
SQL
结构化查询语言 (Structured Query Language),程序员与DBMS所交互的语言
2.数据库特点
1.数据库的每一个表的表名具有唯一性
2.每一张表相当于java中的一个类
3.每一行数据相当于创建的对象
3.数据库基本命令
show databases;
查询当前目录下有多少个数据库
show databases;
----------运行结果------------
Databases
information_schema
MyDatabase
mysql
performance_schema
sys
Use MyDatabases;
进入MyDatabases数据库
show tables;
展示当前数据库中所有的表
use MyDatabase;
show tables;
-------------运行结果------------------
table_in_mydatabse
demo
create table 表名();
创建表
desc 表名;
查看当前表的结构
create table stuinfo(
id varchar(10),
name varchar(20)
);
select * from stuinfo;
--------------运行结果----------------------
id name

Select version();
查询当前mysql的版本
select version();
------------------运行结果-----------------
version
5.7.18-cynos-log
3.MySQL语法规范
1.mysql不区分大小写,建议关键字大写,表名,列名小写
2.每条命令最好用大小写区分
3.每条命令根据需要,可以进行缩进,或换行
4.注释
单行注释:#注释文字
单行注释:-- 注释文字
多行注释:/**/
4.DQL语言的学习
1、基础查询
1.语法
select 查询列表
from 表名
**2.特点 **
1.查询列表可以是字段、常量、表达式、函数、也可以是多个字段
2.查询结果是一个虚拟的表
3.示例
1.查询单个字段
select 字段名 from 表名;
2.查询多个字段
select 字段名 , 字段名 from 表名;
3.查询所有字段
select * from 表名;
4.查询常量
select 常量;
ps:字符型和日期型必须用单引号引起来,数值型不需要
5.查询函数
select 函数名(实参列表);
6.查询表达式
select 1000/231;
7.起别名
1、as
2、空格
8.去重
select distinct 字段名 from 表名;
ps:去重只能去一个字段
9.+
作用:做加法运算
select 数值+数值 直接运算;
select 字符+数值 先试图将字符转换为数值,转换成功,则做加法运算,否则转换为0,在做运算
10、【补充】concat函数
功能:拼接字符串
select concat(字符,字符,...);
11、【补充】ifnull()函数
功能:判断某字段或表达式是否为null,如果为null,返回原本的值
IFNULL(commission_pct,0))
12、【补充】isnull函数
功能:判断字段或者表达式是否为null,如果是,则返回1,否则返回0
2、条件查询
1.简单条件运算符
< > <= >= <> !=
2.逻辑运算符
&& and
! not
|| or
3.模糊查询
1.like:一般搭配通配符使用,用来判断数值型和字符型
通配符:多个字符 % , 单个字符_
2.between and
3.in
4.is null /is not null
3、排序查询
1.语法、
select 查询列表
from 表
where 筛选条件
order by 排序列表【desc/asc】
2.特点
1.asc:升序,如果不写默认升序
desc降序
2.排序列表 支持 单个字段、多个字段、函数、表达式、别名
3.order by的位置一般放在查询语句的最后(除limit语句之外)
4、常见函数
1.概述
功能:类似于Java的方法
好处:提高重用性
调用:select函数名(实参列表)
2.单行函数
1.字符函数
concat:连接字符串
instr:查询子串
substr:截取字符串
length:显示字节长度
trim:去除前后空格
lpad:向左填充
rpad:向右填充
replace:替换字符串
upper:大写
lower:小写
3.数学函数
round:四舍五入
ceil:向上撩
flooer:向下撩
truncate:截断(取几位小数)
mod:取余数
4.日期函数
now:获取当前日期时间
curdate:获取当前日期
curtime:获取当前时间
year、month、date、hour、minute、second:获取对应的时间
str_to_date:将字符串转换成日期
dateformat:将字符串换为对应的格式
datediff:计算两个日期相差多少

5.流程控制函数
if(条件表达式,表达式1,表达式2):相当于三元运算符,如果条件表达式成立,则返回表达式 1,否则返回表达式2
case 表达式/常量值
when 常量值 /表达式
then 常量值
6.其它函数
version:查看当前数据库的版本
MD5(“字符”):加密
password(“字符”):放回该字符的密码形式
user:当前用户
database:打开当前数据库
7.分组函数
1.分类
max:最大值
min:最小值
sum:和
avg:平均
count:计数
2.特点
语法:
select max(字段) from 表名;
支持的类型:
sum和avg一般处理数字类型
max、min、count可以处理任意数据类型
已上分组都忽略null
可以搭配distinct使用,实现去重统计
select sum(distinct 字段) from 表;
count函数
count(字段):统计该字段非空值的个数
count(*):统计结果集的行数
5、组查询
1.语法
select 字段,分组函数
from 表名
【where 筛选条件】
group by 字段;【也可以添加多个字段当约束条件大于1的时候】
【having 分组后的筛选】
【order by 排序列表】
2.特点
使用关键字 筛选的表 位置
分组前筛选 where 原始表 group by前面
分组后筛选 having 分组后的结果 group by后面
6、连接查询
1.含义
当查询中涉及到多个表的字段,需要使用多表连接
select 字段1.字段2
from 表1,表2....;
笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决:添加有效的连接条件
2.分类
按年代进行分类:
sql92:
等值
非等值
自连接
也支持一部分外连接(用于oracle,SQLserve,mysql不支持)
sql99:
内连接
等值
非等值
自连接
外连接
左外
右外
全外(mysql不支持)
交叉连接
3.SQL92语法
1.等值连接
语法:
select 查询列表
from 表1 表名,表2 表名
where 表1.key=表2.key
【and 筛选条件】
【groupy by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
特点:
1、一般为表取别名
2、多表的顺序可以调换
3、n表连接掷筛需要n-1个连接条件
4、等值连接的结果是多表的交集部分
2.非等值连接
语法:
select 查询列表
from 表1 表名,表2 表名
where 非等值连接条件
【and 筛选条件】
【groupy by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
3.自连接
语法:
select 查询列表
from 表 表名,表 表名
where 表.key=表.key
【and 筛选条件】
【groupy by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
4.SQL99语法
1.内连接

2.外连接




3.交叉连接
4、sql99语法
1、内连接
语法:
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件
【where筛选条件】
【groupy by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
【limit语句】
特点:
表的顺序可以调换
内连接的结果=多表的交集
n表连接至少也需要n-1个连接条件
分类:
等值连接
非等值连接
自连接
2、外连接
语法:
select 查询列表
from 表1 别名
right outer/left join 表2 别名
on 连接条件
【where筛选条件】
【groupy by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
【limit语句】
特点:
查询的结果=主表中所有的行,其中从表和它匹配的将显示匹配行,如果没有匹配则显示null
left join 左边就是主表,right join 右边就是主表
一般查询除了交集部分的剩余不匹配的
7、子查询
1、含义
嵌套在其他语句中的select语句称为子查询或者内查询
外面的语句可以是inner、update、delete、select等,一般select作为外面的语句较多
外面如果为select语句,则称为外查询或者主查询
2、分类
1、出现位置
select后面
仅仅支持标量子查询
where/having后面
列子查询
标量子查询
行子查询
from后面
表子查询
exists后面
列子查询
标量子查询
行子查询
表子查询
2、按结果集的行列
标量子查询(单行子查询):结果为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
表子查询:结果集为多行多列
3、示例
where/having后面
1、标量子查询
案例:查询一下最低工资的员工姓名和工资
最低工资 select min(salary) from employees;
最低工资的员工姓名和工资
select last_name,salary from employees where salary = (select min(salary) from employees)
2、列子查询
案例:查询所有是领导的员工姓名
select manage_id from employees;
select last_name from employees where employee_id in (select manage_id from employees );
8、分页查询
1、应用场景
当要查询的条目数太多,一页显示不全时
2、语法
select 查询列表
from 表名
limit 【offset】,size;
注意:
offset代表的是起始的条目索引,默认从零开始
size代表的是条目个数
3、公式
假如要显示的页数为page,每一页条目数为size
select 查询列表
from 表
limit (page - 1)*size,size;
9、联合查询
1、含义
union:合并、联合,将多次查询结果合并成一个结果
2、语法
查询语句
union 【all】
查询语句
union 【all】
......
3、意义
1、将一条比较复杂的查询语句差分成多条语句
2、适用于查询多个表的时候,查询的列基本是一致的
4、特点
1、要求多条查询语句的查询列数必须一致
2、要求多条查询语句查询的各列类型、顺序最好一致
3、union去重,union包含重复
10、查询总结
语法:
select 查询列表7️⃣
from 表1 表名1️⃣
连接类型 join 表22️⃣
on 连接条件3️⃣
where 筛选4️⃣
group by 分组列表5️⃣
having 筛选6️⃣
order by排序列表8️⃣
limit 起始条目索引,条目数9️⃣
5、DML语言
1、插入
方式一
1、语法
inset into 表名(字段名,...) values(值)
2、特点
1、要求值的类型和字段要一致或兼容
2、字段的个数和顺序不一定和原始表中的字段个数和顺序一致但必须博癌症值和字段一一对应
3、假如表中有可以为null的字段,注意可以通过以下两种方式插入null值
字段和值都可以省略
字段写上,值使用null
4、字段和数值的个数必须要相等
5、字段名可以省略,默认所有列
方式二
1、语法
insert into表名 set 列 = 值,......
两种方式的区别
1、方式一支持一次插入多行,语法如下:
inset into 表名 【(字段名,...)】values(值...),(值....),........;
2、方法一支持子查询,语法如下:
insert into select 查询列表
2、修改
1、修改单表的记录
语法:
update 表名 set 字段 = 值,.......【where 筛选条件】;
2、修改多表的记录
语法:
update 表1 别名
left|right|inner join 表2 别名
on 连接条件
set 字段=值
【where 筛选条件】;
3、删除
方式一:使用delete
1、删除的单表记录
语法:
delete from 表名 【where 筛选条件】;
2、级联删除【补充】
语法:
delete 表1,表2 from 表1 别名 left|right|inner join 表2 on 连接条件 【where 筛选条件】
方式二:使用truncate
语法:
truncate table 表名
两种方式的区别【面试题】⭐️
1、truncate删除,如果再插入,标识列从1开始
delete 删除后,如果再插入,标识列从断点开始
2、delete可以添加筛选条件
truncate不可以添加筛选条件
3、truncate效率高
4、truncate没有返回值
delete受返回影响的行数
5、truncate不可以回滚
6、delete可以回滚
6、DDL语言
1、库的管理
1、创建库
create database 【if not exists】 库名 【character set 字符集名】;
2、修改库
alter database 库名 character set 字符集名;
3、删除库
drop database 库名;
2、表的管理
1、创建表
create table 【if exists】 表名(
字段名 字段类型【约束】,
字段名 字段类型【约束】,
......
)
2、修改表
1、添加列
alter table 表名 add column 列名 类型 【first|after 字段名】
2、修改列的类型和约束
alter table 表名 modify column 列名 新类型 【新约束】
3、修改列名
alter table 表名 change column 列名 新列明 类型;
4、删除列
alter table 表名 drop column 列名;
5、修改表名
alter table 表名 rename to 新表名
3、删除表
drop table 【if exists】 表名;
4、表的复制
1、复制表的结构
create table 表名 like 旧表;
2、复制表的结构加数据
create table 表名
select 查询列表 from 旧表【where 筛选列表】;
3、数据类型
1、数值型
1、整形
tinyint、smallint、mediumint、int/Integer、bigint
1 2 3 4 8
特点:
都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号
如果超出了范围,会爆出out of range异常,并插入临界值
长度可以不指定,默认会有一个长度
长度代表显示的最大宽度,如果左边不够用0填充,但需要搭配zerofill使用,并且默认转变为无符号型
2、浮点型
定点数:decimal(M,D)
浮点数:float(M,D)
double(M,D)
特点:
M代表整数位数加小数部位个数,D代表小数部位
如果超出范围,则会爆出out of range异常,并且插入临界值擦
M和D都可以省略,但对于定点数来说,M默认是10,D默认是0
如果要求精度较高,则优先考虑使用定点数
3、字符型
char、varcahr、binary、varbinary、enum、set、text、blob
char:固定长度的字符,写法为char(M),最大长度不超过M,其中M可以省略,默认为1
varchar:可变长度的字符,写法为varchar(M),最大长度不超过M,其中M可以不省略
4、日期型
year年
date日期
time时间
datetime 日期+时间 8
timestamp 日期+时间 4 比较容易受时区、语法模式、版本的影响,更能反应当前时区的真实反应
4、约束
1、常见的约束
not null:非空,该字段的值必须填
unique:唯一该字段的值不可重复
default:默认,字段的值不用手动插入有默认值
check:检查
primary key:主键,该字段的值不可重复并且非空
foreign key:外键,该字段的值引用了另外的表的字段
主键和唯一的区别:
1、一个表至多有一个主键,但可以有多个唯一
2、主键不允许为空、唯一可以为空
相同点
都具有唯一性
都支持组合键,但不推荐
外键:
1、用于限制两个表的关系,从表的字段引用了主表的某字段值
2、外键和主表的引用列要求类型一致,意义一样,名称无要求
3、主表的引用列要求是一个key(一般就是主键)
4、插入数据,先插入主表
删除数据,先删除从表
2、创建表时添加约束
create table 表名(
字段名 字段类型 not null;
字段名 字段类型 primary key;
字段名 字段类型 unique;
字段名 字段类型 default;
constraint 约束名 foreign key(字段名)reference 主表(被引用列)
);
注意:
支持类型 可以约束名
列级约束 除了外键 不可以
表级约束 除了非空和默认 可以但对主键无效
列级约束可以在一个字段上追加多个,中间用空格隔开,没有顺序要求
3、修改表时添加或删除约束
1、非空
添加非空
alter table 表名 modify column 字段名 字段类型 not null;
删除非空
alter table 表名 modify column 字段名 字段类型;
2、默认
添加默认
alter table 表名 modify column 字段名 字段类型 default;
删除非空
alter table 表名 modify column 字段名 字段类型;
3、主键
添加主键
alter table 表名 add primary key(字段名);
删除主键
alter table 表名 drop primary key;
4、唯一
添加唯一
alter table 表名 add unique(字段名);
删除唯一
alter table 表名 drop index 索引名;
5、外键
添加外键
alter table 表名 add foreign key(字段名) references 主表 (被引用列);
删除外键
alter table 表名 add drop foreign key 约束名;
4、自增长列
特点:
1、不用手动插入,可以自动提供序列值,默认从1开始,步长为1
auto_increment_increment
如果要更改起始值:手动插入值
如果要更改步长:更改系统变量
set auto_increment_increment = 值;
2、一个表至多有一个自增长列
3、自增长列必须为一个key
4、自增长列只能支持数值型
创建时设置自增长列
create table 表(
字段名 字段类型 约束 auto_increment;
)
修改表时设置自增长列
alter table 表 modify column 字段名 字段类型 约束 auto_increment;
删除自增长列
alter table 表 modify column 字段名 字段类型 约束
7、TCL语言
1、事务
1、含义
事务:一条或者多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行
2、特点(acid)
A 原子性:一个事务是不可在分割的整体,要么都执行要么都不执行
C 一致性:一个事务可以使数据从一个一致的状态切换到另一个一致的状态
I 隔离性:一个事务一个事务不受其他事物的干扰,多个事务互相隔离的
D 持久性:一个事物一旦提交了,则永久的持久化到本地
3、事物的使用步骤
了解:
隐式(自动)事务:没有明显的开始和结束,本身就是一条事务可以自动提交,比如insert、update、delete
显式事务:具有明显的开始和结束
使用显式事务:
1、开启事务
set autocommit = 0;
【start transaction;】可以省略
2、编写一组逻辑sql语句
注意:sql语句支持的是insert、update、select、delete
设置回滚点
savepoint 回滚点名;
3、结束事务
提交:commit;
回滚:rollback;
回滚到指定的地方:rollback to 回滚点名
4、并发事务
1、事务的并发问题是如何发生的?
多个事务 同时 操作同一个数据库的相同数据时
2、并发的问题有哪些?
脏读:一个事物读取了其他的事务还没有提交的数据,读到的是其他事物的更新
不可重复读:一个事务多次读取,结构不一样
幻读:一个事物读取了其他事物还没有提交的数据,只是读到的是,其他事物‘插入’的数据
3、如何解决并发问题
通过设置隔离级别来解决并发问题
4、隔离级别
脏读 不可重复读 幻读
read uncommitted:读未提交 × × ×
read committed:读已提交 √ × ×
repeatable read:可重复读 √ √ ×
serializable:串行化 √ √ √
8、其他
1、视图
1、含义
MySQL5.1版本出现的新特性,本身是一个虚拟表,他的数据来自于表,通过表动态生成的
好处:
简化sql语句
提高了sql的重用性
保护基表的数据,提高了安全性
2、创建
create view 视图名
as
查询语句;
3、修改
方式一:
create or replace 视图名
as
查询语句;
方式二:
alter view 视图名
as
查询语句;
4、删除
drop view 视图1,视图2.....;
5、查看
desc 视图名;
show create view 视图名;
6、使用
1、插入
insert
2、修改
update
3、删除
delete
4、查看
select
注意:视图一般用于查询的,而不是更新,所以具备以下特点的视图都不允许更新
1、包含分组函数、group by、distinct、having、union
2、join
3、常量视图
4、where后的子查询用到了from中的表
5、用到了不可更新的视图
7、视图与表的对比
关键字 是否占用物理空间 使用
视图 view 占用较小,只保存sql逻辑 一般用于查询
表 table 保存实际的数据 增删改查
2、变量
分类
一、系统变量
说明:变量由系统提供的,不用自定义
语法:
1、查看系统变量
show global|session variables;如果没有显示声明global还是session,则默认是session
2、查看指定的系统变量的值
select @@【global|session】.变量名;
3、为系统变量赋值
方式一:
set 【global|session】 变量 = 值;
方式二:
set @@global.变量名 = 值
方式三:
set @@变量名 = 值;
1、全局变量
服务器层面上的,必须拥有super权限才能为系统变量赋值,作用域为整个服务器,也就是针对于所有(会话)有效
2、会话变量
服务器为每一个连接的客户端都提供了系统变量,作用域为当前的连接(会话)
二、自定义变量
说明:
1、用户变量
作用域:针对于当前连接(会话)有效
位置:begin end里面,也可以放在外面
使用:
1、声明并赋值
set @变量名 = 值;或
set @变量名:=值;或
select @变量名:=值
2、更新值
方式一:
set @变量名 = 值;或
set @变量名:=值;或
select @变量名:=值
方式二:
select xx into @变量名 from 表;
3、使用
select @变量名;
2、局部变量
作用域:仅仅在定义它的begin end中有效
位置:只能放在begin end中,而且只能放在第一句
使用:
1、声明
declare 变量名 类型 【default 值】;
2、赋值或更新
方式一:
set 变量名 = 值;或
set 变量名:=值;或
select 变量名:=值
方式二:
select xx into 变量名 from 表;
3、使用
select 变量名;
3、存储过程和函数
说明:都类似于java中的方法,将一组特定功能的逻辑语句包装起来,对外暴露名字
好处:
1、提高了重用性
2、sql语句简单
3、减少了和数据库服务器连接的次数
存储过程
一、创建
create procedure 存储过程名(参数模式 参数名 参数类型)
begin
存储体
end;
注意:
1、参数模式:in、out、inout,其中in可以省略
2、存储过程的每一条sql语句都需要用分号结尾
二、调用
call 存储过程名(实参列表)
举例:
调用in模式的参数:call sp1(’值‘);
调用out模式的参数:set @name; call sp1(@name);select @name;
调用inout模式的参数:set @name=值; call sp1(@name);select @name;
三、查看
show create procedure 存储过程名;
四、删除
drop procedure 【if exists】 存储过程名;
函数
一、创建
create function 参数名(参数名 参数类型) returns 返回类型
begin
函数体
return 返回值;
end;
注意:函数体中肯定需要有return语句
二、调用
select 函数名(实参列表);
三、查看
show create function 函数名;
四、删除
drop function 函数名;
4、流程控制结构
说明:
顺序结构:程序从上往依次执行
分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行
循环结构:程序满足一定条件下,重复执行一组语句
分支结构
特点:
1、if函数
功能:实现简单双分支
语法:
if(条件,值1,值2)
位置:
可以作为表达式放在任何位置
2、case结构
功能:实现多分支
语法:
语法一:
case 表达式或字段
when 值1 then 语句1;
when 值2 then 语句2;
.....
else 语句n;
end[case];
语法二:
case
when 条件1 then 语句1;
when 条件2 then 语句2;
.....
else 语句n;
end[case];
位置:
可以放在任何位置,
如果放在begin end外面,作为表达式结合这其他语句使用
如果放在begin end里面,一般作为独立语句使用
3、if结构
功能:实现多分支
语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
....
else 语句n;
end if;
位置:
只能放在begin end中
4、循环结构
位置:只能放在begin end中
特点:都能实现循环结构
对比:
1、这三种循环都可以省略名称,但如果循环中添加了循环控制语句(leave或iterate)则必须添加名称
2、
loop一般用于实现简单的死循环
while先判断后执行
repeat先执行后判断,无条件至少执行一次
1、while
语法:
【名称:】while 循环条件 do
循环体
end while 【名称】;
2、loop
语法:
【名称:】loop
循环体
end loop 【名称】;
3、repeat
语法:
【名称:】repeat
循环体
until 结束条件
end repeat 【名称】;
循环控制语句
leave类似于break,用于跳出所在的循环
iterate:类似于continue,用于结束本次循环,继续下一次

浙公网安备 33010602011771号