上传文件至 /

This commit is contained in:
wxin 2024-08-14 21:41:48 +08:00
parent e7138b2152
commit d9bc1fa5ec
4 changed files with 3199 additions and 0 deletions

View File

@ -0,0 +1,975 @@
<h1><center>数据库查询</center></h1>
------
## 一:基本查询
#### 1.简介
单表查询
简单查询
通过条件查询
查询排序
限制查询记录数
使用集合函数查询
分组查询
使用正则表达式查询
#### 2.案例
创建案例所需表company.employee5
```shell
雇员编号 id int
雇员姓名 name varchar(30)
雇员性别 sex enum
雇用时期 hire_date date
职位 post varchar(50)
职位描述 job_description varchar(100)
薪水 salary double(15,2)
办公室 office int
部门编号 dep_id int
```
```shell
MySQL [(none)]> CREATE TABLE company.employee5(
id int primary key AUTO_INCREMENT not null,
name varchar(30) not null,
sex enum('male','female') default 'male' not null,
hire_date date not null,
post varchar(50) not null,
job_description varchar(100),
salary double(15,2) not null,
office int,
dep_id int
);
```
插入模拟数据:
```shell
MySQL [(none)]> insert into company.employee5(name,sex,hire_date,post,job_description,salary,office,dep_id) values
('jack','male','20180202','instructor','teach',5000,501,100),
('tom','male','20180203','instructor','teach',5500,501,100),
('robin','male','20180202','instructor','teach',8000,501,100),
('alice','female','20180202','instructor','teach',7200,501,100),
('','male','20180202','hr','hrcc',600,502,101),
('harry','male','20180202','hr',NULL,6000,502,101),
('emma','female','20180206','sale','salecc',20000,503,102),
('christine','female','20180205','sale','salecc',2200,503,102),
('zhuzhu','male','20180205','sale',NULL,2200,503,102),
('gougou','male','20180205','sale','',2200,503,102);
```
语法格式:
select 字段名称,字段名称2...... from 表名 [条件]
##### a.简单查询
```shell
MySQL [company]> select * from employee5;
+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+
| id | name | sex | hire_date | post | job_description | salary | office | dep_id |
+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+
| 1 | jack | male | 2018-02-02 | instructor | teach | 5000.00 | 501 | 100 |
| 2 | tom | male | 2018-02-03 | instructor | teach | 5500.00 | 501 | 100 |
| 3 | robin | male | 2018-02-02 | instructor | teach | 8000.00 | 501 | 100 |
| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 |
| 5 | | male | 2018-02-02 | hr | hrcc | 600.00 | 502 | 101 |
| 6 | harry | male | 2018-02-02 | hr | NULL | 6000.00 | 502 | 101 |
| 7 | emma | female | 2018-02-06 | sale | salecc | 20000.00 | 503 | 102 |
| 8 | christine | female | 2018-02-05 | sale | salecc | 2200.00 | 503 | 102 |
| 9 | zhuzhu | male | 2018-02-05 | sale | NULL | 2200.00 | 503 | 102 |
| 10 | gougou | male | 2018-02-05 | sale | | 2200.00 | 503 | 102 |
+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+
10 rows in set (0.00 sec)
MySQL [company]> select name, salary, dep_id from employee5 where id <=5;
+-------+---------+--------+
| name | salary | dep_id |
+-------+---------+--------+
| jack | 5000.00 | 100 |
| tom | 5500.00 | 100 |
| robin | 8000.00 | 100 |
| alice | 7200.00 | 100 |
| | 600.00 | 101 |
+-------+---------+--------+
5 rows in set (0.00 sec)
```
##### b.避免重复
不能部分使用DISTINCT通常仅用于某一字段
```shell
MySQL [company]> SELECT post FROM employee5;
+------------+
| post |
+------------+
| instructor |
| instructor |
| instructor |
| instructor |
| hr |
| hr |
| sale |
| sale |
| sale |
| sale |
+------------+
10 rows in set (0.00 sec)
MySQL [company]> SELECT distinct post FROM employee5;
+------------+
| post |
+------------+
| instructor |
| hr |
| sale |
+------------+
3 rows in set (0.00 sec)
```
##### c.四则运算查询
```shell
MySQL [company]> SELECT name, salary, salary*14 FROM employee5;
+-----------+----------+-----------+
| name | salary | salary*14 |
+-----------+----------+-----------+
| jack | 5000.00 | 70000.00 |
| tom | 5500.00 | 77000.00 |
| robin | 8000.00 | 112000.00 |
| alice | 7200.00 | 100800.00 |
| | 600.00 | 8400.00 |
| harry | 6000.00 | 84000.00 |
| emma | 20000.00 | 280000.00 |
| christine | 2200.00 | 30800.00 |
| zhuzhu | 2200.00 | 30800.00 |
| gougou | 2200.00 | 30800.00 |
+-----------+----------+-----------+
10 rows in set (0.01 sec)
MySQL [company]> SELECT name, salary, salary*14 AS Annual_salary FROM employee5;
+-----------+----------+---------------+
| name | salary | Annual_salary |
+-----------+----------+---------------+
| jack | 5000.00 | 70000.00 |
| tom | 5500.00 | 77000.00 |
| robin | 8000.00 | 112000.00 |
| alice | 7200.00 | 100800.00 |
| | 600.00 | 8400.00 |
| harry | 6000.00 | 84000.00 |
| emma | 20000.00 | 280000.00 |
| christine | 2200.00 | 30800.00 |
| zhuzhu | 2200.00 | 30800.00 |
| gougou | 2200.00 | 30800.00 |
+-----------+----------+---------------+
10 rows in set (0.00 sec)
MySQL [company]> SELECT name, salary, salary*14 Annual_salary FROM employee5;
+-----------+----------+---------------+
| name | salary | Annual_salary |
+-----------+----------+---------------+
| jack | 5000.00 | 70000.00 |
| tom | 5500.00 | 77000.00 |
| robin | 8000.00 | 112000.00 |
| alice | 7200.00 | 100800.00 |
| | 600.00 | 8400.00 |
| harry | 6000.00 | 84000.00 |
| emma | 20000.00 | 280000.00 |
| christine | 2200.00 | 30800.00 |
| zhuzhu | 2200.00 | 30800.00 |
| gougou | 2200.00 | 30800.00 |
+-----------+----------+---------------+
10 rows in set (0.00 sec)
```
##### d.定义显示格式
CONCAT() 函数用于连接字符串
```shell
MySQL [company]> SELECT concat(name, 's annual salary: ', salary*14) AS Annual_salary FROM employee5;
+------------------------------------+
| Annual_salary |
+------------------------------------+
| jacks annual salary: 70000.00 |
| toms annual salary: 77000.00 |
| robins annual salary: 112000.00 |
| alices annual salary: 100800.00 |
| s annual salary: 8400.00 |
| harrys annual salary: 84000.00 |
| emmas annual salary: 280000.00 |
| christines annual salary: 30800.00 |
| zhuzhus annual salary: 30800.00 |
| gougous annual salary: 30800.00 |
+------------------------------------+
10 rows in set (0.00 sec)
```
##### e.单条件查询
```shell
MySQL [company]> SELECT name,post FROM employee5 WHERE post='hr';
+-------+------+
| name | post |
+-------+------+
| | hr |
| harry | hr |
+-------+------+
2 rows in set (0.00 sec)
```
##### f.多条件查询
```shell
MySQL [company]> SELECT name,salary FROM employee5 WHERE post='hr' AND salary>10000;
Empty set (0.00 sec)
MySQL [company]> select * from employee5 where salary>5000 and salary<10000 or dep_id=102;
+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+
| id | name | sex | hire_date | post | job_description | salary | office | dep_id |
+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+
| 2 | tom | male | 2018-02-03 | instructor | teach | 5500.00 | 501 | 100 |
| 3 | robin | male | 2018-02-02 | instructor | teach | 8000.00 | 501 | 100 |
| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 |
| 6 | harry | male | 2018-02-02 | hr | NULL | 6000.00 | 502 | 101 |
| 7 | emma | female | 2018-02-06 | sale | salecc | 20000.00 | 503 | 102 |
| 8 | christine | female | 2018-02-05 | sale | salecc | 2200.00 | 503 | 102 |
| 9 | zhuzhu | male | 2018-02-05 | sale | NULL | 2200.00 | 503 | 102 |
| 10 | gougou | male | 2018-02-05 | sale | | 2200.00 | 503 | 102 |
+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+
8 rows in set (0.00 sec)
```
##### g.关键字
BETWEEN AND
```shell
MySQL [company]> SELECT name,salary FROM employee5 WHERE salary BETWEEN 5000 AND 15000;
+-------+---------+
| name | salary |
+-------+---------+
| jack | 5000.00 |
| tom | 5500.00 |
| robin | 8000.00 |
| alice | 7200.00 |
| harry | 6000.00 |
+-------+---------+
5 rows in set (0.00 sec)
MySQL [company]> SELECT name,salary FROM employee5 WHERE salary NOT BETWEEN 5000 AND 15000;
+-----------+----------+
| name | salary |
+-----------+----------+
| | 600.00 |
| emma | 20000.00 |
| christine | 2200.00 |
| zhuzhu | 2200.00 |
| gougou | 2200.00 |
+-----------+----------+
5 rows in set (0.00 sec)
```
IS NULL
```shell
MySQL [company]> SELECT name,job_description FROM employee5 WHERE job_description IS NULL;
+--------+-----------------+
| name | job_description |
+--------+-----------------+
| harry | NULL |
| zhuzhu | NULL |
+--------+-----------------+
2 rows in set (0.00 sec)
MySQL [company]> SELECT name,job_description FROM employee5 WHERE job_description IS NOT NULL;
+-----------+-----------------+
| name | job_description |
+-----------+-----------------+
| jack | teach |
| tom | teach |
| robin | teach |
| alice | teach |
| | hrcc |
| emma | salecc |
| christine | salecc |
| gougou | |
+-----------+-----------------+
8 rows in set (0.00 sec)
MySQL [company]> SELECT name,job_description FROM employee5 WHERE job_description='';
+--------+-----------------+
| name | job_description |
+--------+-----------------+
| gougou | |
+--------+-----------------+
1 row in set (0.00 sec)
```
注意NULL说明
等价于没有任何值、是未知数
NULL与0、空字符串、空格都不同,NULL没有分配存储空间
对空值做加、减、乘、除等运算操作,结果仍为空
比较时使用关键字用“is null”和“is not null”
排序时比其他数据都小索引默认是降序排列小→大所以NULL值总是排在最前
IN集合查询
```shell
MySQL [company]> SELECT name, salary FROM employee5 WHERE salary=4000 OR salary=5000 OR salary=6000 OR salary=9000 ;
+-------+---------+
| name | salary |
+-------+---------+
| jack | 5000.00 |
| harry | 6000.00 |
+-------+---------+
2 rows in set (0.00 sec)
MySQL [company]> SELECT name, salary FROM employee5 WHERE salary IN (4000,5000,6000,9000) ;
+-------+---------+
| name | salary |
+-------+---------+
| jack | 5000.00 |
| harry | 6000.00 |
+-------+---------+
2 rows in set (0.00 sec)
MySQL [company]> SELECT name, salary FROM employee5 WHERE salary NOT IN (4000,5000,6000,9000) ;
+-----------+----------+
| name | salary |
+-----------+----------+
| tom | 5500.00 |
| robin | 8000.00 |
| alice | 7200.00 |
| | 600.00 |
| emma | 20000.00 |
| christine | 2200.00 |
| zhuzhu | 2200.00 |
| gougou | 2200.00 |
+-----------+----------+
8 rows in set (0.01 sec)
```
##### h.模糊查询
关键字LIKE
通配符%:所有字符
通配符_ 一个字符
```shell
MySQL [company]> SELECT * FROM employee5 WHERE name LIKE 'al%';
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
| id | name | sex | hire_date | post | job_description | salary | office | dep_id |
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 |
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
1 row in set (0.00 sec)
MySQL [company]> SELECT * FROM employee5 WHERE name LIKE 'al___';
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
| id | name | sex | hire_date | post | job_description | salary | office | dep_id |
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 |
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
1 row in set (0.00 sec)
```
##### i.排序查询
```shell
MySQL [company]> select name,salary from employee5 order by salary;
+-----------+----------+
| name | salary |
+-----------+----------+
| | 600.00 |
| christine | 2200.00 |
| zhuzhu | 2200.00 |
| gougou | 2200.00 |
| jack | 5000.00 |
| tom | 5500.00 |
| harry | 6000.00 |
| alice | 7200.00 |
| robin | 8000.00 |
| emma | 20000.00 |
+-----------+----------+
10 rows in set (0.01 sec)
MySQL [company]> select name,salary from employee5 order by salary desc;
+-----------+----------+
| name | salary |
+-----------+----------+
| emma | 20000.00 |
| robin | 8000.00 |
| alice | 7200.00 |
| harry | 6000.00 |
| tom | 5500.00 |
| jack | 5000.00 |
| christine | 2200.00 |
| zhuzhu | 2200.00 |
| gougou | 2200.00 |
| | 600.00 |
+-----------+----------+
MySQL [company]> select name,salary from employee5 order by salary desc limit 3; //控制显示前3行
+-------+----------+
| name | salary |
+-------+----------+
| emma | 20000.00 |
| robin | 8000.00 |
| alice | 7200.00 |
+-------+----------+
3 rows in set (0.00 sec)
MySQL [company]> select name,salary from employee5 order by salary desc limit 1,3; //从序号1开始显示三行的内容
+-------+---------+
| name | salary |
+-------+---------+
| robin | 8000.00 |
| alice | 7200.00 |
| harry | 6000.00 |
+-------+---------+
3 rows in set (0.00 sec)
```
注意:
ascending 美音 /ə'sɛndɪŋ/ 升序
descending 美音 /dɪ'sɛndɪŋ/ 降序
##### j.集合函数查询
count可以查看共有多少条记录
```shell
MySQL [company]> select count(*) from employee5;
+----------+
| count(*) |
+----------+
| 10 |
+----------+
1 row in set (0.00 sec)
MySQL [company]> select count(name) from employee5;
+-------------+
| count(name) |
+-------------+
| 10 |
+-------------+
1 row in set (0.00 sec)
```
max查看最大值
```shell
MySQL [company]> select max(salary) from employee5;
+-------------+
| max(salary) |
+-------------+
| 20000.00 |
+-------------+
1 row in set (0.00 sec)
```
min查看最小值
```shell
MySQL [company]> select min(salary) from employee5;
+-------------+
| min(salary) |
+-------------+
| 600.00 |
+-------------+
1 row in set (0.00 sec)
```
avg查看平均值
```shell
MySQL [company]> select avg(salary) from employee5;
+-------------+
| avg(salary) |
+-------------+
| 5890.000000 |
+-------------+
1 row in set (0.00 sec)
```
sum求和
sale这个部门的总工资
```shell
MySQL [company]> select concat("Total Department Wages",sum(salary)) from employee5 where post='sale';
+-------------------------------------------------+
| concat("Total Department Wages",sum(salary)) |
+-------------------------------------------------+
| Total Department Wages26600.00 |
+-------------------------------------------------+
1 row in set (0.00 sec)
```
获取薪水最高的这个人的详细信息
```shell
MySQL [company]> select * from employee5 where salary = (select max(salary) from employee5);
+----+------+--------+------------+------+-----------------+----------+--------+--------+
| id | name | sex | hire_date | post | job_description | salary | office | dep_id |
+----+------+--------+------------+------+-----------------+----------+--------+--------+
| 7 | emma | female | 2018-02-06 | sale | salecc | 20000.00 | 503 | 102 |
+----+------+--------+------------+------+-----------------+----------+--------+--------+
1 row in set (0.00 sec)
```
##### k.分组查询
GROUP BY和GROUP_CONCAT()函数一起使用
获取部门ID相同的员工并把名字拼接到一起
```shell
MySQL [company]> SELECT dep_id,GROUP_CONCAT(name) FROM employee5 GROUP BY dep_id;
+--------+------------------------------+
| dep_id | GROUP_CONCAT(name) |
+--------+------------------------------+
| 100 | jack,tom,robin,alice |
| 101 | ,harry |
| 102 | emma,christine,zhuzhu,gougou |
+--------+------------------------------+
3 rows in set (0.01 sec)
```
GROUP BY和集合函数一起使用
获取部门最高薪资
```shell
MySQL [company]> SELECT post,max(salary) FROM employee5 GROUP BY post;
+------------+-------------+
| post | max(salary) |
+------------+-------------+
| hr | 6000.00 |
| instructor | 8000.00 |
| sale | 20000.00 |
+------------+-------------+
3 rows in set (0.00 sec)
```
##### l.正则查询
```shell
以什么开头
MySQL [company]> SELECT * FROM employee5 WHERE name REGEXP '^ali';
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
| id | name | sex | hire_date | post | job_description | salary | office | dep_id |
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 |
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
1 row in set (0.00 sec)
以什么结尾
MySQL [company]> SELECT * FROM employee5 WHERE name REGEXP 'ce$';
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
| id | name | sex | hire_date | post | job_description | salary | office | dep_id |
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 |
+----+-------+--------+------------+------------+-----------------+---------+--------+--------+
1 row in set (0.01 sec)
连续出现n次
MySQL [company]> SELECT * FROM employee5 WHERE name REGEXP 'm{2}';
+----+------+--------+------------+------+-----------------+----------+--------+--------+
| id | name | sex | hire_date | post | job_description | salary | office | dep_id |
+----+------+--------+------------+------+-----------------+----------+--------+--------+
| 7 | emma | female | 2018-02-06 | sale | salecc | 20000.00 | 503 | 102 |
+----+------+--------+------------+------+-----------------+----------+--------+--------+
1 row in set (0.00 sec)
```
## 二:多表联合查询
【扩展了解】
#### 1.数据准备
##### 表company.employee6
创建表:
```shell
MySQL [company]> create table employee6(
emp_id int auto_increment primary key not null,
emp_name varchar(50),
age int,
dept_id int);
Query OK, 0 rows affected (0.65 sec)
```
查看表结构:
```shell
MySQL [company]> desc employee6;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| emp_id | int(11) | NO | PRI | NULL | auto_increment |
| emp_name | varchar(50) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| dept_id | int(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
```
插入模拟数据:
```shell
MySQL [company]> insert into employee6(emp_name,age,dept_id) values
('',19,200),
('tom',26,201),
('jack',30,201),
('alice',24,202),
('robin',40,200),
('xingdian',16,200),
('natasha',28,204);
```
查看数据:
```shell
MySQL [company]> select * from employee6;
+--------+----------+------+---------+
| emp_id | emp_name | age | dept_id |
+--------+----------+------+---------+
| 1 | | 19 | 200 |
| 2 | tom | 26 | 201 |
| 3 | jack | 30 | 201 |
| 4 | alice | 24 | 202 |
| 5 | robin | 40 | 200 |
| 6 | xingdian | 16 | 200 |
| 7 | natasha | 28 | 204 |
+--------+----------+------+---------+
7 rows in set (0.00 sec)
```
##### 表company.department6
创建表:
```shell
MySQL [company]> create table department6(
dept_id int,
dept_name varchar(100)
);
Query OK, 0 rows affected (0.33 sec)
```
查看表结构:
```shell
MySQL [company]> desc department6;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| dept_id | int(11) | YES | | NULL | |
| dept_name | varchar(100) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
```
模拟插入数据:
```shell
MySQL [company]> insert into department6 values
(200,'hr'),
(201,'it'),
(202,'sale'),
(203,'fd');
```
查看数据:
```shell
MySQL [company]> select * from department6;
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
| 200 | hr |
| 201 | it |
| 202 | sale |
| 203 | fd |
+---------+-----------+
4 rows in set (0.01 sec)
```
#### 2.多表的连接查询
交叉连接:生成笛卡尔积,它不使用任何匹配条件;交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合
内连接:只连接匹配的行
外连接
左连接:会显示左边表内所有的值,不论在右边表内匹不匹配
右连接:会显示右边表内所有的值,不论在左边表内匹不匹配
全外连接:包含左、右两个表的全部行
##### 交叉连接
```shell
MySQL [company]> select employee6.emp_name,employee6.age,employee6.dept_id,department6.dept_name from employee6,department6;
+----------+------+---------+-----------+
| emp_name | age | dept_id | dept_name |
+----------+------+---------+-----------+
| | 19 | 200 | hr |
| | 19 | 200 | it |
| | 19 | 200 | sale |
| | 19 | 200 | fd |
| tom | 26 | 201 | hr |
| tom | 26 | 201 | it |
| tom | 26 | 201 | sale |
| tom | 26 | 201 | fd |
| jack | 30 | 201 | hr |
| jack | 30 | 201 | it |
| jack | 30 | 201 | sale |
| jack | 30 | 201 | fd |
| alice | 24 | 202 | hr |
| alice | 24 | 202 | it |
| alice | 24 | 202 | sale |
| alice | 24 | 202 | fd |
| robin | 40 | 200 | hr |
| robin | 40 | 200 | it |
| robin | 40 | 200 | sale |
| robin | 40 | 200 | fd |
| xingdian | 16 | 200 | hr |
| xingdian | 16 | 200 | it |
| xingdian | 16 | 200 | sale |
| xingdian | 16 | 200 | fd |
| natasha | 28 | 204 | hr |
| natasha | 28 | 204 | it |
| natasha | 28 | 204 | sale |
| natasha | 28 | 204 | fd |
+----------+------+---------+-----------+
28 rows in set (0.00 sec)
```
##### 内连接
获取有部门的员工 (部门表中没有natasha所在的部门)
```shell
MySQL [company]> select employee6.emp_name,employee6.age,employee6.dept_id,department6.dept_name from employee6,department6 where employee6.dept_id=department6.dept_id;
+----------+------+---------+-----------+
| emp_name | age | dept_id | dept_name |
+----------+------+---------+-----------+
| | 19 | 200 | hr |
| tom | 26 | 201 | it |
| jack | 30 | 201 | it |
| alice | 24 | 202 | sale |
| robin | 40 | 200 | hr |
| xingdian | 16 | 200 | hr |
+----------+------+---------+-----------+
6 rows in set (0.00 sec)
MySQL [company]> select employee6.emp_name,department6.dept_name from employee6 inner join department6 on employee6.dept_id=department6.dept_id;
+----------+-----------+
| emp_name | dept_name |
+----------+-----------+
| | hr |
| tom | it |
| jack | it |
| alice | sale |
| robin | hr |
| xingdian | hr |
+----------+-----------+
6 rows in set (0.01 sec)
```
##### 外连接
语法:
SELECT 字段列表 FROM 表1 LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;
注意:
先用谁谁就是左
###### 左连接 left join
```shell
找出所有员工及所属的部门,包括没有部门的员工
MySQL [company]> select emp_id,emp_name,dept_name from employee6 left join department6 on employee6.dept_id = department6.dept_id;
+--------+----------+-----------+
| emp_id | emp_name | dept_name |
+--------+----------+-----------+
| 1 | | hr |
| 5 | robin | hr |
| 6 | xingdian | hr |
| 2 | tom | it |
| 3 | jack | it |
| 4 | alice | sale |
| 7 | natasha | NULL |
+--------+----------+-----------+
7 rows in set (0.00 sec)
```
###### 右连接right join
```
找出所有部门包含的员工,包括空部门
MySQL [company]> select emp_id,emp_name,dept_name from employee6 right join department6 on employee6.dept_id = department6.dept_id;
+--------+----------+-----------+
| emp_id | emp_name | dept_name |
+--------+----------+-----------+
| 1 | | hr |
| 2 | tom | it |
| 3 | jack | it |
| 4 | alice | sale |
| 5 | robin | hr |
| 6 | xingdian | hr |
| NULL | NULL | fd |
+--------+----------+-----------+
7 rows in set (0.00 sec)
```
##### 全外连接
```shell
MySQL [company]> select * from employee6 full join department6;
+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | | 19 | 200 | 200 | hr |
| 1 | | 19 | 200 | 201 | it |
| 1 | | 19 | 200 | 202 | sale |
| 1 | | 19 | 200 | 203 | fd |
| 2 | tom | 26 | 201 | 200 | hr |
| 2 | tom | 26 | 201 | 201 | it |
| 2 | tom | 26 | 201 | 202 | sale |
| 2 | tom | 26 | 201 | 203 | fd |
| 3 | jack | 30 | 201 | 200 | hr |
| 3 | jack | 30 | 201 | 201 | it |
| 3 | jack | 30 | 201 | 202 | sale |
| 3 | jack | 30 | 201 | 203 | fd |
| 4 | alice | 24 | 202 | 200 | hr |
| 4 | alice | 24 | 202 | 201 | it |
| 4 | alice | 24 | 202 | 202 | sale |
| 4 | alice | 24 | 202 | 203 | fd |
| 5 | robin | 40 | 200 | 200 | hr |
| 5 | robin | 40 | 200 | 201 | it |
| 5 | robin | 40 | 200 | 202 | sale |
| 5 | robin | 40 | 200 | 203 | fd |
| 6 | xingdian | 16 | 200 | 200 | hr |
| 6 | xingdian | 16 | 200 | 201 | it |
| 6 | xingdian | 16 | 200 | 202 | sale |
| 6 | xingdian | 16 | 200 | 203 | fd |
| 7 | natasha | 28 | 204 | 200 | hr |
| 7 | natasha | 28 | 204 | 201 | it |
| 7 | natasha | 28 | 204 | 202 | sale |
| 7 | natasha | 28 | 204 | 203 | fd |
+--------+----------+------+---------+---------+-----------+
28 rows in set (0.00 sec)
```
#### 3.复合条件连接查询
##### 案例一
找出公司所有部门中年龄大于25岁的员工
以内连接的方式查询employee6和department6表并且employee6表中的age字段值必须大于25
```shell
MySQL [company]> select emp_id,emp_name,dept_name FROM employee6,department6 WHERE employee6.dept_id = department6.dept_id AND age > 25;
+--------+----------+-----------+
| emp_id | emp_name | dept_name |
+--------+----------+-----------+
| 5 | robin | hr |
| 2 | tom | it |
| 3 | jack | it |
+--------+----------+-----------+
3 rows in set (0.01 sec)
```
##### 案例二
以内连接的方式查询employee6和department6表并且以age字段的升序方式显示
```shell
MySQL [company]> select emp_id,emp_name,dept_name FROM employee6,department6 WHERE employee6.dept_id = department6.dept_id ORDER BY age asc;
+--------+----------+-----------+
| emp_id | emp_name | dept_name |
+--------+----------+-----------+
| 6 | xingdian | hr |
| 1 | | hr |
| 4 | alice | sale |
| 2 | tom | it |
| 3 | jack | it |
| 5 | robin | hr |
+--------+----------+-----------+
```
#### 4.子查询
子查询是将一个查询语句嵌套在另一个查询语句中
内层查询语句的查询结果,可以为外层查询语句提供查询条件
子查询中可以包含IN、NOT IN等关键字还可以包含比较运算符= 、 !=、> 、<
##### 案例一
带IN关键字的子查询查询employee表但dept_id必须在department表中出现过
```shell
MySQL [company]> select * from employee6 WHERE dept_id IN (select dept_id FROM department6);
+--------+----------+------+---------+
| emp_id | emp_name | age | dept_id |
+--------+----------+------+---------+
| 1 | | 19 | 200 |
| 2 | tom | 26 | 201 |
| 3 | jack | 30 | 201 |
| 4 | alice | 24 | 202 |
| 5 | robin | 40 | 200 |
| 6 | xingdian | 16 | 200 |
+--------+----------+------+---------+
6 rows in set (0.00 sec)
```
##### 案例二
带比较运算符的子查询查询年龄大于等于25岁员工所在部门查询老龄化的部门
```shell
MySQL [company]> select dept_id,dept_name FROM department6 WHERE dept_id IN (SELECT DISTINCT dept_id FROM employee6 WHERE age >=25);
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
| 201 | it |
| 200 | hr |
+---------+-----------+
2 rows in set (0.00 sec)
```

View File

@ -0,0 +1,861 @@
<h1><center>数据库管理及数据类型</center></h1>
------
## 一:数据类型
#### 1.数值类型
##### 整数类型
整数类型TINYINT SMALLINT MEDIUMINT INT BIGINT
作用用于存储用户的年龄、游戏的Level、经验值等
![image-20220920124821420](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220920124821420.png)
##### 浮点数类型
浮点数类型FLOAT DOUBLE
作用:用于存储用户的身高、体重、薪水等
![image-20220920124919373](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220920124919373.png)
```shell
float(5,3) 5宽度 3精度
注意:
宽度不算小数点
宽度-精度=点前
案例:
MySQL [(none)]> create database diandian;
Query OK, 1 row affected (0.00 sec)
MySQL [(none)]> use diandian
Database changed
MySQL [diandian]> create table t1(id float(6,2));
Query OK, 0 rows affected (0.24 sec)
MySQL [diandian]> insert into t1 values('2.22');
```
##### 定点数类型
定点数类型DEC
定点数在MySQL内部以字符串形式存储比浮点数更精确适合用来表示货币等精度高的数据
##### 位类型
位类型BIT
BIT(M)可以用来存放多位二进制数M范围从1~64如果不写默认为1位
#### 2.字符串类型
CHAR系列 CHAR VARCHAR
TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB
BINARY系列 BINARY VARBINARY
![image-20220920132114919](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220920132114919.png)
##### 枚举类型
枚举类型:枚举列可以把一些不重复的字符串存储成一个预定义的集合
```shell
mysql> create table enum_table( e ENUM('fish','apple','dog'));
Query OK, 0 rows affected (0.35 sec)
mysql> insert into enum_table(e) values('fish');
Query OK, 1 row affected (0.11 sec)
mysql> select * from enum_table;
+------+
| e |
+------+
| fish |
+------+
1 row in set (0.00 sec)
mysql> insert into enum_table(e) values('nihao');
ERROR 1265 (01000): Data truncated for column 'e' at row 1
```
##### 时间和日期类型
时间和日期类型DATE TIME DATETIME TIMESTAMP YEAR
作用:用于存储用户的注册时间,文章的发布时间,文章的更新时间,员工的入职时间等
![image-20220920132630856](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220920132630856.png)
```shell
mysql> create table t8 (
id1 timestamp NOT NULL default CURRENT_TIMESTAMP,
id2 datetime default NULL
);
timestamp 类型的列还有个特性:默认情况下,在 insert, update 数据时timestamp 列会自动以当前时间CURRENT_TIMESTAMP填充/更新。“自动”的意思就是你不去管它MySQL 会替你去处理。
mysql> insert into t8(id1) values('20180109000000');
mysql> select * from t8;
+---------------------+------+
| id1 | d2 |
+---------------------+------+
| 2018-01-09 00:00:00 | NULL |
+---------------------+------+
1 row in set (0.00 sec)
扩展:
select now();查看当前时间
```
## 二:表操作
#### 1.案例
表:school.student1
```
字段 字段 字段
id name sex age
1 tom male 23 记录
2 jack male 21 记录
3 alice female 19 记录
```
语法:
```shell
create table 表名(自定义)(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
)[存储引擎 字符集];
==在同一张表中,字段名是不能相同
==宽度和约束条件可选
==字段名和类型是必须的
```
创建库表:
```shell
mysql> CREATE DATABASE school; //创建数据库school
mysql> use school;
mysql> create table student1(
id int,
name varchar(50),
sex enum('m','f'),
age int
);
Query OK, 0 rows affected (0.03 sec)
```
查看库:
```shell
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| student1 |
+------------------+
1 row in set (0.00 sec)
```
插入语法:
```
insert into 表名(字段1,字段2...) values(字段值列表...);
```
插入数据:
```shell
mysql> insert into student1(id,name,sex,age) values(1,'xingdia','m','26');
```
查看表结构:
```shell
mysql> desc student1;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| sex | enum('m','f') | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
```
查询数据:
```shell
mysql> select id,name,sex,age from student1; //查询表中所有字段的值
Empty set (0.00 sec)
mysql> select * from student1; /查询表中所有字段的值
Empty set (0.00 sec)
mysql> select name,age from student1; //查询表中指定字段的值
Empty set (0.00 sec)
```
扩展插入:
```shell
mysql> insert into student1 values (1,'xingdian','m',33),(2,'alice','m',20),(3,'jack','m',40); //顺序插入
Query OK, 3 rows affected (0.14 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> insert into student1(name,age) values ('zhuzhu',10),('gougou',20); //只向指定的字段插入值
Query OK, 2 rows affected (0.12 sec)
Records: 2 Duplicates: 0 Warnings: 0
```
#### 2.案例
school.student2
```shell
字段名 数据类型
编号 id int
姓名 name varchar(50)
出生年份 born_year year
生日 birthday date
上课时间 class_time time
注册时间 reg_time datetime
```
创建表:
```shell
mysql> create table student2(
id int,
name varchar(50),
born_year year,
birthday date,
class_time time,
reg_time datetime
);
```
插入数据:
```shell
mysql> insert into student2 values(1,'tom',now(),now(),now(),now());
mysql> insert into student2 values(2,'jack',1982,19821120,123000,20140415162545);
```
school.student3
```shell
id id int
姓名 name varchar(50)
性别 sex enum('male','female')
爱好 hobby set('music','book','game','disc')
```
创建表:
```shell
mysql> create table student3(
id int,
name varchar(50),
sex enum('male','female'),
hobby set('music','book','game','disc')
);
```
查看表结构:
```shell
mysql> desc student3;
mysql> show create table student3\G
```
插入数据:
```shell
mysql> insert into student3 values (1,'tom','male','book,game');
mysql> insert into student3 values (2,'jack','male','film');
```
注意:
DESCRIBE查看表结构
```shell
DESCRIBE 表名;
DESC 表名;
```
查看表详细结构
```shell
SHOW CREATE TABLE 表名;
```
## 三:表完整性约束
#### 1.作用
用于保证数据的完整性和一致性
#### 2.约束条件
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录,不可以为空 UNIQUE + NOT NULL
FOREIGN KEY (FK) 标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键之间的关联
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的可以为空一个表中可以有多个UNIQUE KEY
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
注意:
是否允许为空默认NULL可设置NOT NULL字段不允许为空必须赋值
字段是否有默认值缺省的默认值是NULL如果插入记录时不给字段赋值此字段使用默认值
```shell
MySQL [(none)]> sex enum('male','female') not null default 'male'
MySQL [(none)]> age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20
```
是否是key 主键 primary key 外键 forengn key
#### 3.NOT NULL
school.student4
创建表:(注意前提需要有库)
```shell
mysql> create table school.student4(
id int not null,
name varchar(50) not null,
sex enum('m','f') default 'm' not null,
age int unsigned default 18 not null,
hobby set('music','disc','dance','book') default 'book,dance'
);
```
插入数据:(注意观察查询到的数据)
```shell
MySQL [(none)]> insert into school.student4(id,name) values(2,'robin');
Query OK, 1 row affected (0.08 sec)
MySQL [(none)]> select * from school.student4;
+----+-------+-----+-----+------------+
| id | name | sex | age | hobby |
+----+-------+-----+-----+------------+
| 2 | robin | m | 18 | dance,book |
+----+-------+-----+-----+------------+
1 row in set (0.00 sec)
```
注意报错的原因:
```shell
MySQL [(none)]> insert into school.student4 values(3,NULL,'m',40,'book');
ERROR 1048 (23000): Column 'name' cannot be null
```
#### 4.唯一约束
作用:
MySQL索引的建立对于MySQL的高效运行是很重要的索引可以大大提高MySQL的检索速度
company.department1
创建表:
```shell
MySQL [(none)]> create database company;
Query OK, 1 row affected (0.01 sec)
MySQL [(none)]> CREATE TABLE company.department1 (dept_id INT,dept_name VARCHAR(30) UNIQUE,comment VARCHAR(50));
Query OK, 0 rows affected (0.34 sec)
```
查看表结构:
```shell
MySQL [(none)]> desc company.department1;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| dept_id | int(11) | YES | | NULL | |
| dept_name | varchar(30) | YES | UNI | NULL | |
| comment | varchar(50) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
```
数据插入:(注意查看插入数据时的提示)
```shell
MySQL [(none)]> insert into company.department1 values ("1","xingdian","hr");
Query OK, 1 row affected (0.04 sec)
MySQL [(none)]> insert into company.department1 values ("1","xingdian","hr");
ERROR 1062 (23000): Duplicate entry 'xingdian' for key 'dept_name'
```
#### 5.主键约束
注意primary key 字段的值是不允许重复且不允许不NULLUNIQUE + NOT NULL
school.student6
创建表:
```shell
MySQL [(none)]> create table school.student6(
id int primary key not null auto_increment,
name varchar(50) not null,
sex enum('male','female') not null default 'male',
age int not null default 18
);
Query OK, 0 rows affected (0.47 sec)
```
插入数据:
```shell
MySQL [(none)]> insert into school.student6 values (1,'alice','female',22);
Query OK, 1 row affected (0.18 sec)
MySQL [(none)]> insert into school.student6(name,sex,age) values
-> ('jack','male',19),
-> ('tom','male',23);
Query OK, 2 rows affected (0.14 sec)
Records: 2 Duplicates: 0 Warnings: 0
MySQL [(none)]> select * from school.student6;
+----+-------+--------+-----+
| id | name | sex | age |
+----+-------+--------+-----+
| 1 | alice | female | 22 |
| 2 | jack | male | 19 |
| 3 | tom | male | 23 |
+----+-------+--------+-----+
3 rows in set (0.00 sec)
```
## 四:修改表
语法格式:
修改表名
ALTER TABLE 表名 RENAME 新表名;
增加字段
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…],
ADD 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
删除字段
ALTER TABLE 表名 DROP 字段名;
修改字段
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
#### 1.修改数据库引擎
```shell
mysql> alter table service engine=innodb; //engine=myisam|memory|....
```
#### 2.添加字段
```shell
mysql> create table student10 (id int);
mysql> alter table student10 add name varchar(20) not null, add age int not null default 22;
mysql> alter table student10 add stu_num int not null after name; //添加name字段之后
mysql> alter table student10 add sex enum('male','female') default 'male' first; //添加到最前面
```
#### 3.删除字段
```shell
mysql> alter table student10 drop sex;
```
#### 4.修改字段类型
```shell
MySQL [school]> desc student10;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)
MySQL [school]> alter table student10 modify age tinyint not null ;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [school]> desc student10;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| age | tinyint(4) | NO | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
MySQL [school]> alter table student10 modify id int not null primary key ; ////修改字段类型、约束、主键
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [school]> desc student10;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| age | tinyint(4) | NO | | NULL | |
+-------+------------+------+-----+---------+-------+
```
#### 5.增加约束
```shell
MySQL [school]> alter table student10 modify id int not null primary key ;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [school]> desc student10;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| age | tinyint(4) | NO | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
MySQL [school]> alter table student10 modify id int not null primary key auto_increment;
ERROR 1068 (42000): Multiple primary key defined //错误该字段已经是primary key
MySQL [school]> alter table student10 modify id int not null auto_increment;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [school]> desc student10;
+-------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| age | tinyint(4) | NO | | NULL | |
+-------+------------+------+-----+---------+----------------+
```
#### 6.增加主键
```shell
MySQL [school]> desc student1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)
MySQL [school]> alter table student1 add primary key(id);
MySQL [school]> desc student1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| age | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)
```
#### 7.修改主键和自增
```shell
MySQL [school]> alter table student1 modify id int auto_increment;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [school]> desc student1;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| age | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+----------------+
```
#### 8.删除主键
```shell
MySQL [school]> desc student10;
+-------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| age | tinyint(4) | NO | | NULL | |
+-------+------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
MySQL [school]> alter table student10 drop primary key;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
删除自增
ySQL [school]> alter table student10 modify id int not null;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [school]> desc student10;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| age | tinyint(4) | NO | | NULL | |
+-------+------------+------+-----+---------+-------+
MySQL [school]> alter table student10 drop primary key;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [school]> desc student10;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| age | tinyint(4) | NO | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
```
#### 9.复制表
复制表结构+记录 key不会复制: 主键、外键和索引)复制表结构/记录+表结构不会将Key复制
```shell
mysql> create table new_service select * from service;
```
只复制表结构
```shell
mysql> create table new1_service select * from service where 1=2; //条件为假,查不到任何记录
```
可以复制主键,只复制表结构
```shell
mysql> create table t4 like employees;
```
#### 10.删除表
```shell
mysql> DROP TABLE 表名;
```
#### 11.修改数据表中字段的值
语法:
Update 表名 set 列名=值where 条件
```shell
mysql> update student set name='123' where id=1;
```
删除某一行:
delete from 表名 where id=1
```shell
mysql> delete from type where id=1;
```
## 五:库操作
#### 1.简介
系统自带库的含义及作用
```shell
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
```
information_schema虚拟库主要存储了系统中的一些数据库对象的信息例如用户表信息、列信息、权限信息、字符信息等
performance_schema主要存储数据库服务器的性能参数
mysql授权库主要存储系统用户的权限信息
sys主要存储数据库服务器的性能参数
注意information_schema
SCHEMATA 存放的是系统中的库
```shell
MySQL [information_schema]> select * from information_schema.SCHEMATA;
+--------------+--------------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+--------------------+----------------------------+------------------------+----------+
| def | information_schema | utf8 | utf8_general_ci | NULL |
| def | mysql | latin1 | latin1_swedish_ci | NULL |
| def | performance_schema | utf8 | utf8_general_ci | NULL |
| def | school | latin1 | latin1_swedish_ci | NULL |
| def | sys | utf8 | utf8_general_ci | NULL |
+--------------+--------------------+----------------------------+------------------------+----------+
目录_名称
实际库_名称
默认_字符_设置_名称
默认_分类_名称
```
TABLES 存储表名
```shell
MySQL [information_schema]> select * from information_schema.TABLES\G
*************************** 283. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: xingdian
TABLE_NAME: t1
TABLE_TYPE: BASE TABLE
ENGINE: InnoDB
VERSION: 10
ROW_FORMAT: Dynamic
TABLE_ROWS: 1
AVG_ROW_LENGTH: 16384
DATA_LENGTH: 16384
MAX_DATA_LENGTH: 0
INDEX_LENGTH: 0
DATA_FREE: 0
AUTO_INCREMENT: NULL
CREATE_TIME: 2022-09-22 08:18:38
UPDATE_TIME: 2022-09-22 08:18:54
CHECK_TIME: NULL
TABLE_COLLATION: latin1_swedish_ci
CHECKSUM: NULL
CREATE_OPTIONS:
TABLE_COMMENT:
283 rows in set (0.02 sec)
```
COLUMNS 存储字段
```shell
*************************** 3083. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: xingdian
TABLE_NAME: t1
COLUMN_NAME: id
ORDINAL_POSITION: 1
COLUMN_DEFAULT: NULL
IS_NULLABLE: YES
DATA_TYPE: int
CHARACTER_MAXIMUM_LENGTH: NULL
CHARACTER_OCTET_LENGTH: NULL
NUMERIC_PRECISION: 10
NUMERIC_SCALE: 0
DATETIME_PRECISION: NULL
CHARACTER_SET_NAME: NULL
COLLATION_NAME: NULL
COLUMN_TYPE: int(11)
COLUMN_KEY:
EXTRA:
PRIVILEGES: select,insert,update,references
COLUMN_COMMENT:
GENERATION_EXPRESSION:
3083 rows in set (0.03 sec)
```
#### 2.创建库
方案一:交互式操作
```shell
mysql> create database xingdian;
```
数据库命名规则:
区分大小写
唯一性
不能使用关键字如 create select
不能单独使用数字
方案二:非交互式
```shell
mysql -u root -pQianFeng@123 -e "create database diandian"
```
#### 3.查看数据库
```shell
mysql> show databases;
mysql> show create database xingdian;
mysql> select database(); 查看当前所在的库
```
#### 4.切换数据库
```shell
mysql> use xingdian;
```
#### 5.删除数据库
```shell
mysql> DROP DATABASE 数据库名;
```

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,135 @@
<h1><center>数据库日志管理</center></h1>
------
## 一:日志管理
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220925214046253.png" alt="image-20220925214046253" style="zoom:50%;" />
#### 1.日志分类
错误日志 启动停止关闭失败报错。rpm安装日志位置 /var/log/mysqld.log
通用查询日志:所有的查询都记下来
二进制日志实现备份增量备份。只记录改变数据除了select都记
中继日志读取主服务器的binlog在本地回放。保持一致
slow log慢查询日志指导调优定义某一个查询语句定义超时时间通过日志提供调优建议给开发人员
DDL log 定义语句的日志
#### 2.Error Log
```shell
log-error=/var/log/mysqld.log
```
#### 3.Binary Log
```
log-bin=/var/log/mysql-bin/slave2
server-id=2
[root@slave2 ~]# mkdir /var/log/mysql-bin
[root@slave2 ~]# chown mysql.mysql /var/log/mysql-bin/
[root@slave2 ~]# systemctl restart mysqld
```
注意:
需要提前开启
查看binlog日志
```shel
[root@slave2 ~]# mysqlbinlog slave2-bin.000001 -v --base64-output=decode-rows
时间点 141126 14:04:49
位置点 : at 106
注:
1. 重启mysqld 会截断
2. flush logs 会截断
3. reset master 删除所有binlog rm -rf /var/lib/mysql/*.000001
4. 删除部分
PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2019-04-02 22:46:26';
截取binlog
all
# mysqlbinlog mysql.000002
datetime
# mysqlbinlog mysql.000002 --start-datetime="2018-12-05 10:02:56"
# mysqlbinlog mysql.000002 --stop-datetime="2018-12-05 11:02:54"
# mysqlbinlog mysql.000002 --start-datetime="2018-12-05 10:02:56" --stop-datetime="2018-12-05 11:02:54"
position
# mysqlbinlog mysql.000002 --start-position=260
# mysqlbinlog mysql.000002 --stop-position=260
# mysqlbinlog mysql.000002 --start-position=260 --stop-position=930
```
#### 4.Slow Query Log
开启慢查询日志:
```shell
[root@xingdian ~]# vim /etc/my.cnf
slow_query_log=1
slow_query_log_file=/var/log/mysql-slow/slow.log
long_query_time=3 设置慢查询超时时间 单位是:秒
```
创建对应目录:
```shell
[root@xingdian ~]# mkdir /var/log/mysql-slow
[root@xingdian ~]# chown mysql.mysql mysql-slow
```
重启服务:
```shell
[root@xingdian ~]# systemctl restart mysqld
```
验证:
```shell
[root@xingdian ~]# mysql -uroot -pQianFeng@123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.39-log MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select sleep(6);
+----------+
| sleep(6) |
+----------+
| 0 |
+----------+
1 row in set (6.00 sec)
mysql> exit
Bye
[root@xingdian ~]# cat /var/log/mysql-slow/slow.log
/usr/sbin/mysqld, Version: 5.7.39-log (MySQL Community Server (GPL)). started with:
Tcp port: 0 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 2022-09-25T06:58:05.496205Z
# User@Host: root[root] @ localhost [] Id: 2
# Query_time: 6.007094 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1664089085;
select sleep(6);
```