1.什么是关系型数据库呢?
RDBMS 是一种结构化数据存储系统,使用表格间的关系来存储和操作数据。
在关系型数据库中,数据以行和列的形式存储,其中每一行表示一个关系或实体,每一列表示该实体的某个属性或特征
关系型数据库具有以下特点:
(1)数据存储在表中:数据以行和列的形式存储在表格中
(2)数据间的关系:不同表格中的数据可以通过关系进行连接,实现数据的联合查询和分析
(3)数据完整性:在关系型数据库中,可以定义各种限制条件和检查规则,以确保数据的完整性和一致性
(4)SQL 语言:结构化查询语言SQL 用于访问和操作关系型数据库
点击此处即可领取282G网络安全学习资源
2.SQL 的分类:
(1)DDL(Data Defination Language): 数据定义语言,用于定义数据库对象(库、表、字段)
(2)DML(Data Manipulation Language): 数据操作语言,增删改
(3)DQL(Data Query Language): 数据查询语言,查
(4)DCL(Data Control Language):数据控制语言,访问权限
3.MySQL 的数据类型:
(1)数值类型
tinyint、smallint、mediumint、int/integer、bigint、float、double、decimal 【1234848】
(2)字符串类型
char 定长字符串、varchar 变长字符串、tinyblob 不超过255二进制数据、tinytext 短文本字符串、blob 二进制长文本数据、text 长文本数据、mediumblob 二进制中等长度文本数据、mediumtext 中等长度文本数据、longblob 二进制极大文本数据、longtext 极大文本数据
(3)日期时间类型
基础操作
4、DDL 数据定义语言
– 查看所有数据库
show databases;
#查看当前数据库
select database();
/*
创建数据库:
数据库不存在时创建,避免报错
指定字符编码
/
create database if not exists itcast charset utf8mb4;
– 删除数据库
drop database if exists itcast;
– 切换数据库
use zwh;
– 查看数据库中所有表
show tables;
– 查看表结构
desc tb_user;
– 查看建表语句
show create table tb_user;
– 创建一张表
create table tb_user (
id int comment ‘编号’,
name varchar(50) comment ‘姓名’,
age int comment ‘年龄’,
gender varchar(1) comment ‘性别’
) comment ‘用户表’;
desc tb_user;
show create table tb_user;
/
设计一张员工信息表,要求如下:
- 编号(纯数字)
- 员工工号 (字符串类型,长度不超过10位)
- 员工姓名(字符串类型,长度不超过10位)
- 性别(男/女,存储一个汉字)
- 年龄(正常人年龄,不可能存储负数)
- 身份证号(二代身份证号均为18位,身份证中有X这样的字符)
- 入职时间(取值年月日即可)
*/
create table employee(
id int comment ‘编号’,
employ_id varchar(10) comment ‘员工工号’,
name varchar(10) comment ‘员工姓名’,
gender char(1) comment ‘性别’,
age tinyint unsigned comment ‘年龄’,
card_id char(18) comment ‘身份证号’,
time date comment ‘入职时间’
)
drop table employee;
#3.修改表相关操作
– 添加字段
alter table employee add nicename varchar(20) comment ‘昵称’;
desc employee;
– 修改字段
alter table employee change nicename username varchar(30) comment ‘昵称’;
– 删除字段
alter table employee drop username;
desc employee
– 修改表名
alter table employee rename to emp;
show databases;
show tables;
– 删除表
drop table if exists tb_user;
– 删除指定表,并重新创建表
truncate table emp;
desc emp;
5.DML 数据操作语言
– 添加数据 [要想省略 (字段1, 字段2, …) 部分,要保证值的个数与顺序与表中相对应]
insert into 表名(字段1, 字段2, …) values (值1, 值2, …)
insert into 表名 values (值1, 值2, …)
insert into 表名 values (值1, 值2, …), (值1, 值2, …), …
– 修改数据
update 表名 set 字段名1 = 值1, 字段名2 = 值2, … [where 条件]
– 删除数据
delete from 表名 [where 条件]
6.DQL 数据查询语言
1.select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表
2.having 分组后条件列表 order by 排序字段列表 limit 分页参数
基础查询:
– 查询指定的字段
select 字段1, 字段2, … from 表名;
– 查询全部字段
select * from 表名;
– 查询结果字段设置别名
select 字段1 as 别名1, 字段2 as 别名2, … from 表名;
select 字段1 别名1, 字段2 别名2, … from 表名;
– 查询结果去重
select distinct 字段列表 from 表名;
条件查询:
select 字段列表 from 表名 where 条件列表
! 和 <> 都代表不等于,like 模糊匹配 _ 匹配单个字符, % 匹配任意个字符
聚合函数:
count 统计数量、max 最大值、min 最小值、平均值 avg、sum 求和
-- null 值不参与聚合函数运算
select 聚合函数(字段列表) from 表名;
分组查询:
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 过滤后的条件]
where 和 having 的执行时机不同,where > 聚合函数 > having,也就是说只有满足 where 条件的才会分组
排序查询:
select 查询列表 from 表名 order by ASC | DESC;
ASC 代表升序查询,DESC 代表降序查询,默认为升序,支持按多字段排序查询
分页查询:
select 字段列表 from 表名 limit 起始索引, 查询记录数
起始索引从零开始 = (查询页码 - 1 ) * 每页显示记录数
执行顺序:from > where > group by> having > select > order by > limit
7.DCL: 数据控制语言
-- 查询用户
select * from mysql.user;
-- 创建用户
create user '用户名'@'主机名' identified by '密码';
-- 修改用户密码
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
-- 删除用户
drop user '用户名'@'主机名';
主机名可以使用 % 通配,MySQL 中通过用户名@主机名标识一个用户
-- 查询用户权限
show grants for '用户名'@'主机名';
-- 授予用户所有权限
grant all on itcast.* to '用户名'@'主机名';
-- 撤销用户所有权限
revoke all on itcast.* from '用户名'@'主机名';
函数
1.字符串函数:
-- 字符串拼接
concat(s1, s2, ...)
-- 字符串转小写
lower(str)
-- 字符串转大写
upper(str)
-- 左填充,用 pad 字符串对 str 左边进行填充,达到 n 个字符串长度 [使拼接后的字符串长度为n]
lpad(str, n, pad)
-- 右填充,用 pad 字符串对 str 右边进行填充,达到 n 个字符串长度
rpad(str, n, pad)
-- 去掉字符串头部和尾部的空格
trim(str)
-- 返回从字符串 str 从 start 位置开始的 len 长度的子字符串
substring(str, start, len)
2.数值函数:
-- 向上取整
cell(x)
-- 向下取整
floor(x)
-- 取模
mod(x, y)
-- 0-1随机数
rand()
-- 四舍五入,保留 y 位小数
round(x, y)
3.日期函数:
-- 返回当前日期
curdate();
-- 返回当前时间
curtime();
-- 返回当前日期和时间
now();
-- 获取 date 的年份
year(date)
-- 获取 date 的月份
month(date)
-- 获取 date 的日期
day(date)
-- 返回一个加上时间间隔 expr 后的时间
date_add(date, interval exprtype)
-- 返回两个时间之间间隔的天数 [date1 - date2]
datediff(date1, date2)
4.流程函数:
-- 如果 value 为 true,则返回 t,否则返回 f
if(value, t, f)
-- 如果 value1 不为空,返回 value1 否则返回 value2
ifnull(value1, value2)
-- 如果 val1 为 true,返回 res1 否则返回 default
case when val1 then res1 else default end
-- 如果 expr 的值等于 val1,返回 res1,否则返回 default 默认值
case expr when val1 then res1 else default end
约束
保证数据库中的数据的正确、有效和完整
在建表时只需要在对应字段后添加对应约束的关键字即可
外键约束:
-- 添加外键(创建表时)
[constraint] [外键名称] foreign key (外键字段名) references 主表(主表列名)
-- 添加外键(修改表时)
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表 (主表列名)
-- 删除外键
alter table 表名 drop foreign key 外键名称;
添加外键后,再删除或更新父表数据时会产生约束行为
在我们为表添加外键时,就可以设置删除和更新策略
alter table 表名 add constraint 外键名称 foreign key (外键字段) references 主表名 (主表字段名) on update cascade on delete delete cascade;
多表查询
- 连接查询:[以两张表为例]
内连接:两表交集
左外连接:左表所有数据和两表交集
有外连接:右表所有数据和两表交集
自连接:当前表与自身连接的查询,自连接必须使用表
#可以为表设置别名,别名关键字 as 可以省略
-- 隐式内连接
select 字段列表 from 表1, 表2, ... where 条件列表;
-- 显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件 ...;
-- 左外连接
select 字段列表 from 表1 left outer join 表2 on 条件列表;
-- 右外连接
select 字段列表 from 表1 right outer join 表2 on 条件列表;
-- 自连接
select 字段列表 from 表A 别名A join 表A 别名B on 条件列表;
-- 联合查询 union 会去重,union all 不会,合并查询结果
select 字段列表 from 表A ...
union [all]
select 字段列表 from 表B ...
- 子查询:
按照子查询结果划分:
标量子查询:子查询结果为单个值
列子查询:子查询结果为一列
行子查询:子查询结果为一行
列表子查询:子查询结果为多行多列
按照子查询位置划分:
where 之后
from 之后
select 之后
-- 标量子查询 常用操作符: =、 <>、 >、 >=、 <、 <=
-- 列子查询 常用操作符: in、not in、any、some(与any相同)、all
-- 对于 any、some、all 一般与常用常用操作符连用
select * from emp where salary > some (
select salary from emp where dept_id in (
select id from dept where name = '研发部'
)
)
-- 行子查询 常用操作符:= 、<> 、IN 、NOT IN
select * from emp where (salary,managerid) = (select salary, managerid from emp where name = '张无忌');
-- 表子查询 常用操作符: in
select * from emp where (salary, managerid) in (select salary, managerid from emp where name = '鹿杖客' or name = '宋远桥');
事务
相关指令:
-- 查看/设置事务提交方式 [value = 1 代表开启了自动提交]
select @@autocommit;
set @@autocommit = 0;
-- 提交事务
commit;
-- 回滚事务
rollback;
我们关闭自动提交事务之后,每次执行 DML 都不会提交,需要手动 commit
-- 开启事务
start transaction [或替换为 begin]
-- 提交事务
commit
-- 回滚事务
rollback
案例:
start transaction;
INSERT INTO account ( name, money )
VALUES
( "zhangsan", 2000 ),
( "lisi", 2000 );
commit;
begin;
update account set money = money - 1000 where name = 'zhangsan';
update account set money = money + 1000 where name = 'lisi';
commit;
- 事务的四大特性:acid
原子性(Atomicity): 事务是不可分割的最小操作单位
一致性(Consistency): 事务完成时,必须使所有的数据都保持一致状态
隔离性(Isolation): 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性(Durability): 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
- 并发事务可能存在的问题:
赃读:一个事务读取到另外一个事务还没有提交的数据
不可重复读:一个事务先后读取同一条记录,但是两次读取的数据不同,称之为不可重复读
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是插入数据的时候,又发现这行数据已经存在了
- 事务的隔离级别:
-- 查看事务的隔离级别
select @@transaction_isolation;
-- 设置事务隔离级别
set [session | global] transaction isolation level [read uncommit | read commit | repeatable read | serializable]
网络安全成长资源
最后,给大家分享一个超棒的网络安全学习路线图(文末有高清图和XMIND文件)
点击此处即可领取282G网络安全零基础入门学习籽料
还有一些学习中收集的视频、文档资源,有需要的可以自取:
每个成长路线对应板块的配套视频:
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。