Mysql基础笔记
# 1.SQL数据类型
可以去这篇文章看看:
最全 SQL 字段类型(4种)、属性(6种)总结:https://blog.csdn.net/weixin_45654582/article/details/119157403
### 一.整数类型
### 二.小数类型(2种)
1、浮点型:float / double
2、定点型:decimal
### 三.字符串类型(5种)
1、定长型:char(L)
2、变长型:varchar(L)
3、文本字符串:text/blob
4、枚举型:enum
5、集合型:set
### 四.时间日期类型(5种)
1、年:year
2、时间戳:timestamp
3、日期:date
4、日期时间:datetime
5、时间:time
# 2. 数据完整性约束
### 检查约束 (check)
确保字段值满足特定条件
字段名 数据类型 check (条件)
例如:
create table user(
id int primary key auto_increment,
name varchar(10) not null unique,
age int check (age > 0 && age <= 120)
)
### 主键约束 (primary key)
主键约束:用于唯一标识数据表的一条记录
#注意:主键约束要求主键列的数据唯一且不能为空#
#### 1.单字段主键
方式1:字段名称 数据类型 primary key
例如:
create table student(
sno char(12) primary key,
sname
)
方式2:primary key(字段名)
例如:
create table student(
sno char(12),
primary key(sno)
)
#### 2.多字段主键
primary key(字段名1,字段名2,字段名3...)
例如:
create table student(
sno char(12),
cno char(12),
grade float,
primary key(sno,cno)
)
### 外键约束 (foreign key)
外键约束:用于多表之间的关联约束
外键用于建立两个表之间的关系,以确保数据的引用完整性
foreign key (外键字段) references 父表名(父表字段)
例如:
假设我们有两个表,一个是 customers(客户表),另一个是 orders(订单表)。
我们想要在 orders 表中创建一个外键,以确保每个订单都引用一个有效的客户。
SQL 语句如下所示:
create table customers(
customer_id int primary key,
customer_name varchar(100),
customer_address varchar(255)
)
create table orders(
order_id int primary key,
customer_id int int,
order_date date,
total_amount decimal(10,2),
foreign key (customer_id) references customers(customer_id)
)
在这个例子中,orders 表中的 customer_id 字段是一个外键,
它引用了 customers 表中的 customer_id 字段。
这意味着在 orders 表中插入新订单时,
必须提供一个在 customers 表中已经存在的 customer_id。
基础拓展 外键约束的类型
外键约束类型:
cascade:
CASCADE UPDATE:如果父表中的参照字段值被更新,子表中的外键字段也会自动更新为新的值。
CASCADE DELETE:如果父表中的记录被删除,那么子表中所有引用该记录的行也会被自动删除。
set NULL:
SET NULL UPDATE:如果父表中的参照字段值被更新,子表中的外键字段将被设置为NULL。
SET NULL DELETE:如果父表中的记录被删除,子表中所有引用该记录的外键字段将被设置为NULL。
set default:
SET DEFAULT UPDATE:如果父表中的参照字段值被更新,子表中的外键字段将被设置为默认值。
SET DEFAULT DELETE:如果父表中的记录被删除,子表中所有引用该记录的外键字段将被设置为默认值。
no action 或 restrict:
NO ACTION UPDATE:如果父表中的参照字段值被更新,系统将检查是否有子表中的外键字段引用该值。如果有,更新操作将被拒绝。
NO ACTION DELETE:如果父表中的记录被删除,系统将检查是否有子表中的外键字段引用该记录。如果有,删除操作将被拒绝。
RESTRICT UPDATE:与NO ACTION UPDATE相同,如果更新操作会影响到子表中的外键字段,更新将被拒绝。
RESTRICT DELETE:与NO ACTION DELETE相同,如果删除操作会影响到子表中的外键字段,删除将被拒绝。
例如:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
ON DELETE SET NULL ON UPDATE CASCADE
);
在这个例子中,如果customers表中的customer_id被删除,orders表中的customer_id将被设置为NULL。
如果customers表中的customer_id被更新,orders表中的相应customer_id也会自动更新。
### 非空约束 (not null)
非空约束:设置了该约束的字符值不能为空
字段名 数据类型 not null
### 唯一性约束 (unique)
唯一性约束:设置了该约束的字段值不能重复
#注意:唯一约束要求唯一,但允许为空,且只能出现一个空值。可以有多个唯一约束的字段#
格式1:
字段名 数据类型 unique
格式2:
consteaint sn unique(字段名)
sn为自行设置的唯一约束的名称
### 默认值约束 (default)
默认值约束:用于设置字段的默认值
字段名 数据类型 default 默认值
### 自动增长 (auto_increment)
设置自动增长,每次插入新纪录是自动生成字段的逐渐值,不用指定具体值
字段名 数据类型 auto_increment
一般与主键约束一起使用:
字段名 数据类型 primary key auto_increment
# 3.DQL-数据查询
### 查询语句结构
select
字段列表 [as 别名]
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
### where的使用
语法:
select
字段列表 [as 别名]
from
表名列表
where
字段名 = 数值
### group by的使用
前置知识:聚合函数
count():统计个数
max()、min():最值
avg():平均值
sum():求和
语法:
select
字段列表 [as 别名]
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
where 和 having的区别: where 分组前条件过滤 , having 分组后条件过滤
### order by的使用
语法:
select
字段列表 [as 别名]
from
表名列表
order by
字段1 排序方式1,字段2 排序方式2 ...
(优先级从前往后)
排序方式
ASC: 升序(默认)
DESC: 降序
### limit的使用(分页查询)
select
字段列表 [as 别名]
from
表名列表
limit 起始索引,查询记录数;
# 4.DCL-用户管理
### 管理用户
1.查询用户
use mysql;
select * from user;
2.创建用户
create user '用户名'@'主机名' identified by '密码'
/*主机名例如:
用户名@主机域
10.0.0.51
10.0.0.%
% 表示任何
10.0.0.0/255.255.255.0 网段范围:10.0.0.0 ~ 10.0.0.255
Dd01
Localhost
127.0.0.1
*/
3.修改用户密码
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
4.删除用户
drop user '用户名'@'主机名';
### 权限控制
1.查询权限
show grants for '用户名'@'主机名';
2.授予权限
grants 权限列表 on 数据库名.表名 to '用户名'@'主机名';
(权限列表如下图)(数据库和表名可以用*表全部)
ALL,ALL PRIVILEGES 所有权限
SELECT 查询数据
INSERT 插入数据
UPDATE 修改数据
DELETE 删除数据
ALTER 修改表
DROP 删除数据库/表/视图
CREATE 创建数据库/表
3.撤销权限
remove 权限列表 on 数据库名.表名 from '用户名'@'主机名';
# 5.函数
以下图片均来自黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括_哔哩哔哩_bilibili黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括共计195条视频,包括:01.MySQL课程介绍、02. 基础-课程内容-数据库相关概念、03. 基础-概述-MySQL安装及启动等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV1Kr4y1i7ru/### 字符串函数
### 数值函数
### 日期函数
### 流程函数
if()、ifnull()判断是否为null、case when then else end
# 6.多表查询
### 内连接
#### 隐式内连接
select 字段列表 from 表1,表2 where 条件 ...;
例如:
select emp.name,dept.name from emp,dept where emp.dept_id = dept.id;
#这样太繁琐,可以使用表别名
select e.name,d.name from emp e,dept d where e.dept_id = d.id;
#### 显示内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件 ...; (inner可省略)
例如:
select * from emp e inner join dwpt d on e.dept_id = d.id;
### 外连接
#### 左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件 ...;
例如:
查询emp表的所有数据,和对应的部门dept信息
select e.*,d.name from emp e left outer jion dept d on e.dept_id = d.id;
#### 右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件 ...;
例如:
查询dept表的所有数据,和对应的部门dept信息
select d.*,e.* from emp e right outer jion dept d on e.dept_id = d.id;
### 自连接
select 字段列表 from 表A 别名A join 表A 别名B on 条件 ...;
例如:
查询emp表的员工数据和其领导名称。(由于领导也在emp表中,每条员工数据中只有领导的id,此时只能使用多表查询)
select a.*,b.name from emp a left join emp b on a.dept_id = b.id;
自连接既可以使用内连接也可以是外连接
### 联合查询
注意联合查询时必须字段列数必须与前表一致
select 字段列表 from 表A ... union [all] select 字段列表 from 表B ...;
union all 直接拼接所有数据 union 会进行去重
### 子查询/嵌套查询
select * from 表1 where 字段名1 = (select 字段名1 from 表2);
#### 标量子查询(1行1列)
select id from 表a where name = 'ABC'; #结果为id=3
select * from 表b where id = 3;
使用子查询就是
select * from 表b where id = (select id from 表a where name = 'ABC');
#### 列子查询(1列多行)
select id from 表a where name = 'ABC' or name = 'DEF'; #结果为id=3和id=5
select * from 表b where id in (3,5);
使用子查询就是
select * from 表b where id in (select id from 表a where name = 'ABC' or name = 'DEF');
#### 行子查询(1行多列)
select name,age from 表a where id = 1; #结果为name='root' age=777
select * from 表b where (name,age) = ('root','777');
使用子查询就是
select * from 表b where (name,age) = (select name,age from 表a where id = 1);
#### 表子查询(多行多列)
select name,age from 表a where id = 1 or id =2; #结果为name='root' age=777 name='admin' age=777
select * from 表b where (name,age) in (('root','777'),('admin','777'));
使用子查询就是
select * from 表b where (name,age) in (select name,age from 表a where id = 1 or id =2);
提示:子查询不用非要在where中使用,也可以在from等位置使用,不要局限在示例中。
# 7.事务
事务时一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
### 事务操作
#### 方式一
查看/设置事务提交方式
select @@autocommit; #@@autocommit=1是自动提交,为0是手动提交
set @@autocommit = 0;
手动提交事务
commit;
回滚事务
rollback;
#### 方式二
开启事务
start transaction 或 begin;
提交事务
commit;
回滚事务
rollback;
### 事务四大特性
原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性:事务完成时,必须使所有的数据都保持一致状态。
隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
# 常用命令
### 0 前置知识
### 0.1 命令行进入mysql
mysql -h 主机名 -P 端口 -u 用户名 -p
#-h -P 一般默认,不使用。
### 1.1 创建数据库、表
create database 数据库名;
//再详细一些的话
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];
create table 表名 (字段1名 数据类型 约束,字段2名 数据类型 约束,字段。。。);
//表示如果不存在该数据库或表,则创建。
create database if not exists 数据库名称
create table if not exists 表名
### 1.2 删除数据库、表、字段
drop database 数据库名;
drop table 表名;
### 2.显示数据库,进入数据库
show 数据库名;
use 数据库名;
### 3.显示表名(需要先进入数据库)
show tables;
show 表名;
### 4.数据库中的增删改查
#### 4.1增
insert into 表名(字段名1,名2,名3,...)values(值1,值2,值3,...),(值1,值2,值3,...)...;
4.1.1 增加字段( alter使用于改变表结构 )
alter table 表名 add column 字段名 类型 ...;
4.1.2 添加约束
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(主表列名);
#### 4.2删
delete from 表名 where 条件;
4.2.1 删除字段
alter table 表名 drop column 字段名;
#### 4.3改
update 表名 set 字段=‘值’ [where 条件];
4.3.1 修改字段
alter table 表名 change column 字段名 新字段名 类型;
4.3.2 修改字段属性
alter table 表名 modify column 字段名 新类型;
#### 4.4查
select */字段列表 from 表名 [where 条件];
select */字段列表 from 表名 [where 条件]\G;#格式化输出
4.4.0 查看表结构
desc 表名;或者 describe 表名;
4.4.1Limit控制输出(索引下标从0开始)
select * from 表名 limit 返回i行数据; #返回前i行记录
select * from 表名 limit 开始位置i,返回j行数据; #返回从第i条开始的j条记录
### 5.读取文件
使用load_file()函数读取文件,需要使用绝对路径。
#mysql8.0之后不再让使用#
读取文件时采用联合查询的方式
原文链接:[https://blog.csdn.net/m0_64378913/article/details/124446664](https://)
### 6.写入文件
使用select……into_outfile '绝对路径'
导入数据到pc的指定目录下。
原文链接:同上