MySQL 基础概念与简单使用
一、数据库基本概念
1、数据库定义
数据库(Database)是存储在计算机内、有组织、可共享的数据集合,用于高效地管理大量数据。
2、数据库分类
按数据模型分类:
- 关系型数据库(如 MySQL、Oracle、SQL Server)
- 数据按表格存储,表间通过关系链接。强调结构规范和一致性,使用SQL语言
- 非关系型数据库(如 Redis、MongoDB)
- 非关系型数据库:打破固定表格结构,形式灵活(如文档、键值对等)。为高性能、高扩展性而生
- 层级型数据库
- 数据像家族树一样严格按父子层次结构组织,每个节点只能有一个父节点
- 网络型数据库
- 是层级数据库的扩展,允许一个节点有多个父节点,形成像网一样的复杂结构
按存储介质分类:
- 磁盘(关系)数据库:数据持久化存储在磁盘中(如 MySQL、PostgreSQL)
- 内存(非关系)数据库:数据存储在内存中,读写速度快(如 Redis)
二、关系型数据库
1、基本概念
- 核心概念:数据以**表(Table)**的形式组织。每个表由行(Row)和列(Column)组成。
- 表:代表一个实体类型,如“用户表”、“订单表”。
- 行:代表一个具体的实体记录,如“一个用户的信息”。
- 列:代表实体的一个属性,如“姓名”、“年龄”。
- 关键特性:
- 结构化数据: schema(模式)是预先定义且严格的,规定了每列的数据类型(如整数、字符串等)
- SQL:使用结构化查询语言进行操作和查询,功能强大且通用
- ACID事务:保证了数据的原子性、一致性、隔离性、持久性,这是金融、交易等系统的基石
- 关系:表与表之间通过主键和外键建立关联,避免了数据冗余
- 优点:数据一致性高、支持复杂查询、技术成熟、生态完善
- 缺点:在处理海量数据和高并发读写时,性能可能成为瓶颈(尽管可以通过集群等方式缓解);schema 不够灵活,修改结构比较麻烦
2、典型关系型数据库
- 大型:Oracle、DB2
- 中型:SQL Server、MySQL
- 小型:Access、SQLite
三、SQL 分类
SQL(Structured Query Language)根据其功能主要分为以下五大类:
1、数据定义语言 (DDL - Data Definition Language)
- 职责:用于定义和管理数据库中的结构,如数据库、表、索引、视图等。这些操作通常会自动提交(隐式事务),无法回滚
- 核心指令:
CREATE
:创建新的数据库、表、索引等ALTER
:修改现有的数据库对象结构(例如,添加、删除或修改列)DROP
:删除整个数据库、表或索引TRUNCATE
:清空表中的所有数据(保留表结构)
2、数据查询语言 (DQL - Data Query Language)
- 职责:用于从数据库中查询/检索数据,而不对数据本身进行修改。是SQL中最核心和最常用的部分
- 核心指令:
SELECT
:从表中选择数据SHOW
(在某些数据库如MySQL中用于显示数据库、表等信息)
- 常用子句/关键字:
FROM
:指定要查询的表WHERE
:指定过滤条件ORDER BY
:对结果集进行排序GROUP BY
:将结果集按一列或多列分组HAVING
:对分组后的结果进行过滤JOIN
:用于连接多个表
3、数据操作语言 (DML - Data Manipulation Language)
- 职责:用于对数据库表中的**记录(行)**进行增、删、改操作
- 核心指令:
INSERT
:向表中插入新记录UPDATE
:更新表中已存在的记录DELETE
:删除表中的记录
4、数据控制语言 (DCL - Data Control Language)
- 职责:用于控制对数据库的访问权限和安全性
- 核心指令:
GRANT
:授予用户或角色访问数据库对象的权限REVOKE
:撤销之前授予的权限
5、事务处理语言 (TPL - Transaction Processing Language)
- 职责:用于管理数据库中的事务,确保数据的完整性和一致性,保证一系列DML操作要么全部成功,要么全部失败
- 核心指令:
BEGIN TRANSACTION
/START TRANSACTION
:开始一个事务COMMIT
:提交事务,确认所有更改,使其永久化ROLLBACK
:回滚事务,撤销所有未提交的更改
四、MySQL 基本操作
1、对于数据库
-
创建数据库
create database yy;
-
查看数据库
show databases;
-
进入数据库
use yy;
-
删除数据库
drop database yy;
2、对于表
常用约束:
PRIMARY KEY
:主键UNIQUE KEY
:唯一键auto_increment
:自增约束NOT NULL
:非空DEFAULT
:默认值CHECK
:检查约束(MySQL 8.0+ 支持)foreign key references
:外键
-
创建表
create table xx (-> id int primary key auto_increment,-> name varchar(10) not null,-> age int(3)) engine=InnoDB default charset=utf8;
-
查看表
show tables;
-
查看表的列信息
show columns from xx;
-
删除表
drop table xx;
3、其他查看命令
-
查看支持的所有字符集
show character set;
-
查看当前数据库支持的所有存储引擎
show engines;
-
不进入某数据库而列出其包含的所有表
show tables from yy;
-
查看某表的创建命令
show create table xx;
-
查看某表的状态
show table status like 'xx'\G
五、用户操作与DCL
MySQL用户账号
由两部分组成,‘USERNAME’@‘HOST’。其中,HOST的值可为:
- IP地址
- 通配符:
%
:匹配任意长度的任意字符,常用于设置允许从任何主机登录_
:匹配任意单个字符
创建授权grant
- 权限类型(priv_type)
ALL
:所有权限SELECT
:读取内容的权限INSERT
:插入内容的权限UPDATE
:更新内容的权限DELETE
:删除内容的权限
- 指定要操作的对象
*.*
:所有库的所有表- db_name.*` :指定库的所有表
- db_name.table_name` :指定库的指定表
- WITH GRANT OPTION:被授权的用户可将自己的权限副本转赠给其他用户,说白点就是将自己的权限完全复制给另一个用户。不建议使用。
-
创建数据库用户
create user 'yanyvhang'@'192.168.100.20' identified by 'wiltjer';
-
使用新创建用户和密码登录
切换到 192.168.100.20 主机进行操作
mysql -uyanyvhang -h192.168.100.10 -pwiltjer
-
授权
示例:
授权 yanyvhang 用户在 192.168.100.20 上远程登录读取所有数据库
grant select on *.* to 'yanyvhang'@'192.168.100.20' identified by 'wiltjer';
-
重读授权表
flush privileges;
-
查看授权
切换到 192.168.100.20 主机进行操作
show grants;
-
撤销授权
revoke select on *.* from 'yanyvhang'@'192.168.100.20';
-
删除数据库用户
drop user 'yanyvhang'@'192.168.100.20';
六、DML操作
DML操作包括增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT),均属针对表的操作
INSERT语句
语法
insert [into] table_name [(column_name,...)] {values | value} (value1,...),(...),...
-
一次插入一条记录
insert into xx (id,name,age) value (1,'tom',20);
-
一次插入多条记录
insert into xx (id,name,age) value (2,'jerry',23),-> (3,'zs',22),-> (4,'li',25),-> (5,'ww',26),-> (6,'zl',20),-> (7,'lq',NULL);
SELECT语句
字段column表示法
-
*
:所有字段 -
column1, column2
:选择指定字段 -
as
:字段别名,column1 AS alias_name
-
当表名很长时用别名代替
条件判断语句WHERE
>,<,>=,<=,=,!=
:操作符BETWEEN value1 AND value2
:范围查询LIKE
:模糊匹配IS NULL
:空值IS NOT NULL
:非空
条件逻辑操作
AND
:与OR
:或NOT
:非
ORDER BY语句
ORDER BY column_nam
:升序(默认)ORDER BY column_name ASC
:升序ORDER BY column_name DESC
:降序
LIMIT 限制
LIMIT n
:取前n个结果LIMIT n,m
:跳过m个结果,取后面n个结果
语法
SELECT column1,column2,... FROM table_name [WHERE clause] [ORDER BY 'column_name' [DESC]] [LIMIT [m,]n];
-
选择所有字段
select * from xx;
-
选择 name 字段
select name from xx;
-
按照年龄进行升序排序
select * from xx order by age;
-
按照年龄进行降序排序
select * from xx order by age desc;
-
按照年龄进行升序排序,取前两个结果
select * from xx order by age limit 2;
-
按照年龄进行升序排序,取前第二、第三个结果
select * from xx order by age limit 1,2;
-
查询年龄大于等于25的所有
select * from xx where age >= 25;
-
查询年龄大于等于25且名字为ww的所有字段
select * from xx where age >= 25 and name = 'ww';
-
查询年龄在22到25之间的所有字段
select * from xx where age between 22 and 25;
-
查询年龄为空值的所有字段
select * from xx where age is null;
update语句
语法
UPDATE table_name SET column1 = new_value1[,column2 = new_value2,...] [WHERE clause] [ORDER BY 'column_name' [DESC]] [LIMIT [m,]n];
-
将名字为lq的年龄改为28
update xx set age = 28 where name = 'lq';
delete语句
语法
DELETE FROM table_name [WHERE clause] [ORDER BY 'column_name' [DESC]] [LIMIT [m,]n];
-
删除id为7的记录
delete from xx where id = 7;
-
删除整张表的内容
delete from xx;
truncate语句
特性 | DELETE | TRUNCATE |
---|---|---|
删除方式 | 逐行删除,记录每行删除日志 | 释放数据页方式删除,只记录页释放 |
事务日志 | 在事务日志中记录每行删除操作 | 只在事务日志中记录页释放 |
恢复可能性 | 可通过回滚事务日志恢复数据 | 删除后无法恢复数据 |
执行速度 | 相对较慢 | 执行速度快 |
资源占用 | 占用较多系统和事务日志资源 | 使用较少系统资源 |
表结构 | 保留表结构、约束和索引 | 保留表结构、约束和索引 |
标识列 | 不重置标识列的计数值 | 重置标识列的计数值为初始值 |
外键约束 | 可用于有外键约束的表 | 不能用于有外键约束引用的表 |
索引视图 | 可用于加入了索引视图的表 | 不能用于加入了索引视图的表 |
触发器 | 会激活触发器 | 不会激活触发器 |
语法
TRUNCATE table_name;
七、示例参考
-
搭建mysql服务
略
-
创建一个以你名字为名的数据库,并创建一张表student
create database yanyvhang; use yanyvhang create table student (-> id int(11) not null auto_increment,-> name varchar(100) not null,-> age tinyint(4),-> primary key(id));
-
查看下该新建的表有无内容(用select语句)
select * from student;
-
往新建的student表中插入数据(用insert语句)
insert into student (id,name,age) value (1,'tom',20),-> (2,'jerry',23),-> (3,'chenyu',25),-> (4,'sean',28),-> (5,'zhangshan',26),-> (6,'zhangshan',20),-> (7,'lisi',NULL),-> (8,'chenshuo',10),-> (9,'wangwu',3),-> (10,'qiuyi',15),-> (11,'qiuxiaotian',20);
-
修改lisi的年龄为50
update student set age = 50 where name = 'lisi';
-
以age字段降序排序
select * from student order by age desc;
-
查询student表中年龄最小的3位同学跳过前2位
select * from student order by age limit 2,3;
-
查询student表中年龄最大的4位同学
select * from student order by age desc limit 4;
-
查询student表中名字叫zhangshan的记录
select * from student where name = 'zhangshan';
-
查询student表中名字叫zhangshan且年龄大于20岁的记录
select * from student where name = 'zhangshan' and age > 20;
-
查询student表中年龄在23到30之间的记录
select * from student where age between 23 and 30;
-
修改wangwu的年龄为100
update student set age = 100 where name = 'wangwu';
-
删除student中名字叫zhangshan且年龄小于等于20的记录
delete from student where name = 'zhangshan' and age <= 20;
-
创建表course表,要求如下
id字段,int(3),主键
course_name字段,varchar(100)create table course (-> id int(3) primary key,-> course_name varchar(100));
-
为course表插入数据
insert into course (id,course_name) value (1,'Java'),-> (2,'MySQL'),-> (3,'Python'),-> (4,'Go'),-> (5,'C++');
-
创建student123表,要求如下
id字段 int(3) 主键
name varchar(100)
age int(3)
sex varchar(10)
height int(3)
course_id int(3) 外键,参照course表中的主键create table student123 (-> id int(3) primary key,-> name varchar(100),-> age int(3),-> sex varchar(10),-> height int(3),-> course_id int(3),-> foreign key(course_id) references course(id));
-
为student123表插入数据
insert into student123 (id,name,age,sex,height,course_id) value (1,'Dany',25,'man',160,1),-> (2,'Green',23,'man',158,2),-> (3,'Henry',23,'woman',185,1),-> (4,'Jane',22,'man',162,3),-> (5,'Jim',24,'woman',175,2),-> (6,'John',21,'woman',172,4),-> (7,'Lily',22,'man',165,4),-> (8,'Susan',23,'man',170,5),-> (9,'Thomas',22,'woman',178,5),-> (10,'Tom',23,'woman',165,5);