一.数据库
SQL 对大小写不敏感:SELECT 与 select 相同。
1.数据库
数据库存储数据特点
1)存储空间非常大,可以存储百万条,千万条甚至上亿条数据,用户可以对数据库中数据进行新增,查询,更新,删除等操作
2)数据独立性高
3)实现数据共享
4)减少数据的冗余度
5)通过数据库里面"事务"--->实现数据的一致性以及维护性!
2.市面上常见的数据库
数据库分为两大类:
1.关系型数据库:Mysql,SqlServer,Oracle
SqlServer,Oracle:收费
Oracle:中大型公司使用居多
Mysql:免费产品,中小型公司使用居多
2.非关系型数据库:Redis,Memcache,MongoDb,Hbase
3.数据库的三大范式
-
第一范式 1NF
数据库表的每一列式不能再拆分的原子,每一列都是单独的,没有复合列。
-
第二范式 2NF
1. 一张表描述一件事情 2. 非主键字段必须依赖于主键
-
第三范式 3NF
1. 非主键字段间不能产生传递依赖
二.DDL(data definition language)语句的基础语法
DDL语句:数据库定义语句 库和表的基本操作
2.1库的操作
1.查询所有库:show databases;
2.创建库的语法
2.1 create database if not exists 库名; 如果没有这个库则创建该库
2.2 create database 库名;
3.查看指定库的字符集格式
show create database 库名;
4.修改库的字符集
alter database 库名 default(可以省略) character set 字符集格式;
5.删除库
5.1 drop database if exists 库名; 如果有该库则直接删除
5.2 drop database 库名; 直接删除
6.使用库
use 库名;
2.2表的操作
1.创建表的语法
create table 表名(
字段名称1 字段类型1,
字段名称2 字段类型2,
字段名称3 字段类型3,
.....
字段名称n 字段类型n,
);
2.查询表的结构
desc 表名;
3.修改表的字段类型
alter table 表名 modify 字段名称 修改后的字段类型;
4.修改字段名称
alter table 表名 change 以前的字段名称 修改后的字段名称 字段类型;
5.修改表
5.1添加表的字段
alter table 表名 add 字段名称 字段类型;
5.2删除表中某个字段
alter table 表名 drop 字段名称;
5.3修改表名
alter table 表名 rename to 新表名;
rename table 表名 to 新表名;
6.查看表的字符集
show create table 表名;
7.修改表的字符集
alter table 表名 character set 字符集格式;
8.复制表
8.1复制表结构
create table 新表名 like 表名;
8.2复制表的全数据
CREATE TABLE 新表名
AS
SELECT * FROM 表名;
9.删除表
drop table if exists 表名;如果存在删除表
drop table 表名;
三.DML(Data Manipulation Language)语句:数据库操作语句
3.1操作表的记录(插入,修改,删除,查询)
-
插入数据,没插入的值为null
1.插入一行 insert into 表名 values(值1,值2...); 2.插入多行 inser into 表名 values(值1,值2...),values(值1,值2...)..; 3.插入一行部分字段 insert into 表名(字段名称1,字段名称2.,等部分字段)values(值1,值2,值3...); 4.插入多行多条数据,部分字段 insert into 表名(字段名称1,字段名称2.,等部分字段)values(值1,值2,值3...),(值1,值2,值3...),(...);
-
修改数据
1.一次修改一个数据 updata 表名 set 字段名称= 值 where 字段名称= 值;(根据where查询) 2.一次修改多个数据 updata 表名 set 字段名称= 值1,字段名称= 值2,.. where 字段名称= 值;
-
删除表的记录
1.带条件删除 delete from 表名 where 字段名称 = 值; delete from 表名 where 字段名称1 = 值1 and 字段名称1 = 值1 ...; 2.删除全表数据 只删除数据:delete from 表名; 删除数据和表结构:truncate table 表名;
-
表的查询
1.查询全表: 使用 select * from 表名; 查询指定字段并给别名:select ID '编号',name '姓名' from 表名; 查询指定字段去重:select distinct 字段 from 表名; 2.带条件查询 2.1where 比较运算符 <=,>=,<,>,!=(在mysql使用 <>) and && /or || between 值1 and 值2 2.2where 模糊条件 like关键字 语句格式:select 字段列表 from 表名 where 字段名称 like '%xx%'; %:表示任意字符 _:表示一字符 2.3排序查询 order by,升序是asc,降序是desc 单独使用语法:select 字段列表 from 表名 order by 字段名称 排序规则; 与where语句使用时先满足where条件,在排序 语法:select 字段列表 from 表名 where 条件 order by 字段名称 排序规 则,字段名称2 排序规则2; 2.4聚合函数查询 结果是单行单列,可以sql语句嵌套 count():统计表的数据,如果字段为空不会统计 语法:select count(字段名称) from 表名; max(列名称):最大值 语法:select max(列名称) from 表名; min(列名称):最小值 语句:select min(列名称) from 表名; avg(列名称):平均值 语句:select avg(列名称) from 表名; sum(列名称);求和 语句:select sum(列名称) from 表名; 2.5分组查询:group by 语句:select 字段列表 from 表名 group by 分组的字段名称; 注意:分组查询里面可以select 查询分组字段 分组group by后面不能使用聚合函数 where条件和group by,where条件在group by前面;先满足where条件在 参与分组 2.6筛选查询:having having后面可以跟聚合函数,having在group by后面,where在group by前面 2.7分页查询:limit where在limit前面 方式一;select 字段列表 from 表名 limit 起始行数,每页显示的条数; 方式二:select 字段列表 from 表名 limit 值; 复合查询:有where条件,还有limit,where在limit前面 起始行数= (当前页码数-1)*每页显示的条数;
四.正则表达式的使用
-
通配符
\w 匹配任何单词字符,包括下划线,等效于[a-zA-z0-9_] \d 匹配数字字符 . 匹配任意单个字符,但换行符除外 ? 零次或一次匹配前面的字符 + 一次或多次匹配前面的字符 ^ 匹配字符串的开始位置 $ 匹配字符串的结束位置 \b 匹配一个单词边界,在匹配单词时使用 \B 非单词边界匹配,在匹配单词内部字符时使用 \r 匹配一个回车符。等价于 \x0d 和 \cM。 \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S 匹配任何非空白字符。等价于 \f\n\r\t\v。 -
示例
1.使用正则表达式 select * from users where id regexp '1+'; SELECT * FROM student WHERE `name` REGEXP '[张\S\S]+'; 2.使用%,可表示以某字符开始,结束,或包含某字符 select * from users where name like '李%'; select * from users where name like '%李'; select * from users where name like '%李%'; 3.使用_可以替换任意字符 select * from users where name like '李_';
五.mysql数据类型
1. int,int(int类型的字符数)
int:默认11位,
int(int类型的字符数):int(3): 1---->001
2. varchar(字符长度):字符串类型
姓名 varchar(20)---->最大取到20
在mysql中字符串写的时候可以使用双引号也可以是单引号
3. date:日期类型--->仅仅表示日期 如'2022-2-23'
4. datetime:日期+时间
5. timestap:时间戳-->当前插入数据或者修改/删除数据的即时时间
6. double:小数类型
double(3,2): 小数是3位数,小数点后保留2位
7. clob:大字符类型,某个表中某个字段--->使用clob来存储大文本
8. blob:大字节类型:存储大图片文件---大字节类型
六.约束
约束:约束用户操作数据库的一种行为
not null | 指示某列不能存储 NULL 值。 |
---|---|
unique | 保证某列的每行必须有唯一的值。 |
primary key /not null /unique | 设置主键 |
foreign key | 设置外键 |
check | 保证列中的值符合指定的条件 |
default | 规定没有给列赋值时的默认值 |
-
check示例
create table persons ( p_id int not null, check (p_id>0) )
5.1默认约束 default
1. 特点:当没有插入这个字段,默认约束起作用
2. 添加默认约束
创建表时:字段名称 字段类型 default '默认'
添加默认约束:alter table 表名 modify 字段名称 字段类型 default '默认';
3. 删除默认约束:修改字段的类型
alter table 表名 modify 字段名称 修改后的字段类型;
5.2非空约束 not null
1. 特点:当前这个值不能为null,不能直接添加数据给一个null
2. 添加非空约束:
创建表的时候在指定字段后面加入not null
sql语句:alter table 表名 modify 字段名称 字段类型 not null;
3. 删除空约束:修改字段的类型
alter table 表名 modify 字段名称 修改后的字段类型;
5.3唯一约束 unique
1. 特点:当前值不能为空
2. 添加唯一约束:constraint(声明)
创建表的时候在指定字段后面加入 unique
sql语句:alter table 表名 add constraint 唯一约束索引名称 unique(列名);
3. 删除:
alter table 表名 drop index 索引名(没给就是默认列的名称)
5.4主键约束 primary key
1. 特点:非空且唯一
2. 添加:
创建表的时候在指定字段后面加入 primary key
sql语句:alter table 表名 add primary key(列名称);
3. 删除:
alter table 表名 drop primary key;
5.5自增长约束 auto_increment
注意:自增只与插入的记录的条数有关,修改后的值不会自增.
1. 特点:一般自增长约束都是在主键字段上,保证唯一
指定插入数据的值,下次在之前的值上继续自增1.
2.查找数据库表中最后一次自增主键的值(mysql自带函数)
select last_insert_id();
3.添加:
创建表时添加:字段名后加入auto_increment
5.6外键约束 foreign key
1. 特点:外键作用的表是从表,另一张表是主表.
2. 添加:
2.1创建表时添加:
constraint -- 声明
外键名 --起名 主表名_从表名_fk
foreign key(从表的字段名称)
references -- 关联
主表名(主键字段的名称)
2.2sql语句添加:
alter table 表名 add constraint 外键名 foreign key(从表的字段名称)
references 主表名(主键字段名称);
3.删除:
有外键时直接修改或者删除主表数据,前提需要让从表的数据跟主表没有关联,才可以删除该表
sql删除:
alter table 表名 drop foreign key 外键名
5.7级联操作 cascade
1. 特点:当修改/删除主表的数据,从表数据随之改动
级联删除/级联修改 on delete cascade /on update cascade
2. 添加:
2.1创建表时添加:
constraint -- 声明
外键名 -- 起名 主表名_从表名_fk
foreign key(从表的字段名称)
references -- 关联
主表名(主键字段的名称)
on update cascade
on delete cascade
2.2sql语句添加:
alter table 表名 add constraint 外键名 foreign key(从表的字段名称)
references 主表名(主键字段名称) on update cascade on delete cascade;
七.多表查询
-
内连接
-
隐式内连接:用where条件连接
select 字段列表 from 表1,表2... where 连接条件;
-
显示内连接:inner join
select 字段列表 from 表名1 (inner) join -- inner可以省略 表名2 on 连接条件;
-
-
外连接
-
左外连接:查询左表全部数据+两表的交集信息
select 字段列表 from 左表名 left (outer) join -- outer可以不写 表名2 on 连接条件;
-
右外连接:查询右表全部数据+两表的交集信息
select 字段列表 from 右表名 right (outer) join -- outer可以不写 表名2 on 连接条件;
-
八.事务
-
概念
在一个业务中执行多个SQL,这多个SQL,要么同时执行成功,要么同时执行失败。
-
使用
1. 开启 start transaction; 2. 执行业务操作(增删改) 3. 如果出现问题,回滚 rollback; 4. 提交事务(如果不提交,数据知识临时改变,无法永久更新) commit;
-
事务的隔离级别
- 查看隔离级别
1. mysql5 select @@tx_isolation; 2. mysql8 select trasaction_isolation;
-
设置隔离级别
set global transaction isolation level 隔离级别;
1. read uncommitted 读未提交 会出现脏读 脏读:是事务管理最严重的的问题:一个事务读取到另一个没有提交的事务 2. read committed 读已提交 有效防止脏读,出现新的问题:不可重复读 事务(当前这个事务提交)多次读取另一个提交事务的前后的数据不一样 3. repeatable read 可重复读 (mysql默认级别) 4. serializable 串行化 一个事务读取到另一个一个没提交的事务,数据是查不到的 四个级别 安全性:从低到高 效率性:从高到低
-
事务的特点:ACID
原子性,一致性,隔离性,持久性
- 原子性(Atomicity):在使用事务管理的时候,执行多个SQL,要么同时成功,要么同时失败
- 一致性(Consistency):高并发的时候,需要保证事务多次读写的数据一致性
- 隔离性(Isolation):事务和事务间是独立的,相互不影响
- 持久性(Durability):事务一旦提交,对数据的影响是持久性的