当前位置: 首页 > news >正文

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的指定目录下。

原文链接:同上

http://www.dtcms.com/a/107475.html

相关文章:

  • 论文:Generalized Category Discovery with Clustering Assignment Consistency
  • 获取各类基本因子
  • day21和day22学习Pandas库
  • Ray Flow Insight:让分布式系统调试不再“黑盒“
  • 【模型部署】onnx模型-LOOP 节点实例
  • 2.3.3 使用@Profile注解进行多环境配置
  • 高通将进军英国芯片 IP 业务 Alphawave
  • Qt线程等待条件QWaitCondition
  • 深入理解DRAM刷新机制:异步刷新为何无需扣除刷新时间?
  • 风电行业预测性维护解决方案:给风机装上 “智能医生”,实现故障 “秒级预警”
  • HTMX构建无重载闪烁的交互式页面
  • Vue开发系列——npm镜像问题
  • Frida Hook Native:jobjectArray 参数解析
  • SQL Server 增删改查详解
  • 使用pytesseract和Cookie登录古诗文网~(python爬虫)
  • 从Hugging Face下载Qwen/Qwen2-Audio-7B-Instruct模型到本地运行,使用python实现一个音频转文字的助手
  • 树莓派超全系列教程文档--(21)用户配置
  • 芋道源码——Spring Cloud Bus RocketMQ 入门
  • 《全栈+双客户端Turnkey方案》架构设计图
  • 软件版本号递增应该遵循的规范
  • 分层防御:对称与非对称加密如何守护数字世界
  • 0402-对象和类(访问器 更改器 日期类)
  • 北方算网获邀在中关村论坛发言 解析人工智能+产业落地核心路径
  • 【数据库原理及安全实验】实验一 数据库安装与创建
  • openEuler24.03 LTS下安装HBase集群
  • YOLO学习笔记 | 基于YOLOv5的车辆行人重识别算法研究(附matlab代码)
  • Ubuntu 22.04 安装和运行 EDK2 超详细教程
  • 门控循环单元(GRU)基础学习与实例:电影评论情感分类
  • 微信小程序开发-01.介绍
  • Java 基础-29-final关键字-详解