46.Mysql基础及案例
MySQL特点
- 开源免费的关系型数据库产品
- 对PHP支持最好(常用于LAMP/WAMP架构)
- 使用SQL指令进行操作
- 目前隶属于Oracle公司
数据库基本概念
数据库定义
数据库是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。
数据库分类
- 网络数据库:将数据库技术引入计算机网络系统
- 层级数据库:有根结点的定向有序树结构
- 关系数据库:建立在关系模型基础上的数据库
存储介质分类
关系型数据库:存储在磁盘中
非关系型数据库:存储在内存中
关系型数据库
三个组成部分
- 关系数据结构:以二维表形式存储数据
- 关系操作集合:使用SQL指令管理数据
- 关系完整性约束:数据内部和表间的关联关系
典型关系型数据库
- 小型:Microsoft Access,SQLite
- 中型:SQL Server,MySQL
- 大型:Oracle,DB2
SQL语言分类
- 数据查询语言(DQL):SELECT查询操作
- 数据操作语言(DML):INSERT、UPDATE、DELETE写操作
- 事务处理语言(TPL):COMMIT ROLLBACK 提交事务和回滚事务(恢复delete删除了但没有commit的)
- 数据控制语言(DCL):GRANT、REVOKE权限管理
- 数据定义语言(DDL):CREATE、DROP结构管理
MySQL组件
常见组件包括:数据库(database)、表(table)、索引(index)、视图(view)、用户(user)、权限(privilege)、存储过程(procedure)、存储函数(function)、触发器(trigger)、事件调度器(event scheduler)
约束类型
1.主键约束:PRIMARY KEY
作用:唯一标识表中的每一条记录。
特点:
主键列的值必须是唯一的,且不能为NULL。
一个表只能有一个主键,但主键可以由多个列组成(复合主键)
2.唯一键约束:UNIQUE
作用:确保列中的所有值都是不同的。
特点:
唯一约束允许NULL值(但只能有一个NULL,具体取决于数据库的设置, 但MySQL允许多个NULL值,因为NULL不等于任何值,包括另一个NULL)。一个表可以有多个唯一约束
3.外键约束:FOREIGN KEY
作用:用于关联两个表,确保一个表中的数据引用另一个表的主键。
特点:
外键约束用于维护表之间的引用完整性。
外键列的值必须是另一个表主键的值或者为NULL。
4.检查约束:CHECK
作用:确保列中的值满足指定的条件。
注意:在MySQL 8.0.16之前,CHECK约束会被解析但会被忽略。从8.0.16版本开始,MySQL才真正支持CHECK约束
5.默认值:DEFAULT
作用:当插入新记录时,如果没有为该列指定值,则使用默认值。
6.非空约束:NOT NULL
作用:确保列不能有NULL值
DDL数据定义操作
数据库操作
CREATE DATABASE db_name; -- 创建数据库
SHOW DATABASES; -- 查看数据库
DROP DATABASE db_name; -- 删除数据库
表操作
CREATE TABLE table_name ( -- 创建表col1 datatype constraints,col2 datatype constraints
) ENGINE='存储引擎类型';SHOW TABLES; -- 查看表
DESC table_name; -- 查看表结构
DROP TABLE table_name; -- 删除表
DML数据操作语言
INSERT插入数据
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
UPDATE更新数据
UPDATE table_name SET column1 = value1 [WHERE condition];
DELETE删除数据
DELETE FROM table_name [WHERE condition];
TRUNCATE清空表
TRUNCATE TABLE table_name;
- 需要删除整个表的所有数据时:优先使用 TRUNCATE TABLE,因为它速度更快,使用的系统资源和日志资源更少。
- 需要根据条件删除部分数据时:必须使用 DELETE FROM … WHERE …,因为
TRUNCATE
不能带条件。 - 需要保留标识列(自增ID)的连续性时:使用 DELETE。
- 需要希望标识列(自增ID)从头开始时:使用 TRUNCATE。
- 删除操作需要能被回滚时:使用 DELETE(注意:在某些数据库如Oracle中,
TRUNCATE
在事务内也可回滚,但为了代码的通用性和可读性,如果需要回滚,通常更安全的选择是DELETE
)。 - 表上有DELETE触发器,需要触发它时:使用 DELETE。
SELECT查询数据
SELECT column1, column2 FROM table_name
[WHERE condition]
[ORDER BY column_name [DESC]]
[LIMIT [offset,] count];
DCL数据控制语言
授权操作
GRANT privilege_type ON db_name.table_name TO 'username'@'host';
权限查看
SHOW GRANTS; -- 查看当前用户权限
SHOW GRANTS FOR 'user'@'host'; -- 查看指定用户权限
取消授权
REVOKE privilege_type ON db_name.table_name FROM 'username'@'host';
FLUSH PRIVILEGES; -- 刷新权限
注意:mysql服务进程启动时会读取mysql库中的所有授权表至内存中:
GRANT或REVOKE等执行权限操作会保存于表中,mysql的服务进程会自动重读授权表,并更新至内存中
对于不能够或不能及时重读授权表的命令,可手动让mysql的服务进程重读授权表
常用的SHOW命令
SHOW CHARACTER SET; -- 查看字符集
SHOW ENGINES; -- 查看存储引擎
SHOW DATABASES; -- 查看数据库
SHOW TABLES; -- 查看表
SHOW CREATE TABLE table_name; -- 查看建表语句
SHOW TABLE STATUS; -- 查看表状态
实战案例
1.搭建mysql服务
2…创建一个以你名字为名的数据库,并创建一张表student,该表包含三个字段(id,name,age),表结构如下
mysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+3 rows in set (0.01 sec)mysql> create database xyh;
mysql> create table student ( id int(11) not null auto_increment,-> name varchar(100) not null ,-> age tinyint(4) null default null,-> primary key(id))-> ;
3.查看下该新建的表有无内容(用select语句)
mysql> select * from student-> ;
Empty set (0.00 sec)
4.往新建的student表中插入数据(用insert语句),结果应如下所示:
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 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 |
+----+-------------+------+
mysql> insert into student(name,age) values('tom',20),-> ('jerry',23),-> ('chenyu',25),-> ('sean',28),-> ('zhangshan',26),-> ('zhangshan',20),-> ('lisi',null),-> ('chenshuo',10),-> ('wangwu',3),-> ('qiuyi',15),-> ('qiuxiaotian',20);
Query OK, 11 rows affected (0.00 sec)
Records: 11 Duplicates: 0 Warnings: 0
5.修改lisi的年龄为50
mysql> update student set age = 50 where name = 'lisi';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
6.以age字段降序排序
mysql> select * from student order by age desc;
7.查询student表中年龄最小的3位同学跳过前2位
mysql> select * from student order by age limit 2,3;
8.查询student表中年龄最大的4位同学
mysql> select * from student order by age desc limit 4;
9.查询student表中名字叫zhangshan的记录
mysql> select * from student where name = 'zhangshan';
10.查询student表中名字叫zhangshan且年龄大于20岁的记录
mysql> select * from student where name = 'zhangshan' and age > 20;
11.查询student表中年龄在23到30之间的记录
mysql> select * from student where age between 23 and 30;
12.修改wangwu的年龄为100
mysql> update student set age = 100 where name = 'wangwu';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
13.删除student中名字叫zhangshan且年龄小于等于20的记录
mysql> delete from student where name = 'zhangshan' and age <= 20;
Query OK, 0 rows affected (0.00 sec)
14.创建表course表,要求如下
id字段,int(3),主键
course_name字段,varchar(100)
mysql> create table course ( id int(3) primary key, course_name varchar(100));
Query OK, 0 rows affected (0.00 sec)
15、为course表插入数据
+----+-------------+
| id | course_name |
+----+-------------+
| 1 | Java |
| 2 | MySQL |
| 3 | Python |
| 4 | Go |
| 5 | C++ |
+----+-------------+
mysql> insert into course(id,course_name) values( 1,'java'),-> ( 2,'MYSQL'),-> ( 3,'Python'),-> ( 4,'Go'),-> ( 5,'C++');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
16、创建student123表,要求如下:
id字段 int(3) 主键
name varchar(100)
age int(3)
sex varchar(10)
height int(3)
course_id int(3) 外键,参照course表中的主键
mysql> 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));
Query OK, 0 rows affected (0.01 sec)
17、为student123表插入数据如下:
+----+--------+------+-------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+--------+------+-------+--------+-----------+
| 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 |
+----+--------+------+-------+--------+-----------+
mysql> insert into student123(id,name,age,sex,height,course_id) values( 1,'Dany',25,'man',160,1),-> ( 2,'Green',23,'man',158,1),-> ( 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);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0