MYSQL
1.运维:主从复制、分库分表、读写分离
2.SQL 函数 约束 多表查询 事务
概念:数据库 database db 按照一定的数据结构来组织、存储和管理数据的仓库。
数据库管理系统 DBMS 一种操纵和管理数据库的大型软件。
关系型数据库 (RDBMS) 是建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
表结构存储 格式统一 使用SQL语句操纵 存储于磁盘。
非关系型数据库(NoSQL)是对关系型数据库的补充,(不是基于表存储)
SQL:结构化查询语言
通用语法:分号结尾、不区分大小写、注释:--或者#(单行);/*1234*/(多行)
SQL分类:DDL:数据定义语言 定义数据库对象(数据库、表、字段)。
DML:数据操作语言 对数据库表中的数据进行增删减。
DQL:数据查询语言 查询数据库中的记录。
DCL:数据控制语言 创建数据库用户、控制数据库的访问权限。
DDL-数据库操作
查询所有数据库 show database;
查询当前数据库 select database();
创建 create database[if not exists] 数据库名[default charset 字符集](指定当前数据库的字符集,可省略,数据库有默认的字符集)[collate 排序规则];
方括号中均为可选择填写
删除 drop database[if exists]数据库名;
使用 use 数据库名;
DDL-表操作-查询
查询当前数据库所有表 show tables;
查询表结构 desc 表名;(可查看表中的数据类型)
查询指定表的建表语句 show create table 表名;
DDL-表操作-创建
create table 表名(
字段1 字段1类型[comment 字段1注释],
字段2 字段2类型[comment 字段2注释],
.....
字段n 字段n类型[comment 字段n注释]
)[comment 表注释];
最后一个字段后面没有逗号
字符串 varchar
show tables;(展示表格)
show create table 表名;(展示创建表信息 存储引擎 默认字符集 排序规则 )
DDL-表操作-数据类型
数据类型主要分为三类:数值类型、字符串类型、日期时间类型
数值类型:
tinyint 1byte 小整数值
smallint 2 大整数值
mediumint 3 大整数值
int或者integer 4 大整数值
bigint 8 极大整数值
float 4 单精度浮点数值
double 8 双精度浮点数值(长度,小数位数)
decimal 小数值(精确定点数)
字符串类型:
char 定长字符串 char(存储的字符最大长度) 未占用的字符会用空格补位 性能较好
varchar 变长字符串 根据存储的内容计算所占空间 性能较差
tinyblob 不超过255个字符的二进制数据
tinytext 短文本字符串
blob 二进制形式的长文本数据
text 长文本数据
mediumblob 二进制形式的中等长度文本数据
mediumtext 中等长度文本数据
longblob 二进制形式的极大文本数据
longtext 极大文本数据
(blob二进制数据【用的少】;text文本数据)
用户名 usename varchar(50)用户名输入是变化的
性别 gender char(1)
日期时间类型
data 日期值 birthday
time 时间值或持续时间
year 年份值
datatime 混合日期和时间值
timestamp 混合日期和时间值,时间戳
案例:设计员工信息表,要求如:
1.编号 2.员工工号(字符串类型,长度不超过10位)3.员工姓名(字符串类型,长度不超过10位)
4.性别(男/女,存储一个汉字)5.年龄(正常人年龄,不可能存储负数)
6.身份证号码(二代身份证号码均为18位,身份证中有X这样的字符)
7.入职时间(取年月日即可)
create table emp(
id int,
worknumber vachar(10),
name varchar(10),
gender char(1),
age tinyint unsigned,
idcard char(18),
entrydata data
)comment '员工信息表';
DDL-表操作-修改
添加/删除/修改字段,修改表名
添加字段 alter table 表名 add 字段名 类型(长度)[comment 注释][约束];
alter table emp add nickname varchar(20) comment '插入昵称字段';
修改数据类型(字段类型)
alter table 表名 modify 字段名 新数据类型(长度);
修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度)[comment 注释][约束];
alter table emp change nickname uesrname varchar(30) comment '修改昵称为用户名';
修改表名 alter table 表名 rename to 新表名;
alter table emp rename to employee;
DDL-表操作-删除
删除字段 alter table 表名 drop 字段名;
alter table emp drop username;
删除表 drop table[if exists] 表名;
删除指定表,并且重新创建该表 truncate table 表名;
SQL
MYSQL图形化界面
工具:datagirp
DML 对表中的数据记录进行增删改操作
insert updata delete
DML-添加数据
给指定字段添加数据
insert into 表名(字段名1,字段名2,...)values(值1,值2,...);
给全部字段添加数据
insert into 表名 values(值1,值2,...);
批量添加数据
insert into 表名(字段名1,字段名2,...)values(值1,值2,...),(值1,值2,...),(值1,值2,...);
insert into 表名 values(值1,值2,...),(值1,值2,...),(值1,值2,...);
注:插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
字符串和日期型数据应该包含在引号中。
插入的数据大小,应该在字段的规定范围内。
DML-修改数据
update 表名 set 字段名1=值1,字段名2=值2,...[where 条件];
修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
update employee set name='itheima' where id=1;修改id为1的数据,将name修改为itheima。
update employee set name='小昭',gender='女' where di=1;修改id为1的数据,将name修改为小昭,gender修改为女。
DDL-删除数据
delete from 表名[where 条件];
注: delete 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
delete语句不能删除某一个字段的值(可以使用update)。
delete from employee where gender='女';删除gender为女的员工。
delete from employee;删除所有员工。
DQL 数据查询语言,用来查询数据库中表的记录。
select 字段列表
from 表名列表
where 条件列表
group by 分组字段列表
having 分组后条件列表
order by 排序字段列表
limit 分页参数
基本查询
条件查询(where)
聚合函数(count\max\min\avg\sum)
分组查询(group by)
排序查询(order by)
分页查询(limit)
DQL-基本查询
1.查询多个字段
select 字段1,字段2,字段3...from 表名;(查询指定字段)
select*from 表名;(查询所有字段,尽量将所有字段写明)
2.设置别名
select 字段1[as 别名1],字段2[as 别名2]...from 表名;(as可以省略)
3.去除重复记录
select distinct 字段列表 from 表名;
DQL-条件查询
1.语法:select 字段列表 from 表名 where 条件列表;
2.条件:
① 查询年龄等于88的员工 select * from emp where age=88;
② 查询年龄小于20的员工 select * from emp where age<20;
③ 查询没有身份证号的员工 select * from emp where idcrad is NULL;
④ 查询有身份证号的员工 select * from emp where idcrad is not NULL;
⑤ 查询年龄不等于88的员工 select * from emp where age!=88;
⑥ 查询年龄在15岁(包含15岁)到20岁(包含)之间的员工信息 select * from emp where age>=15 && age<=20;
select * from emp where age between 15(最小值) and 20(最大值);
⑦ 查询性别为女并且年龄小于25岁的员工 select * from emp where gender=’女’ and age < 25;
⑧ 查询年龄等于18或20或40的员工 select * from emp where age=18 or age=20 or age=40;/age in(18,20,40);
⑨ 查询姓名为两个字的员工信息 select * from emp where name like ‘__’;
⑩ 查询身份证号码最后一位是X的员工信息 select * from emp where idcard like ‘%X’;(下划线代表一个字符,可替换17个下划线)
DQL-聚合函数
将一列数据作为一个整体,进行纵向计算。
(count统计数量\max最大值\min最小值\avg平均值\sum求和)
Select 聚合函数(字段列表)from 表名;
注:null值不参与所有聚合函数运算。
DDL-分组查询
1.语法:select 字段列表 from 表名 [where 条件] group by 分组字段名[having 分组后过滤条件];
2.where\having的区别:
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以。
Select gender,count(*) from emp group by gender;根据性别分组,统计男性员工和女性员工的数量。
Select gender,avg(age) from emp group by gender;根据性别分组,统计男性员工和女性员工的平均年龄。
Select count(*) from emp where age < 45 group by workaddress having count(*) >= 3;查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于3的工作地址。
注:执行顺序:where>聚合函数>having
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
DDL-排序查询
- 语法: select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2;
- 排序方式:ASC:升序(默认值)
DESC:降序
注:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
Select * from emp order by age asc;根据年龄对公司的员工进行升序排序。(asc可省略)
Select * from emp order by entrydata desc;根据入职时间对员工进行降序排序。
Select * from emp order by age asc,entrydata desc;根据年龄对公司员工进行升序排序,年龄相同再按照入职时间进行降序排序。
DDL-分页查询
Limit
- 语法:select 字段列表 from 表名 limit 起始索引,查询记录数;
注:起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
分页查询是数据库的方言,不同的数据库有不同的实现,mysql中是limit。
如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。
Select * from emp limit 0,10;查询第一页员工数据,每页展示10条记录。
Select * from emp limit 10,10;查询第二页员工数据,每页展示10条记录。
DQL案例:
- 查询年龄为20、21、22、23岁的员工信息。
- 查询性别为男,并且年龄在20—40岁(含)的以内的姓名为三个字的员工
- 统计员工表中,年龄小于60岁的,男性员工和女性员工的人数
- 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按照年龄升序排序,如果年龄相同按照入职时间降序排序。
- 查询性别为男,且年龄在20-40岁(含)以内的前五个员工信息,对查询的结果按照年龄升序排序,年龄相同按入职时间升序排序。
Select * from emp where gender =’女’age in (20,21,22,23);
Select * from emp where gender =’男’&& (age between 20 and 40 )&& name like ‘___’;
Select gender, count(*) from emp where age < 60 group by gender;
Select name, age from emp where age <= 35 order by age asc,entrydata desc;
Select * from emp where gender =’男’and (age between 20 and 40) order by age asc,entrydata asc limit 5;
(order by不能放在limit后面运行)
DQL-执行顺序
编写顺序
执行顺序:from——where——group by——select——order by——limit
DCL-管理数据库用户、控制数据库的访问权限
DCL-管理用户
- 查询用户
Use mysql;
Select * from user;
- 创建用户
Create user ‘用户名’@‘主机名’identified by‘密码’;
- 修改用户密码
Alter user ‘用户名’@ ‘主机名’identified with mysql_native_password by ‘新密码’;
- 删除用户
Drop user‘用户名’@‘主机名’;
注:主机名可以使用%通配。这类SQL开发人员操作的比较少,主要是DBA(数据管理员)使用。
2022.9.15 MYSQL二阶段学习
DCL-权限控制
常用权限
All、all privileges 所有权限
Select 查询数据
Insert 插入数据
Update 修改数据
Delete 删除数据
Alter 修改表
Drop 删除数据库/表/视图
Create 创建数据库/表
- 查询权限 show grants for ‘用户名’@ ‘主机名’;usage仅仅是登录查看权限
- 授予权限 grant 权限列表 on 数据库名.表名 to ‘用户名’@ ‘主机名’;给用户授予某个数据库的数据表的权限
- 撤销权限 revoke 权限列表 on 数据库.表名 from ‘用户名’@ ‘主机名’;撤销用户某个数据库的数据表的权限
注意:多个权限之间,使用逗号分隔
授权时,数据库名和表名可以使用*进行通配,代表所有。*.*所有数据库的所有数据表权限
函数
是指一段可以直接被另一段程序调用的程序或者代码。
字符串函数、数值函数、日期函数、流程函数
1.字符串函数
常用字符串
Concat(s1,s2,…,sn) 字符串拼接,将s1,s2,…,sn拼接成一个字符串
Lower(str) 将字符串str全部转为小写
Upper(str) 将字符串str全部转为大写
Lpad(str,n,pad) 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
Rpad(str,n,pad) 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
Trim(str) 去掉字符串头部和尾部的空格
Substring(str,start,len) 返回从字符串str从start位置起的len个长度的字符串(截取字符串)索引值从1开始
Select 函数(参数)
案例:由于业务需求变更,企业员工的工号,统一为五位数,目前不足5位数的全部在前面补0。比如1号员工的工号应该为00001。
Update emp set worknumber = lpad(worknumber,5,0);
- 数值函数
常见数值函数
Ceil(x) 向上取整
Floor(x) 向下取整
Mod(x,y) 返回x/y的模 x/y取余
Rand() 返回0-1内的随机数 (random)
Round(x,y) 求参数x的四舍五入的值,保留y位小数
Select 函数(参数)
案例:通过数据库的函数,生成一个六位数的随机验证码
Select lpad(round(rand()*1000000,0),6,0);
- 日期函数
常见日期函数
curdate() 返回当前日期 currant当前
curtime() 返回当前时间
now() 返回当前日期和时间
year(date) 获取指定date的年份
month(date) 获取指定date的月份
day(date) 获取指定date的日期
date_add(date,interval expr type) 返回一个日期/时间值加上一个时间间隔expr后的时间值
datediff(date1,date2) 返回起始时间date1和结束时间date2之间的天数 取值日期之间天数 date1-date2
Select 函数(参数)
案例:查询所有员工的入职天数,并根据入职天数倒序排序。
Select name,datediff(curdate(),entrydate()) as entrydays from emp order by enrtydays desc;
- 流程控制函数 可以在SQL语句中实现条件筛选,从而提高语句的效率。
常见函数
If(value,t,f) 如果value为true,则返回t,否则返回f
Ifnull(value1,value2) 如果value不为null,返回value1,否则返回value2
ifnull(value1,value2) 判断如果value1 不是null;返回value1;如果value1 为null;返回value2;
Case when [val1] then [res1] … else [default] end 如果val1为true,返回res1,…否则返回default默认值
Case [expr] when [val1] then [res1] … else [default] end
如果expr的值等于val1,返回res1,…否则返回default默认值
Case when then else end
需求:查询emp表的员工姓名和工作地址(北京/上海——一线城市,其他——二线城市)
Select
name,(case workaddress when ‘北京’then ‘一线城市’when ‘上海’then ‘一线城市’ else ‘二线城市’end)
as ‘工作地址’
from emp
Select 函数(参数)
案例:统计班级各个学员的成绩,展示规则如下: >=85,展示优秀;>=60,展示及格,否则展示不及格
Select
Id,
Name,
(Case when math >=85 then ‘优秀’when math >=60 then ‘及格’else ‘不及格’end)‘数学’,
(Case when english >=85 then ‘优秀’when english >=60 then ‘及格’else ‘不及格’end)‘英语’,
(Case when chinese >=85 then ‘优秀’when chinese >=60 then ‘及格’else ‘不及格’end)‘语文’
From score
约束。
是作用于表中字段上的规则,用于限制存储在表中的数据。保证数据库中的数据的正确、有效和完整。
分类:
非空约束 限制该字段的数据不能为null not null
唯一约束 保证该字段的所有数据都是唯一、不重复的 unique
主键约束 主键是一行数据的唯一标识 primary key
默认约束 保存数据时,如果未指定该字段的值,则采用默认值 default
检查约束 保证字段值满足某一个条件(版本8.0.16之后支持) check (类似于条件)
外键约束 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 foreign key
注:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束
约束演示:
案例:根据需求,完成表结构的创建
多个约束之间空格分开即可
Create table user(
Id int primary key auto_increment comment ‘主键’,
Name varchar(10) not null unique comment ‘姓名’,
Age int check(age>0 and age<=120) comment ‘年龄’,
Status char(1) default ‘1’ comment ‘状态’,
Gender char comment ‘性别’,
)comment ‘用户表’
/表结构创建/
/插入数据/(主键不用指定,数据库自动维护,数据自动增长)
Insert into user (name,age,status,gender) values (‘tom’,20,‘1’,‘男’)
外键约束
概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
具有外键的数据表-子表,外键所关联的数据表-父表 (主从表)
注:目前子表、父表在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性。
先后建立父子表,插入数据后,只存在逻辑关系,需要设置外键约束(单独表数据删除后,数据会不完整)
外键约束语法:
- 添加外键
Create table 表名(
字段名 数据类型,
…
[constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名)
);
Alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表 (主表列名);
外键关联之后主表中数据不可随便删除
2.删除外键
Alter table 表名 drop foreign key 外键名称;
外键删除/更新行为
No action 在外键约束中是默认行为
Alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表 (主表字段名) on update cascade on delete cascade;
Alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表 (主表字段名) on update set null on delete set null;
多表查询
多表关系、多表查询概述、内连接、外连接、自连接、子查询、多表查询案例
多表关系
概述:项目开发中,在进行数据库表结构设计时,会根据业务需求以及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:1.一对多/多对一 2.多对多 3.一对一
1.一对多/多对一
案例:部门与员工的关系
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的一方建立外键,指向一的一方的主键
- 多对多
案例:学生与课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
- 一对一
案例:用户与用户详情的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(unique)
多表查询概述
概述:指从多张表中查询数据
笛卡尔积:笛卡尔乘积是指在数学中,两个集合a集合和b集合的所有组合情况(多表查询时,需要消除无效的笛卡尔积)
利用条件语句消除多余的笛卡尔积
多表查询分类
连接查询 内连接:相当于查询A、B交集部分数据
外连接:左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
自连接:当前表与自身的连接查询,自连接必须使用表别名
子查询
内连接查询(两张表交集的部分)语句:
隐式内连接:select 字段列表from 表1,表2 where 条件…;
显式内连接:select 字段列表 from 表1 [inner] join 表2 on 连接条件…;
外连接
左外连接:select 字段列表 from 表1 left [outer] join 表2 on 条件…;
(查询结果包含表1数据以及表1和表2的交集数据)
右外连接:select 字段列表 from 表1 right [outer] join 表2 on 条件…;
(查询结果包含表2数据以及表1和表2的交集数据)
自连接:select 字段列表 from 表A join 表A 别名B ON 条件…;
自连接查询,可以是内连接查询,也可以是外连接查询
联合查询 union (可去除重复项数据);union all
Select 字段列表 from 表A…
Union [all]
Select 字段列表 from 表B…;
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
Union all 会将全部的数据直接合并在一起,union会对合并后的数据去重
子查询
SQL语句中嵌套select语句,称为嵌套查询,又称子查询
Select * from t1 where column1 = (select column1 from t2)
子查询外部的语句可以是insert/update/delete/select的任何一个
根据子查询结果不同,分为:
标量子查询(子查询结果为单个值)、列子查询(子查询结果为一列)、
行子查询(子查询结果为一行)、表子查询(子查询结果为多行多列)
根据子查询的位置,分为where之后、from之后、select之后
标量子查询:返回的结果是单个值(数字、字符串、日期等),最简单的形式。
最常用的操作符号:= <> > >= < <=
列子查询:子查询返回的结果是一列(可以是多行)
常用的操作符号:in、not in、any、some、all
行子查询:返回的结果是一行(可以是多列)
常见的操作符号:=、<> 、in 、not in
表子查询:返回的结果是多行多列
常见操作符:in
事务
是一组操作的集合,是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或者撤销操作请求,即操作要么同时成功,要么同时失败。
自动提交1 手动提交0
补充:Delete不能和join(只读)使用
需要指定删除的表
DELETE pr
FROM pay_recepit pr
WHERE pr.create_time >'2020-01-08 11:00:00'
AND EXISTS
(SELECT 1
FROM fbank_account_notify fan
WHERE fan.trade_no = pr.trade_no
AND fan.is_ent_deposit = 'Y') ;
DATE_FORMAT(date,format) 函数
参数解析:
1、date:代表具体时间字段,也可以为now()查询当前时间;
2、format:DATE_FORMAT将传来的Date类型数据转为自己需要的格式,如%Y-%m-%d %H:%i:%s会将传来的Time数据转为"yyyy-MM-dd HH:mm:ss"格式
加上LIMIT 1,只要找到了对应的一条记录,就不会继续向下扫描了,效率会大大提高。
LIMIT 1适用于查询结果为1条(也可能为0)会导致全表扫描的的SQL语句。
关键词 DISTINCT 用于返回唯一不同的值。
SELECT DISTINCT 列名称 FROM 表名称
GROUP_CONCAT(xxx):是将分组中括号里对应的字符串进行连接.如果分组中括号里的参数xxx有多行,那么就会将这多行的字符串连接,每个字符串之间会有特定的符号进行分隔。
GROUP_CONCAT([DISTINCT] 要连接的字段 [ORDER BY ASC/DESC 排序字段] [SEPARATOR '分隔符'])
这个函数的返回值的长度默认限制为1024,所以如果期望得到结果的长度大于1024,就会被截断。
该函数返回带有来自一个组的连接的非NULL值的字符串结果
浙公网安备 33010602011771号