MySQL基础

本文介绍数据库相关概念,包括数据库、管理系统、SQL及关系型数据库。详细阐述SQL各类语句的语法和使用,如DDL、DML、DQL、DCL。还讲解了数据库函数、约束、多表查询和事务等内容,涉及事务特征、并发问题及隔离级别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

一、数据库的概念

1.1、数据库(DataBase(DB))

存储数据的仓库,数据是有组织的进行存储

1.2、数据库管理系统(DataBase Management System(DBMS))

操纵和管理数据库的大型软件

1.3、SQL:(Structured Ouery Language(SOL))

操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准

1.4关系型数据库(RDBMS)

概念:建立在关系模型基础上的,有多张表相互连接的二维表组成数据库。

二、SQL

2.1SQL通用语法

2.2SQL分类

2.3(数据定义语言)DDL

用来定义数据库对象(数据库,表,字段)
***语句可以大小写

2.3.1基础操作

2.3.1.1查询所有数据库

格式:SHOW DATABASES ;

在这里插入图片描述

2.3.1.2查询当前数据库

格式:SELECT DATABASE():

***注意:这里的()是不可以省略的。
在这里插入图片描述

2.3.1.3创建

格式:CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET字符集][COLLATE 排序规则];

这里的【】是可选的
在这里插入图片描述

2.3.1.4 使用

USE 数据库名;

在这里插入图片描述

2.3.1.5删除

格式:DROP DATABASE[IF EXISTS]数据库名:
使用
在这里插入图片描述

2.3.2表的操作

2.3.2.1创建

格式:

CREATE TABLE 表名(
字段1 类型[COMMENT '注释']
字段2 类型[COMMENT '注释']
字段3 类型[COMMENT '注释']
...
)[COMMENT 表注释];
mysql> create table test_user(
    -> id int comment '编号',
    -> name varchar(50) comment '姓名',
    -> age int comment '年龄'
    -> ) comment '测试表';
Query OK, 0 rows affected (0.05 sec)
2.3.2.2查询
2.3.2.2.1查询当前数据库所有表

格式:SHOW TABLES;
在这里插入图片描述

2.3.2.2.2查询表结构

格式:DESC 表名:

在这里插入图片描述

2.3.2.2.3查询指定表的建表语句

格式:SHOW CREATE TABLE 表名;

在这里插入图片描述

2.3.2.3 常见数据类型

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d0a1ffb11efd403ba515c6e755caf434.png

mysql> create table job_table(
    -> id int comment '编号'  ,
    -> no varchar(10) comment '工号'  ,
    -> name varchar(10) comment '姓名'  ,
    -> gender varchar(1) comment '性别'  ,
    -> age tinyint unsigned comment '年龄'
    -> ) comment '员工表';
Query OK, 0 rows affected (0.04 sec)
2.3.2.4修改与删除
2.3.2.4.1修改

格式:ALTER TABLE 表名 ADR 字段名 类型(长度)[COMMENT 注释][约束];

mysql> alter table job_table add niname varchar(10) comment '昵称';
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

在这里插入图片描述
还有两种格式;
修改数据类型

格式: ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);

修改字段名和字段类型

格式: ALTER TABLE 表名 CHANGE |日字段名 新字段名 类型(长度)[COMMENT注释][约束];

修改表名

格式:ALTER TABLE 表名 RENAME TO 新表名:

2.3.2.4.2 删除

删除字段名

格式: ALTER TABLE 表名 DROP 字段名;

mysql> ALTER TABLE job_table DROP niname;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

删除表

格式:DROP TABLE「IF EXISTS]表名,

删除指定表,并重新创建该表

格式:TRUNCATE TABLE 表名)

2.4(数据操作语言)DML

用来对数据库表中的数据进行增删改

2.4.1添加数据

2.4.1.1给指定字段添加数据

格式:INSERT INTO 表名 (字段名1, 字段名2, …) VALUES (值1, 值2, …);

insert into employee(id,workno,name,gender,age,idcard,entrydate)
values(001,'001','橙汁','男',23,'440582200006010101','2000-01-01');
select * from employee;

在这里插入图片描述

2.4.1.2批量添加数据

INSERT INTO 表名 VALUES (值1, 值2, …), (值1, 值2, …), (值1, 值2, …) ;

2.4.2修改数据

格式:UPDATE 表名 SET 字段名1 =1 , 字段名2 =2 , .... [ WHERE 条件 ] ;
UPDATE employee SET id = 1,name = '小明' , gender = '男'  WHERE age=10 ;
select * from employee;

在这里插入图片描述

2.4.3删除数据

DELETE FROM 表名 [ WHERE 条件 ] ;

delete from employee where name= '橙汁';

在这里插入图片描述
*注意:没加条件限制则是删除整张表

2.5(数据查询语言)DQL

用来查询数据库中表的记录
table补充一下数据。
在这里插入图片描述

INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (1, '001', '捷风', '女', 20, '123456789012345678', '深圳', '2024-03-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (2, '002', '铁壁', '男', 18, '123456789012345670', '深圳', '2005-09-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (3, '003', '一决', '男', 38, '123456789712345670', '广州', '2005-08-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (4, '004', '雷兹', '女', 18, '123456757123845670', '深圳', '2009-12-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (5, '005', '贤者', '女', 16, '123456769012345678', '广州', '2007-07-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (6, '006', '幽影', '男', 28, '12345678931234567X', '深圳', '2006-01-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (7, '007', '炼狱', '男', 40, '123456789212345670', '深圳', '2005-05-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (8, '008', '霓虹', '女', 38, '123456157123645670', '广州', '2015-05-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (9, '009', '斯凯', '女', 45, '123156789012345678', '深圳', '2010-04-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (10, '010', '猎萧', '男', 53, '123456789012345670', '广州', '2011-01-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (11, '011', '零', '男', 55, '123567897123465670', '广州', '2015-05-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (12, '012', '保安', '男', 32, '123446757152345670', '深圳', '2004-02-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (13, '013', '海王', '男', 88, '123656789012345678', '广州', '2020-11-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (14, '014', '奇乐', '女', 65, '123456719012345670', '汕头', '2019-05-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (15, '015', '盖克', '男', 70, '12345674971234567X', '汕头', '2018-04-01');
INSERT INTO employee(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (16, '016', '黑梦', '女', 18, NULL, '深圳', '2012-06-01');

格式:

SELECT
	字段列表
FROM
	表名列表
WHERE
	条件列表
GROUP BY
	分组字段列表
HAVING
	分组后条件列表
ORDER BY
	排序字段列表
LIMIT
	分页参数

2.5.1 基础查询语法

2.5.1.1查询字段

(1) SELECT 字段1, 字段2, 字段3 … FROM 表名 ;
(2)SELECT * FROM 表名 ;

注意:*号表示全部字段
在这里插入图片描述

2.5.1.2 设置字段的别名

格式:SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] … FROM 表名;

注意:AS可以不加

在这里插入图片描述

2.5.1.3 返回不重复的字段值

格式:SELECT DISTINCT 字段列表 FROM 表名;

在这里插入图片描述

2.5.2 条件查询语法

格式:SELECT 字段列表 FROM 表名 WHERE 条件列表 ;
常见的比较运算符
在这里插入图片描述
常用的逻辑运算符在这里插入图片描述

2.5.2.1 查询年龄大于50的员工

在这里插入图片描述

2.5.2.2 查询没有身份证号的员工信息

select * from employee where idcard is NULL;
在这里插入图片描述

2.5.2.3 查询姓名为某些字的员工信息

select * from employee where name like ‘捷风’;
在这里插入图片描述

2.5.2.4 查询身份证号最后一位是X的员工信息

格式:select * from emp where idcard like ‘%X’;

在这里插入图片描述

2.5.3 聚合函数查询语法

简介:将一列数据作为一个整体,进行纵向计算
格式:

SELECT 聚合函数(字段列表) FROM 表名 ;

常见的聚合函数:
在这里插入图片描述

2.5.3.1统计企业员工数量
 select count(*) from employee; -- 统计的是总记录数 
 select count(idcard) from employee;-- 统计的是idcard字段不为null的记录数
2.5.3.2 统计广州地区员工的年龄之和

select sum(age) from employee where workaddress=‘广州’ ;
在这里插入图片描述

2.5.4 分组查询语法

格式:

SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [HAVING 分组后过滤条件 ];

where与having的区别:

执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组 之后对结果进行过滤。

判断条件不同:where不能对聚合函数进行判断,而having可以。

执行顺序:where>聚合函数>having

2.5.4.1 统计男性员工和女性员工的数量
select gender,count(*)
from employee
group by gender;

在这里插入图片描述

2.5.4.2 查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于2的工作地址
select workaddress,count(*) as address_count
from employee
where age<50
group by workaddress
having address_count>2;

在这里插入图片描述

2.5.5 排序查询语法

格式:ASC : 升序(默认值),DESC: 降序

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;

2.5.5.1根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序
select age,entrydate
from employee
order by age asc,entrydate asc;

在这里插入图片描述

2.5.6分页查询语法

格式:

SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;

select *
from employee
limit 0,10;

在这里插入图片描述

2.5.7 执行顺序

select age         #④
from employee      #①
where age>11       #②
group by  age      #③
Having age>30
order by age asc   #⑤
limit  0,10;       #⑥

在这里插入图片描述

2.6(数据控制语言)DCL

用来创建数据库用户、控制数据库的访问权限

2.6.1管理用户

在MySQL中需要通过用户名@主机名的方式,来唯一标识一个用户。

2.6.1.1查询用户

格式:

select * from mysql.user;

在这里插入图片描述
其中 Host代表当前用户访问的主机, 如果为localhost, 仅代表只能够在当前本机访问,是不可以远程访问的。

2.6.1.2创建用户

格式:

CREATE USER ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’;

创建用户test03, 只能够在当前主机localhost访问, 密码a123456;如果想创建任意主机访问该数据库则将’test03’@‘localhost’改成’test03’@'%'即可

create user 'test03'@'localhost' identified by 'a123456';

在这里插入图片描述

2.6.1.1修改用户密码

格式:

ALTER USER ‘用户名’@‘主机名’ IDENTIFIED WITH mysql_native_password BY ‘新密码’

修改用户test03的访问密码为123456;

alter user 'test03'@'localhost' identified with mysql_native_password by '123456';
2.6.1.1删除用户

格式:

DROP USER ‘用户名’@‘主机名’ ;

删除 test03@localhost 用户

drop user ‘test03’@‘localhost’;

2.6.2 权限控制

基础权限
在这里插入图片描述

2.6.2.1 查询权限

格式:

SHOW GRANTS FOR ‘用户名’@‘主机名’ ;

查询 ‘test03’@‘%’ 用户的权限

show grants for 'test03'@'%';
2.6.2.2授予权限

GRANT 权限列表 ON 数据库名.表名 TO ‘用户名’@‘主机名’;

授予 ‘test03’@‘%’ 用户test01数据库所有表的所有操作权限

grant all on test01.* to 'test03'@'%';
2.6.2.3撤销权限

格式:

REVOKE 权限列表 ON 数据库名.表名 FROM ‘用户名’@‘主机名’;

撤销 ‘test03’@‘%’ 用户的test01数据库的所有权限

revoke all on test01.* from ‘test03’@‘%’;

三、函数

3.1 基本的字符串函数

在这里插入图片描述

3.1.1填充

select lpad(‘01’, 5, ‘0’);

在这里插入图片描述

3.1.2截取字符串

select substring(‘Hello MySQL’,1,5);

在这里插入图片描述

3.1.3更新雇佣表

update employee set workno = lpad(workno, 6, ‘0’);

在这里插入图片描述

3.2 常见数值函数

在这里插入图片描述

select round(3.18,1);
在这里插入图片描述

3.3日期函数

在这里插入图片描述

3.3.1查询员工入职的天数 *

select name, datediff(curdate(), entrydate)  'entrydays'
from employee
order by entrydays desc;

在这里插入图片描述

3.4流程函数

常见的流程函数
在这里插入图片描述

3.4.1IF

在这里插入图片描述

3.4.2IFNULL

在这里插入图片描述
在这里插入图片描述

3.4.3CASE *

查询员工姓名和工作地址,广州和深圳为一线城市其他为二线。

select name,workaddress,
( case workaddress when '广州' then '一线城市' when '深圳' then '一线城市' else
'二线城市' end ) as '工作地址'
from employee;

在这里插入图片描述

四、约束

简介:
约束的概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

4.1常见约束

  • 约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
    在这里插入图片描述

4.2约束

4.2.1需求表结构

在这里插入图片描述

4.2.2创建方式

方式一:

CREATE TABLE table_user(
id int AUTO_INCREMENT PRIMARY KEY COMMENT 'ID唯一标识',
name varchar(10) NOT NULL UNIQUE COMMENT '姓名' ,
age int check (age > 0 && age <= 120) COMMENT '年龄' ,
status char(1) default '1' COMMENT '状态',
gender char(1) COMMENT '性别'
);

方式二:
在这里插入图片描述
如果没按要求输入报错,如下
在这里插入图片描述

4.3 外键约束

简介:
外键:两张表之间建立连接的数据,保证数据的一致性和完整性。
创建employee1和department表;如果未添加外键(id)约束则这两张表中的数据不存在约束其内容可以随意删除。
如果添加了外键约束:如图所示:
在这里插入图片描述

4.3.1添加外键约束

格式:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表
(主表列名) ;

alter table employee1 add constraint e_d_id foreign key (department_id) references department(id);

添加完这里会改变。
在这里插入图片描述

4.3.2删除外键约束

格式:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

4.3.3删除/更新行为

在这里插入图片描述

CASCADE

格式:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名
(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

当删除父表id时,子表中关联的记录也被删除。

alter table employee1 
add constraint E_D_id 
foreign key (department_id) 
references department(id) 
on update cascade            #当department主键被更新时,employee1中相应的键也会被更改
on delete cascade ;

五、多表查询

5.1 多表关系

类别基本为:一对多,多对多,一对一。

5.1.1一对多

例子:部门与员工关系
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的那方 建立外键,指向一的一方的主键

5.1.2多对多

例子:学生与课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
在这里插入图片描述

六、事务

6.1简介

事务:是一组操作的集合,它是一个不可分割的工作单位,事务把所有的操作作一个整体一起 向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
*注意:MySQL的事务是自动提交的,执行一条DML语句后,会立即隐式的提交事务。

6.2事务操作

数据准备:
张三和李四分别有2000

create table account(
id int primary key AUTO_INCREMENT comment 'ID',
name varchar(10) comment '姓名',
money double(10,2) comment '余额'
) comment '账户表';
insert into account(name, money) VALUES ('张三',2000), ('李四',2000);

控制事务一

格式:

1.开启事务
START TRANSACTION 或 BEGIN ;
2.提交事务
COMMIT;
3.回滚事务
ROLLBACK;

控制事务二

格式:

1.设置事务提交方式
SELECT @@autocommit ;
SET @@autocommit = 0 ;
2.提交事务
COMMIT;
3.回滚事务
ROLLBACK;

张三给李四转1000,进行事务处理后,张三有1000李四有3000;

select @@autocommit;  #@@autocommit设置事务提交方式
set @@autocommit = 0; #0手动提交,1自动提交
update account set money = money - 1000 where name='张三';#张三余额减少1000
update account set money = money + 1000 where name='李四';#李四余额增加1000
commit;                #手动提交事务
ROLLBACK               #回滚事务

***注意①:把@@auotcommit设置为0时,执行后的数据只是暂时储存起来,没有写回数据库中,此时要执行commit才能将数据写回数据库。
***注意②:当事务执行时出错时,可执行回滚事务将数据恢复执行事务前。
在这里插入图片描述

6.3 事务四大特征

· 原子性:事务是不可分割的最小操作单元;
·一致性:事务完成时,必须使所有的数据都保持一直状态;
·隔离性:数据库系统提供的隔离机制保证事务在不受外部并发操作影响的独立
环境下运行
·持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

6.4 并发事务问题

脏读:一个事务读到另外一个事务还没有提交的数据。
不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影”。
注意:原子操作所出现的相关问题。

6.5 事务隔离级别

在这里插入图片描述

6.5.1 查看事务隔离级别

SELECT @@TRANSACTION_ISOLATION;

6.5.2 设置事务隔离级别

格式:

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

设置事务隔离级别为 READ UNCOMMITTED

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

***注意:事务隔离级别越高,数据越安全,但性能越低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值