最近刚刚复习了关系型数据库MySQL,现进行简单总结。
DataBase(简称DB),用于存储和管理数据的仓库。
1.1 数据库的特点:
可持久化存储数据(数据库其实就是一个文件系统);
可高效存储和管理数据;
支持统一的方式来操作数据库(对于关系型数据库——SQL;对于非关系型数据库——NoSQL)
1.2 常见的数据库:
关系型数据库——MySQL(由于开源免费,功能强大支持千万级别的并发访问,web应用中常用)、Oracle、DB2(常用于银行系统)、Microsoft Sql Server(C#、.net常用)、SQLite(应用手机端的嵌入式小型数据库)
非关系型数据库——Redis(key-value)、HBase(列数据库)、MongoDB(文件数据库)
Structured Query Language,结构化查询语言,定义了操作所有RDBMS的规则,对于每一种数据库操作实现的具体方式可能有所不同(SQL语句有差异)
2.1 SQL通用语法:
show databases; -- 显示所有数据库
use db1; # 使用db1数据库
/*
创建数据库db2
*/
create database db2;
2.2 SQL分类:DDL(数据定义语言)、DML(数据操作语言)、DQL(数据查询语言)、DCL(数据控制语言)下面以MySQL数据库为例进行详细总结。
MySQL数据库是目前应用最广的关系型数据库,安装部署方法参考链接:https://blog.csdn.net/bobo553443/article/details/81383194
MySQL Shell启动方式一共有两种。
3.1 MySQL Shell
一种是直接安装MySQL Shell应用程序,然后输出 \sql、\connect [email protected]并输入root用户的密码进入root用户操作MySQL shell环境。
3.2 MySQL Server
另一种是安装MySQL Server之后使用cmd进入其安装目录的bin目录(要么cmd直接cd进入;要么文件资源管理器的文件目录中直接输入cmd进入)输入 mysql -u root -p再输入密码即可
MySQL提供可视化操作界面,使用MySQL Workbench应用程序连接server,根据需要建立schema(数据库)和表即可
MySQL安装目录中可以看到对于数据库而言对应的是一个文件夹,数据表对应一个文件。
Data Definition Language,数据定义语言,主要涉及数据库和数据表的CRUD操作。C(create)R(retrieve)U(update)D(delete)
4.1 数据库
4.1.1 查询数据库:
1. show databases;
2. show create database db1; 查看db1数据库的字符集character
/* 查询数据库:
1. show databases;
2. show create database db1; 查看db1数据库的字符集character
*/
mysql> show databases; -- 查看当前所有的数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
6 rows in set (0.00 sec)
mysql> show create database mysql; -- 查看mysql数据库的字符集
+----------+---------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------------------------------------------------------------------------+
| mysql | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+---------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
4.1.2 创建数据库:
1. create database db1;
2. create database if not exists db1; -- 如果db1存在会报错,可在创建时进行判断。 如果db1不存在则创建数据库db1;如果存在则不做任何操作
3. create database db1 character set gbk; -- 设置数据库db1的字符集为gbk(可支持中文)
4. create databases if not exists db1 character set gbk;
/* 创建数据库:
1. create database db1;
2. create database if not exists db1; -- 如果db1存在会报错,可在创建时进行判断。 如果db1不存在则创建数据库db1;如果存在则不做任何操作
3. create database db1 character set gbk; -- 设置数据库db1的字符集为gbk(可支持中文)
4. create databases if not exists db1 character set gbk;
*/
mysql> create database db1; -- 创建数据库db1
Query OK, 1 row affected (0.38 sec)
mysql> show databases; -- 使用show查看到数据库db1创建成功
+--------------------+
| Database |
+--------------------+
| db1 |
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
7 rows in set (0.00 sec)
mysql> create database db1; -- 在db1数据库已存在的情况下再次创建报错
ERROR 1007 (HY000): Can't create database 'db1'; database exists
mysql> create database if not exists db1; -- 增加判断条件,如果db1已存在不做任何操作
Query OK, 1 row affected, 1 warning (0.10 sec)
mysql> create database if not exists db2 character set gbk; -- 通用的创建数据库的标准语句
Query OK, 1 row affected (0.12 sec)
mysql> show create database db2;
+----------+------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------------------------------------+
| db2 | CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)
4.1.3 删除数据库
1. drop database db1;
2. drop database if exists db1; -- 先判断db1是否存在,若存在则删除;若不存在则不做操作
/* 删除数据库:
1. drop database db1;
2. drop database if exists db1; -- 先判断db1是否存在,若存在则删除;若不存在则不做操作
*/
mysql> drop database db2; -- 删除数据库db2
Query OK, 0 rows affected (0.23 sec)
mysql> show databases; -- 显示数据库db2删除成功
+--------------------+
| Database |
+--------------------+
| db1 |
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
7 rows in set (0.00 sec)
mysql> show create database db2; -- 展示db2字符信息,但此时db2已被删除所以报错
ERROR 1049 (42000): Unknown database 'db2'
mysql> drop database if exists db2; -- 删除数据库前先做判断,如果存在则删除
Query OK, 0 rows affected, 1 warning (0.09 sec)
4.1.4 修改数据库
alter database db1 character set gbk; --修改数据库db1的字符集为gbk
/* 修改数据库:
alter database db1 character set gbk; --修改数据库db1的字符集为gbk
*/
mysql> alter database db1 character set gbk; -- 修改db1字符集为gbk
Query OK, 1 row affected (0.18 sec)
mysql> show create database db1; -- 查看db1字符集,字符集修改为gbk
+----------+------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------------------------------------+
| db1 | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
4.1.5 使用数据库
1. use db1; -- 使用数据库db1
2. select database(); # 查看当前使用的是哪个数据库
/* 使用数据库:
1. use db1; -- 使用数据库db1
2. select database(); # 查看当前使用的是哪个数据库
*/
mysql> select database(); -- 查看当前使用的数据库
+------------+
| database() |
+------------+
| mysql |
+------------+
1 row in set (0.00 sec)
mysql> use db1; -- 使用db1数据库
Database changed
mysql> select database(); -- 查看当前数据库已改变为db1
+------------+
| database() |
+------------+
| db1 |
+------------+
1 row in set (0.00 sec)
4.2 数据表
4.2.1 查询表
1. show tables; -- 查看当前数据库下所有的表
2. desc table1; -- 查看表table1的表结构(列名 列属性 列限制)
/* 查询表:
1. show tables; -- 查看当前数据库下所有的表
2. desc table1; -- 查看表table1的表结构(列名 列属性 列限制)
3. show create table table1; -- 查看table1的字符集
*/
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| table1 |
+---------------+
1 row in set (0.01 sec)
mysql> desc table1; -- 查看table1的表结构
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(4) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | varchar(1) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.15 sec)
4.2.2 创建表
/* 创建表:
1.create table table1(
列名1 列属性1,
列名2 列属性2,
... # 注意最后一行无逗号
); -- 语句结束有分号
2. create table table2 like table1; -- 复制表(table2表结构同table1)
*/
mysql> create table table1(
-> id int(4),
-> name varchar(20), -- char(20)是一开始给定20个字符,varchar(20)是根据实际的属性值大小分配,最大为20个字符
-> sex varchar(1)
-> );
Query OK, 0 rows affected, 1 warning (2.95 sec)
mysql> create table table2 like table1; -- 复制表table1到新表table2中
Query OK, 0 rows affected, 1 warning (0.82 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| table1 |
| table2 |
+---------------+
2 rows in set (0.00 sec)
mysql> desc table2; -- 可见新建的表table2表结构同table1
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(4) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
4.2.3 修改表
/* 修改表:
1. alter table table1 add 列名 列属性; -- 给表table1增加一个新列
2. alter table table1 modify 列名 新列属性; -- 给表table1的列名修改属性
3. alter table table1 change 列名 新列名 新列属性; -- 给表table1的列修改列名和列属性
4. alter table table1 drop 列名; -- 删除表table1的列
5. alter table character set 字符集; -- 设置表table1的字符集
6. alter table table1 rename to table2; -- 修改表名table1为table2
*/
mysql> alter table table1 add score double(4,1); -- 增加新列score
Query OK, 0 rows affected, 1 warning (0.96 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> desc table1; -- 查看table1的表结构可见score新列添加成功
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(4) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | varchar(1) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> alter table table1 modify sex char(1); -- 修改列sex属性为char(1)
Query OK, 0 rows affected (2.46 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table1; -- 查看table1表结构可见sex属性修改成功
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id | int(4) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| insert_time | timestamp | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
6 rows in set (0.07 sec)
mysql> alter table table1 change insert_time modify_time timestamp; -- 修改列insert_time为新列modify_time,列属性保持原样
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table1; -- 查看表结构可见列名修改成功
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id | int(4) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| modify_time | timestamp | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql> alter table table1 drop modify_time; -- 删除列modify_time
Query OK, 0 rows affected (1.45 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table1; -- 查看表结构可见列删除成功
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(4) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.17 sec)
mysql> alter table table1 character set gbk; -- 修改表table1的字符集
Query OK, 0 rows affected (0.45 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table table1; -- 查看可见table1的字符集修改成功
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| table1 | CREATE TABLE `table1` (
`id` int(4) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`sex` char(1) DEFAULT NULL,
`score` double(4,1) DEFAULT NULL,
`birthday` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)
mysql> alter table table1 rename to table2; -- 修改table1的表名
Query OK, 0 rows affected (0.52 sec)
mysql> show tables; -- 查看当前数据库的表没有table1
+---------------+
| Tables_in_db1 |
+---------------+
| table2 |
+---------------+
1 row in set (0.06 sec)
mysql> desc table1;
ERROR 1146 (42S02): Table 'db1.table1' doesn't exist
mysql> desc table2; -- 查看表名已修改成功
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(4) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
4.2.4 删除表
/* 删除表:
1. drop table table2; -- 删除表table2
2. drop table if exists table2; -- 在删除前加判断,如果表table2存在则删除,否则不做操作
*/
mysql> drop table table2; -- 删除表table2
Query OK, 0 rows affected (0.54 sec)
mysql> show tables; -- 查看当前数据库的表可见table2已被删除
+---------------+
| Tables_in_db1 |
+---------------+
| table1 |
+---------------+
1 row in set (0.00 sec)
mysql> drop table table2; -- 表不存在的情况下执行drop操作会报错
ERROR 1051 (42S02): Unknown table 'db1.table2'
mysql> drop table if exists table2; -- 删除操作加判断
Query OK, 0 rows affected, 1 warning (0.09 sec)
Date Manipulation Language,数据操作语言,主要涉及数据增(insert)删(delete)改(update)。
5.1 增加数据
/* 增加数据:
1. insert into table1 values(列值1,列值2,...); -- 列值需要与table1的列顺序一一对应
2. insert into table1(列名1, 列名2,...) values(列值1,列值2,...); -- 指定添加某些列的一条表数据
注意:数值类型直接写,其他类型需要加单引号/双引号
*/
mysql> insert into table1 values(1001,'zhangsan','女',123.1,'1997-12-15');
Query OK, 1 row affected (0.20 sec)
mysql> select * from table1;
+------+----------+------+-------+------------+
| id | name | sex | score | birthday |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女 | 123.1 | 1997-12-15 |
+------+----------+------+-------+------------+
1 row in set (0.07 sec)
mysql> insert into table1(id,name,sex) values(1002,'lisi','男');
Query OK, 1 row affected (0.18 sec)
mysql> select * from table1;
+------+----------+------+-------+------------+
| id | name | sex | score | birthday |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女 | 123.1 | 1997-12-15 |
| 1002 | lisi | 男 | NULL | NULL |
+------+----------+------+-------+------------+
2 rows in set (0.00 sec)
5.2 修改数据
/* 修改表数据:
1. update table1 set 列名1=列值1, 列名2=列值2,... where 条件; -- where条件用来筛选表条目,给指定条目修改数据
2. update table1 set 列名1=列值1, 列名2=列值2,...; -- 不加where条件即给全表数据更新
注:一般update操作都需要加where条件已保证表数据的有效性
*/
mysql> update table1 set score=124.4 where id = 1002; -- 更新id=1002的表数据score
Query OK, 1 row affected (0.16 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from table1; -- 查看表数据1002的score更新(原本为NULL)
+------+----------+------+-------+------------+
| id | name | sex | score | birthday |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女 | 123.1 | 1997-12-15 |
| 1002 | lisi | 男 | 124.4 | NULL |
+------+----------+------+-------+------------+
2 rows in set (0.00 sec)
mysql> update table1 set birthday='1999-9-9'; -- 不加where条件全表数据更新
Query OK, 2 rows affected (0.14 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from table1; -- 查看发现所有表数据的birthday更新
+------+----------+------+-------+------------+
| id | name | sex | score | birthday |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女 | 123.1 | 1999-09-09 |
| 1002 | lisi | 男 | 124.4 | 1999-09-09 |
+------+----------+------+-------+------------+
2 rows in set (0.00 sec)
5.3 删除数据
/* 删除表数据:
1. delete from table1 where 条件; -- 删除满足条件的表数据
2. delete from table1; -- 删除所有表数据
3. truncate table table1; -- 清空表数据,保留表结构(相当于delete不加where)
4. drop table table1; --删除表及表数据(DDL操作)
注:实际应用中都要加where条件已保证数据的完整性(以防误删错删)
*/
mysql> delete from table1 where id=1002; -- 删除id=1002的表条目/元组
Query OK, 1 row affected (0.16 sec)
mysql> select * from table1; -- 查看表id=1002的数据删除
+------+----------+------+-------+------------+
| id | name | sex | score | birthday |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女 | 123.1 | 1999-09-09 |
+------+----------+------+-------+------------+
1 row in set (0.00 sec)
mysql> insert into table1 values( -- 新增加一条数据
-> 1004,'lilei','男',124.4,'1998-12-3');
Query OK, 1 row affected (0.14 sec)
mysql> select * from table1;
+------+----------+------+-------+------------+
| id | name | sex | score | birthday |
+------+----------+------+-------+------------+
| 1001 | zhangsan | 女 | 123.1 | 1999-09-09 |
| 1004 | lilei | 男 | 124.4 | 1998-12-03 |
+------+----------+------+-------+------------+
2 rows in set (0.00 sec)
mysql> delete from table1; -- 不加where条件删除所有表数据
Query OK, 2 rows affected (0.22 sec)
mysql> select * from table1; -- 查看表数据全被删除
Empty set (0.00 sec)
mysql> truncate table table1; -- 清空表table1
Query OK, 0 rows affected (1.04 sec)
mysql> show tables; -- 表结构保留
+---------------+
| Tables_in_db1 |
+---------------+
| table1 |
+---------------+
1 row in set (0.00 sec)
mysql> desc table1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(4) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> select * from table1; -- 表数据清空
Empty set (0.00 sec)
mysql> drop table table1;
Query OK, 0 rows affected (0.33 sec)
mysql> show tables;
Empty set (0.04 sec)
Data Query Language,数据查询语言,涉及数据查询操作(select)
select [distinct] 查询目标 [as 别名]
from table_name [as 别名]
where 条件
group by 分组依据
having 分组后条件
order by 排序依据
limit 起始索引,偏移量
6.1 普通全查询
/* 普通全查询:不加where条件
1. select * from table_name;
2. select 列名1,列名2,... from table_name;
*/
mysql> select * from table1;
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1001 | zhangsan | 女 |
| 1002 | lisi | 男 |
| 1003 | wangwu | 男 |
| 1004 | leilei | 男 |
+------+----------+------+
4 rows in set (0.21 sec)
mysql> select id,name from table1;
+------+----------+
| id | name |
+------+----------+
| 1001 | zhangsan |
| 1002 | lisi |
| 1003 | wangwu |
| 1004 | leilei |
+------+----------+
4 rows in set (0.00 sec)
6.2 普通条件查询
/* 普通条件查询: 加where条件
1. select * from table_name where 条件;
2. select 列名1,列名2,... from table_name where 条件;
3. 想让结果唯一无重复值,加distinct关键字
select distinct 列名1,列名2,... from table_name where 条件;
4. 对列名,表名起别名,加as关键字(可省略)
select 列名1 as 新列名1,列名2 新列名2,... from table_name [as] table_newName where 条件;
*/
mysql> select * from table1 where sex='女';
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1001 | zhangsan | 女 |
+------+----------+------+
1 row in set (0.03 sec)
mysql> select id,name from table1 where id=1002;
+------+------+
| id | name |
+------+------+
| 1002 | lisi |
+------+------+
1 row in set (0.00 sec)
mysql> select distinct sex from table1;
+------+
| sex |
+------+
| 女 |
| 男 |
+------+
2 rows in set (0.11 sec)
mysql> select sex 性别, name as 姓名 from table1 表;
+------+----------+
| 性别 | 姓名 |
+------+----------+
| 女 | zhangsan |
| 男 | lisi |
| 男 | wangwu |
| 男 | leilei |
+------+----------+
4 rows in set (0.01 sec)
6.3 分组查询
/* 分组查询:
1. select 查询目标 from table_name group by 分组条件;
2. select 查询目标 from table_name group by 分组条件 having 分组后的条件; -- 分组后对分组结果继续条件查询
*/
mysql> select count(*) from table1 group by sex;
+----------+
| count(*) |
+----------+
| 1 |
| 3 |
+----------+
2 rows in set (0.07 sec)
mysql> select * from table1 group by sex having name like '%l%';
+------+------+------+
| id | name | sex |
+------+------+------+
| 1002 | lisi | 男 |
+------+------+------+
1 row in set (0.00 sec)
6.4 排序查询
/* 排序查询:
1. select 查询目标 from table_name order by 排序依据; -- 默认升序排列
2. select 查询目标 from table_name order by 排序依据 asc; --升序排列
3. select 查询目标 from table_name order by 排序依据 desc; --降序排列
*/
mysql> select * from table1 order by id;
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1001 | zhangsan | 女 |
| 1002 | lisi | 男 |
| 1003 | wangwu | 男 |
| 1004 | leilei | 男 |
+------+----------+------+
4 rows in set (0.08 sec)
mysql> select * from table1 order by id desc;
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1004 | leilei | 男 |
| 1003 | wangwu | 男 |
| 1002 | lisi | 男 |
| 1001 | zhangsan | 女 |
+------+----------+------+
4 rows in set (0.00 sec)
6.5 聚合函数
6.6 分页查询
/* 分页查询:
select 查询目标 from table_name limit 起始索引,偏移量;
注:起始索引 = (页码 - 1) * 偏移量
*/
mysql> select * from table1 limit 0,2; -- 第一页 0=(1-0)*2
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1001 | zhangsan | 女 |
| 1002 | lisi | 男 |
+------+----------+------+
2 rows in set (0.00 sec)
mysql> select * from table1 limit 2,2; -- 第二页 2=(2-1)*2
+------+--------+------+
| id | name | sex |
+------+--------+------+
| 1003 | wangwu | 男 |
| 1004 | leilei | 男 |
+------+--------+------+
2 rows in set (0.00 sec)
注:如果查询结果不想要null值,可使用ifnull函数将null值转为给定的值
mysql> insert into table1 values(1005,'lihua',null);
Query OK, 1 row affected (0.31 sec)
mysql> select * from table1;
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1001 | zhangsan | 女 |
| 1002 | lisi | 男 |
| 1003 | wangwu | 男 |
| 1004 | leilei | 男 |
| 1005 | lihua | NULL |
+------+----------+------+
5 rows in set (0.00 sec)
mysql> select id,name,ifnull(sex,'男') from table1;
+------+----------+------------------+
| id | name | ifnull(sex,'男') |
+------+----------+------------------+
| 1001 | zhangsan | 女 |
| 1002 | lisi | 男 |
| 1003 | wangwu | 男 |
| 1004 | leilei | 男 |
| 1005 | lihua | 男 |
+------+----------+------------------+
5 rows in set (0.08 sec)
Data Control Language,数据控制语言,涉及用户管理和权限管理
7.1 用户管理
/* 查看用户:
1. use mysql; -- 切换到mysql数据库
2. select * from user; -- 查询mysql数据库下的user表
*/
mysql> use mysql;
Database changed
mysql> select * from user;
+-----------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+-------
| Host | User | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin | authentication_string | password_expired | password_last_changed | password_lifetime | account_locked | Create_role_priv | Drop_role_priv | Password_reuse_history | Password_reuse_time | Password_require_current | User_attributes |
+-----------+------------------+-------------+-------------+-------------+-------------+-
/* 创建用户: create user 'user_name'@'ip' identified by '密码'; */
mysql> create user 'user1'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.52 sec)
/* 修改密码: alter user 'user_name'@'ip' identified with mysql_native_password by '新密码'; */
mysql> alter user 'user1'@'localhost' identified with mysql_native_password by '123';
Query OK, 0 rows affected (0.24 sec)
/* 删除用户: drop user 'user_name'@'ip'; */
mysql> drop user 'user1'@'localhost';
Query OK, 0 rows affected (0.41 sec)
7.2 权限管理
/* 查看用户权限: show grants for 'user_name'@'ip'; */
show grants for 'user1'@'localhost';
+-------------------------------------------+
| Grants for user1@localhost |
+-------------------------------------------+
| GRANT USAGE ON *.* TO `user1`@`localhost` |
+-------------------------------------------+
1 row in set (0.08 sec)
/* 授予用户权限:
1. grant 权限 on 数据库名.表名 to 'user_name'@'ip'; -- 给user_name赋予对某个数据库的某个表的某些权限
2. grant all on *.* to 'user_name'@'ip'; -- 授予user_name对所有数据库的所有表的所有权限
*/
mysql> grant select on *.* to 'user1'@'localhost'; -- 授予user1对所有数据库及表的select权限
Query OK, 0 rows affected (0.22 sec)
mysql> show grants for 'user1'@'localhost'; -- 查看user1用户对所有数据库及表由select权限
+--------------------------------------------+
| Grants for user1@localhost |
+--------------------------------------------+
| GRANT SELECT ON *.* TO `user1`@`localhost` |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql> grant all on *.* to 'user1'@'localhost'; -- 授予user1用户所有权限
Query OK, 0 rows affected (0.20 sec)
mysql> show grants for 'user1'@'localhost';
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for user1@localhost |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `user1`@`localhost` |
| GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `user1`@`localhost` |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
/* 撤销用户权限:
1. revoke 权限 on 数据库.数据表 from 'user_name'@'ip'; -- 撤销用户user_name对于指定数据库的数据表的某些权限
2. revoke all on *.* from 'user_name'@'ip'; -- 撤销用户user_name对所有数据库及表的所有权限
*/
mysql> revoke select on *.* from 'user1'@'localhost'; -- 撤销user1用户的select权限
Query OK, 0 rows affected (0.15 sec)
mysql> show grants for 'user1'@'localhost'; -- 查看可见用户user1的select权限被撤销,已不具有select权限
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for user1@localhost |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `user1`@`localhost` |
| GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `user1`@`localhost` |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> revoke all on *.* from 'user1'@'localhost'; -- 撤销user1用户的所有权限
Query OK, 0 rows affected (0.17 sec)
mysql> show grants for 'user1'@'localhost'; -- 查看可见用户user1的所有权限被撤销
+-------------------------------------------+
| Grants for user1@localhost |
+-------------------------------------------+
| GRANT USAGE ON *.* TO `user1`@`localhost` |
+-------------------------------------------+
1 row in set (0.00 sec)
8.1 主键约束
mysql> create table table2(
-> id int primary key, -- 创建表时加主键约束
-> name varchar(20));
Query OK, 0 rows affected (1.41 sec)
mysql> desc table2; -- 查看表主键约束已加(默认not null)
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.14 sec)
mysql> alter table table2 drop primary key; -- 删除主键约束
Query OK, 0 rows affected (2.28 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table2; -- 查看主键约束已被删除,但是列依旧not null
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.13 sec)
mysql> alter table table2 modify id int primary key; -- 创建表后添加主键约束
Query OK, 0 rows affected (1.42 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.10 sec)
mysql> create table table3(
-> id int primary key auto_increment); -- 主键自动增长auto_increment
Query OK, 0 rows affected (0.64 sec)
mysql> desc table3;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.07 sec)
mysql> alter table table3 modify id int; -- 删除自动增长约束
Query OK, 0 rows affected (1.39 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> alter table table3 modify id int auto_increment; -- 创建表之后添加自动增长约束
Query OK, 0 rows affected (2.16 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table3;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.00 sec)
8.2 非空约束
mysql> create table table3(
-> id int not null); -- 创建表时增加not null约束
Query OK, 0 rows affected (0.71 sec)
mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> alter table table3 modify id int; -- 删除not null约束
Query OK, 0 rows affected (1.70 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.04 sec)
mysql> alter table table3 modify id int not null; -- 创建表之后添加not null约束
Query OK, 0 rows affected (2.23 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
8.3 唯一约束
mysql> create table table3(
-> id int unique); -- 创建表时添加unique约束
Query OK, 0 rows affected (0.66 sec)
mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | UNI | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> alter table table3 drop index id; -- 删除unique约束
Query OK, 0 rows affected (0.26 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> alter table table3 modify id int unique; -- 创建表后增加unique约束
Query OK, 0 rows affected (0.43 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table3;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | UNI | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
8.4 外键约束
constraint 外键约束名称 foreign key thisTable_name(thisTable_qualifierName) references 外表名(外表键);
mysql> create table table4(
-> id int, -- 注意有逗号
-> constraint table4_ibfk_1 foreign key table4(id) references table3(id)); -- 创建表时加foreign key约束
Query OK, 0 rows affected (0.69 sec)
mysql> desc table4;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> alter table table4 drop foreign key table4_ibfk_1; -- 删除某个外键约束
Query OK, 0 rows affected (0.33 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table table4 add constraint table4_fk foreign key table4(id) references table3(id); -- 创建表后添加foreign key约束
Query OK, 0 rows affected (2.24 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc table4;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
第一范式1NF:表中每个列都是不可分割的(存在问题:数据冗余;添加数据无效;删除数据会连带删除有效数据)
第二范式2NF:表中每个列都完全依赖于主键(存在问题:添加数据无效;删除数据连带删除有效数据) 对1NF的表拆表
第三范式3NF:表中不存在传递依赖,满足3NF的基本满足业务开发表设计需求。 对2NF的表拆表
mysql> select * from table1;
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1001 | zhangsan | 女 |
| 1002 | lisi | 男 |
| 1003 | wangwu | 男 |
| 1004 | leilei | 男 |
| 1005 | lihua | NULL |
+------+----------+------+
5 rows in set (0.08 sec)
mysql> start transaction; -- 开启事务
Query OK, 0 rows affected (0.00 sec)
mysql> update table1 set sex='男' where id = 1005; -- 更新表数据
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from table1;
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1001 | zhangsan | 女 |
| 1002 | lisi | 男 |
| 1003 | wangwu | 男 |
| 1004 | leilei | 男 |
| 1005 | lihua | 男 |
+------+----------+------+
5 rows in set (0.00 sec)
mysql> rollback; -- 回滚
Query OK, 0 rows affected (0.06 sec)
mysql> select * from table1; -- 之前事务执行无效
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1001 | zhangsan | 女 |
| 1002 | lisi | 男 |
| 1003 | wangwu | 男 |
| 1004 | leilei | 男 |
| 1005 | lihua | NULL |
+------+----------+------+
5 rows in set (0.00 sec)
mysql> update table1 set sex='男' where id = 1005;
Query OK, 1 row affected (0.18 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit; -- 提交事务
Query OK, 0 rows affected (0.00 sec)
mysql> select * from table1; -- 事务执行有效
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1001 | zhangsan | 女 |
| 1002 | lisi | 男 |
| 1003 | wangwu | 男 |
| 1004 | leilei | 男 |
| 1005 | lihua | 男 |
+------+----------+------+
5 rows in set (0.00 sec)
表与表的关系就三种:1:1、1:N、N:N。fubiao
对于1:1(例如居民与居民身份证号),一般会整成一张表,有时候为了业务需求会分别建表(比如其中一张表数据与其他表密切关联等)
对于1:N(例如部门与员工),使用外键关联,1对应父表,N对应子表。constraint foreign_relation_name foreign key 子表(列名) conferences 父表(列名)
对于N:N(例如学生与课程),会创建一个关联表,拆分为两个1:N的关系,一般两个表的主键会成为关联表的组合主键(同时也是关联表的外键)
注:子表外键的列属性需要和父表关联的列属性保持一致
多表联查符合笛卡尔积运算:如果table_A中共3条数据,table_B中共2条数据,那么select * from table_A,table_B结果共有3*2=6条数据(可能结果中有不正确的数据,所以需要消除无用的数据)
多表查询一般分为内连接查询、外连接查询和全连接查询。
12.1 内连接查询
内连接查询 = where条件查询 select 查询目标 from table1 [inner] join table2 on 查询条件;
mysql> select * from table1;
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1001 | zhangsan | 女 |
| 1002 | lisi | 男 |
| 1003 | wangwu | 男 |
| 1004 | leilei | 男 |
| 1005 | lihua | 男 |
+------+----------+------+
5 rows in set (0.00 sec)
mysql> select * from table2;
+------+----------+
| id | name |
+------+----------+
| 1001 | zhangsan |
| 1002 | lisi |
| 1002 | NULL |
| NULL | leilei |
+------+----------+
mysql> select
-> table1.id ID号, -- ID
-> table1.name as 姓名
-> from table1,table2
-> where table1.id=table2.id;
+------+----------+
| ID号 | 姓名 |
+------+----------+
| 1001 | zhangsan |
| 1002 | lisi |
| 1003 | wangwu |
+------+----------+
3 rows in set (0.00 sec)
mysql> select * from table1 inner join table2 on table1.id = table2.id;
+------+----------+------+------+----------+
| id | name | sex | id | name |
+------+----------+------+------+----------+
| 1001 | zhangsan | 女 | 1001 | zhangsan |
| 1002 | lisi | 男 | 1002 | lisi |
| 1003 | wangwu | 男 | 1003 | NULL |
+------+----------+------+------+----------+
3 rows in set (0.00 sec)
mysql> select * from table2 join table1 on table1.id = table2.id;
+------+----------+------+----------+------+
| id | name | id | name | sex |
+------+----------+------+----------+------+
| 1001 | zhangsan | 1001 | zhangsan | 女 |
| 1002 | lisi | 1002 | lisi | 男 |
| 1003 | NULL | 1003 | wangwu | 男 |
+------+----------+------+----------+------+
3 rows in set (0.00 sec)
12.2 外连接查询
mysql> select * from table1;
+------+----------+------+
| id | name | sex |
+------+----------+------+
| 1001 | zhangsan | 女 |
| 1002 | lisi | 男 |
| 1003 | wangwu | 男 |
| 1004 | leilei | 男 |
| 1005 | lihua | 男 |
| 1007 | NULL | NULL |
+------+----------+------+
6 rows in set (0.00 sec)
mysql> select * from table2;
+------+----------+
| id | name |
+------+----------+
| 1001 | zhangsan |
| NULL | leilei |
| 1002 | lisi |
| 1003 | NULL |
+------+----------+
4 rows in set (0.00 sec)
mysql> select * from table1 left join table2 on table1.id = table2.id; -- 左外连接,结果为左表及交集部分(右表没有的加null)
+------+----------+------+------+----------+
| id | name | sex | id | name |
+------+----------+------+------+----------+
| 1001 | zhangsan | 女 | 1001 | zhangsan |
| 1002 | lisi | 男 | 1002 | lisi |
| 1003 | wangwu | 男 | 1003 | NULL |
| 1004 | leilei | 男 | NULL | NULL |
| 1005 | lihua | 男 | NULL | NULL |
| 1007 | NULL | NULL | NULL | NULL |
+------+----------+------+------+----------+
6 rows in set (0.00 sec)
mysql> select * from table1 right join table2 on table1.id = table2.id; -- 右外连接,结果有右表及交集部分(左表没有的加null)
+------+----------+------+------+----------+
| id | name | sex | id | name |
+------+----------+------+------+----------+
| 1001 | zhangsan | 女 | 1001 | zhangsan |
| 1002 | lisi | 男 | 1002 | lisi |
| 1003 | wangwu | 男 | 1003 | NULL |
| NULL | NULL | NULL | NULL | leilei |
+------+----------+------+------+----------+
4 rows in set (0.00 sec)
12.3 全连接查询 union MySQL本身不支持全连接,可使用union连接左连接和右连接间接实现全连接
mysql> select * from table1 left join table2 on table1.id = table2.id
-> union
-> select * from table1 right join table2 on table1.id = table2.id;
+------+----------+------+------+----------+
| id | name | sex | id | name |
+------+----------+------+------+----------+
| 1001 | zhangsan | 女 | 1001 | zhangsan |
| 1002 | lisi | 男 | 1002 | lisi |
| 1003 | wangwu | 男 | 1003 | NULL |
| 1004 | leilei | 男 | NULL | NULL |
| 1005 | lihua | 男 | NULL | NULL |
| 1007 | NULL | NULL | NULL | NULL |
| NULL | NULL | NULL | NULL | leilei |
+------+----------+------+------+----------+
7 rows in set (0.11 sec)
数据库的备份:mysqldump -u 用户名 -p 数据库名 [数据表名] > 备份路径xx.sql
数据库的还原:source xxx.sql
不同版本mysql命令可能有所差异,学会使用help进行查看。此篇博客中使用shell命令进行操作,实际开发推荐直接使用MySQL Workbench可视化开发工具简化开发(可视化点击操作完成数据库、数据表的操作,同时也支持SQL命令)。
关于MySQL的触发器、存储引擎、视图、存储过程、索引等知识点后续进行持续更新。
知识系统体系的学习很重要,多理解基础概念和底层原理,及时总结。