❤️吐血总结《Mysql从入门到入魔》,图文并茂(建议收藏)❤️
Posted Dream丶Killer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❤️吐血总结《Mysql从入门到入魔》,图文并茂(建议收藏)❤️相关的知识,希望对你有一定的参考价值。
文章目录
1. 数据库操作
1.1显示数据库
mysql> SHOW DATABASES;
1.2 创建数据库
CREATE DATABASE 数据库名 CHARSET='编码格式'
mysql> CREATE DATABASE create_test CHARSET = 'utf8';
1.3 使用数据库
mysql> USE create_test;
1.4 查看当前数据库
使用 SELECT DATABASE()
查看当前使用的数据库。
mysql> SELECT DATABASE();
+-------------+
| DATABASE() |
+-------------+
| create_test |
+-------------+
1.5 删除数据库
mysql> DROP DATABASE create_test;
2. 表操作
2.1 创建表
格式:
CREATE TABLE [IF NOT EXISTS] `表名` (
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
.......
`字段名` 列类型 [属性] [索引] [注释]
) [表类型] [字符集设置] [注释]
使用下面的语句创建示例中的 one_piece
表。
mysql> CREATE TABLE one_piece
-> (
-> id CHAR(10) NOT NULL COMMENT '海贼团id',
-> pirates CHAR(10) NOT NULL COMMENT '海贼团名称',
-> name CHAR(10) NOT NULL COMMENT '海贼名',
-> age INT(11) NOT NULL COMMENT '海贼年龄',
-> post VARCHAR(10) NULL COMMENT '海贼团职位'
-> );
注意:创建表时,指定的表名必须不存在,否则会出错。
2.2 更新表
2.2.1 添加列
在刚才创建的 one_piece
表中添加一列 bounty
(赏金)。
mysql> ALTER TABLE one_piece
-> ADD bounty INT(15);
2.2.2 删除列
删除 bounty
列。
mysql> ALTER TABLE one_piece
-> DROP COLUMN bounty;
2.3 查看表结构
mysql> DESC one_piece;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | char(10) | NO | | NULL | |
| pirates | char(10) | NO | | NULL | |
| name | char(10) | NO | | NULL | |
| age | int(11) | YES | | NULL | |
| post | varchar(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
2.4 查看表详细信息
\\G
后面不能加“ ; ”
。
mysql> SHOW TABLE STATUS LIKE 'one_piece' \\G
*************************** 1. row ***************************
Name: one_piece
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2021-09-03 17:53:58
Update_time: NULL
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.39 sec)
2.5 重命名表
两种方法:
ALTER TABLE 表名 RENAME [TO | AS] 新表名;
RENAME TABLE 表名 TO 新表名;
用方法一将 Products
表更名为 new_Products
,再用方法二改回来。
-- 方法一
mysql> ALTER TABLE one_piece RENAME TO new_one_piece;
-- 方法二
mysql> RENAME TABLE new_one_piece TO one_piece;
2.6 删除表
DROP TABLE 表名
mysql> DROP TABLE one_piece;
注意:在该表与其他表有关联时,Mysql
会阻止该表的删除。
3. 查询
3.1 查询多列
同时输出 name
, age
列。
mysql> SELECT name, age
-> FROM one_piece;
3.2 检索唯一值
使用 DISTINCT
关键字,查询字段 age
的唯一值。
mysql> SELECT DISTINCT age
-> FROM one_piece;
3.3 限制输出
在 Mysql
中使用 LIMIT
关键字限制输出的数据。LIMIT
有两种常见用法:
SELECT * FROM table LIMIT [offset], rows -- LIMIT 单独使用
SELECT * FROM table LIMIT rows OFFSET [offset] -- 配合 OFFSET 使用
offset:行开始的行的索引。0表示从第1行 开始显示(包括第1行),以此类推。
rows:数据显示的条数。
示例:
SELECT * FROM one_piece LIMIT 5; -- 检索前5条数据
--相当于
SELECT * from one_piece LIMIT 0,5; -- 从第0行开始检索5条数据
--相当于
SELECT * FROM one_piece LIMIT 5 OFFSET 0; -- 从第0行开始检索5条数据,注意这里的LIMIT的5指代的是数量
注:如果表中数据不足,即LIMIT设定的数过大,则只会检索到最后一行。
3.4 注释
三种注释方式
-- 单行注释
# 单行注释
/* 多行注释 */
4. ORDER BY 排序
4.1 单列排序
使用 ORDER BY
子句。 ORDER BY
子句取一个或多个列的名字,据此对输出进行排序(默认升序)。
mysql> SELECT name, age
-> FROM one_piece
-> ORDER BY age;
**注意:**在指定一条 ORDER BY
子句时,应该保证它是 SELECT
语句中最后一条子句。
4.2 多列排序
mysql> SELECT A, B
-> FROM test
-> ORDER BY A, B;
在按多列排序时,仅在多个行具有相同的 A
值时 才按 B
进行排序。如果 A
列中所有的值都是 唯一的,则不会按 B
排序。
4.3 指定排序方向
ORDER
默认升序(从A到Z)排序。指定 DESC
关键字进行降序(从Z到 A)排序。
mysql> SELECT age
-> FROM one_piece
-> ORDER BY age DESC;
多列指定排序方向时,要使用逗号分隔。
mysql> SELECT name, age
-> FROM one_piece
-> ORDER BY name DESC, age;
5. WHERE 过滤数据
5.1 WHERE 子句操作符
操 作 符 | 说明 | 操作符 | 说明 |
---|---|---|---|
= | 等于 | > | 大于 |
<>、!= | 不等于 | >= | 大于等于 |
< | 小于 | !> | 不大于 |
<= | 小于等于 | BETWEEN | 在两值之间(包含边界) |
!< | 不小于 | IS NULL | 是NULL值 |
5.2 范围值检查
使用 WHERE
关键字和 BETWEEN AND
进行范围值检查(前闭后闭)。
mysql> SELECT age
-> FROM one_piece
-> WHERE A BETWEEN 5 AND 10;
查询 字段 age 中 >=5
并且 <= 10
的数据。
5.3 空值检查
使用 WHERE
关键字和 IS NULL
进行范围值检查。如果没有 NULL
值就不返回数据。
mysql> SELECT name
-> FROM one_piece
-> WHERE name IS NULL;
6. 高级数据过滤
6.1 WHERE 组合过滤
使用 AND
、OR
操作符给 WHERE
子句添加附加条件。 AND
的优先级比 OR
要高,优先级高低 ()
、 AND
、 OR
。在使用的过程中要注意各个优先级的影响。
mysql> SELECT name, age
-> FROM one_piece
-> WHERE(name = '索隆' OR name = '路飞')
-> AND age >= 18;
6.2 IN 操作符
IN
操作符用来指定条件范围,范围中的每个条件都可以进行匹配。(与 OR
的功能相同,但速度比 IN
慢)
mysql> SELECT name, age
-> FROM one_piece
-> WHERE name IN ('索隆', '路飞')
6.3 NOT 操作符
WHERE
子句中的 NOT
操作符有且只有一个功能,那就是否定其后所跟的任何条件。
mysql> SELECT name
-> FROM one_piece
-> WHERE name NOT IN ('索隆', '路飞')
7. 通配符过滤
通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用 通配符搜索。
在使用通配符过滤之前要先了解 LIKE
, LIKE
操作符用于在 WHERE
子句中搜索列中的指定模式或取值。
7.1 % 通配符
%
表示任何字符出现任意次数。例如,为了找出所有以 路
开始的 name
。
mysql> SELECT name, age
-> FROM one_piece
-> WHERE name LIKE '路';
7.2 _ 通配符
通配符 _
的用途与 %
一样也是匹配任意字符,但它只匹配单个字符,而不是多个字符。
mysql> SELECT name, age
-> FROM one_piece
-> WHERE name LIKE '乌_普';
8. 创建计算字段
8.1 拼接字段
下面将 name
, sex
两列进行合并。并通过 AS
关键字进行给新列赋予别名。
mysql> SELECT Concat(name, '(', sex, ')') AS new_column
-> FROM one_piece;
8.2 执行算数计算
通过 quantity
(数量)、 price
(价格)来计算 total_price
(总价)
mysql> SELECT quantity, price,
-> quantity * price AS total_price
-> FROM test
9. 函数
9.1 常用文本处理函数
函数 | 说明 |
---|---|
LEFT(str, length) | 返回指定长度的字符串的左边部分 |
RIGHT(str, length) | 返回指定长度的字符串右边部分 |
LTRIM(str) | 去掉字符串左边的空格 |
RTRIM(str) | 去掉字符串右边的空格 |
LOWER(str) | 将字符串转换为小写 |
UPPER(str) | 将字符串转换为大写 |
LENGTH(str) | 返回字符串的长度 |
使用 LENGTH(str)
获取字符串的长度。
mysql> SELECT name, LENGTH(name) AS length
-> FROM one_piece;
9.2 日期和时间处理函数
查询在 2000年 出生的人员信息。
mysql> SELECT *
-> FROM test
-> WHERE YEAR(brithday)=2000;
9.3 数值处理函数
函数 | 说明 |
---|---|
ABS() | 返回一个数的绝对值 |
COS() | 返回一个角度的余弦 |
SIN() | 返回一个角度的正弦 |
TAN() | 返回一个角度的正切 |
PI() | 返回圆周率 |
EXP() | 返回一个数的指数值 |
SQRT() | 返回一个数的平方根 |
以 ABS() 函数为例
sql> SELECT ABS(-1);
+---------+
| ABS(-1) |
+---------+
| 1 |
+---------+
10. 数据聚集
10.1 聚集函数
函数 | 说明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
10.1.1 AVG() 函数
查询平均 age 。
mysql> SELECT AVG(age) AS avg_age
-> FROM one_piece
10.1.2 COUNT() 函数
两种使用方式:
COUNT(*)
对表中行的数目进行计数,包括空值。
mysql> SELECT COUNT(*) AS num_person
-> FROM one_piece;
COUNT(column)
对特定列中非NULL
行进行计数。
mysql> SELECT COUNT(name) AS num_name
-> FROM one_piece;
10.1.3 MAX() & MIN() 函数
当 column
列为数值列, MAX(column) / MIN(column)
返回 column
列中的最大值 / 最小值。
当 column
列为文本数据, MAX(column) / MIN(column)
返回 column
列数据排序后的最后一行 / 最前面的行。
10.1.4 SUM() 函数
SUM()
用来返回指定列值的和(总计)(忽略列值为 NULL
的行)。
mysql> SELECT SUM(price * quantity) AS total_price
-> FROM test
10.2 组合聚集函数
计算 one_piece
表中数据的条数,年龄的最小值、最大值和平均值。
mysql> SELECT COUNT(*) AS num_person,
-> MIN(age) AS age_min,
-> MAX(age) AS age_max,
-> AVG(age) AS age_avg
-> FROM one_piece;
11. 数据分组
11.1 数据分组
使用分组将数据分为多个逻辑组, 对每个组进行聚集计算。
例:统计各个海贼团( pirates
)的人数。
mysql> SELECT pirates, COUNT(*) AS num_person
-> FROM one_piece
-> GROUP BY pirates;
group by
注意事项:
GROUP BY
可以嵌套使用。GROUP BY
子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT
中使用表达式,则必须在GROUP BY
子句中指定相同的表达式。不能使用别名。- 除聚集计算语句外,
SELECT
语句中的每一列都必须在GROUP BY
子句 中给出。 - 如果分组列中包含具有
NULL
值的行,则NULL
将作为一个分组返回。 如果列中有多行NULL
值,它们将分为一组。 GROUP BY
子句必须出现在WHERE
子句之后,ORDER BY
子句之前。
11.2 过滤分组
使用 HAVING
子句在数据分组后进行过滤。
查询海贼团人数在500人以上的 海贼团名称 及 人数。
mysql> SELECT pirates, COUNT(*) AS num_person
-> FROM one_piece
-> GROUP BY pirates
-> HAVING COUNT(*) >= 500;
WHERE
与 HAVING
的主要区别:
- WHERE 在数据分组前进行过滤,HAVING 在数据分组后进行过滤。
SELECT子句顺序:
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
12. 子查询
12.1 利用子查询进行过滤
现在查询 草帽海贼团 的排名信息。
mysql> SELECT rank
-> FROM rank_info
-> WHERE id IN (SELECT id
-> FROM one_piece
-> WHERE pirates = '草帽海贼团');
注意:
- 在
SELECT
语句中,子查询总是从内向外处理。 - 作为子查询的
SELECT
语句只能查询单个列。检索多个列会报错。
12.2 作为计算字段使用子查询
查询海贼团排名和任务信息,首先从 one_piece
表中根据 id
检索出排名信息,再统计每个冒险团的人数。
mysql> SELECT rank,
-> (SELECT COUNT(*)
-> FROM one_piece AS oe
-> WHERE oe.id = ro.id) AS num_person
-> FROM rank_info AS ro
-> ORDER BY rank;
注意:上面的例子中使用的是 oe.id
和 ro.id
,而不是直接使用 id
,因为在两个表中都有 id
列,在有可能混淆列名时必须使用这种语法。
13. 表联结
13.1 自联结
假如现在有人不知道 乔巴 所属的海贼团, 想要知道 乔巴 所属海贼团的所有成员名称与赏金。
先看一下子查询的方式:
mysql> SELECT name, bounty
-> FROM one_piece
-> WHERE pirates = (SELECT pirates
-> FROM one_piece
-> WHERE name = '乔巴');
接下来使用自联结的方式:
mysql> SELECT c1.name, c1.bounty
-> FROM Customers AS c1, Customers AS c2
-> WHERE c1.pirates = c2.pirates
-> AND c2.name = '乔巴';
通常情况下,自联结的方式比子查询的方式要快很多。
13.2 等值联结
联结是一种机制,用来在一条 SELECT
语句 中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。联结不是物理实体。换句话说,它在实际的数据库表 中并不存在。它只在查询执行期间存在。
两表 table1
, table2
中数据如下:
table1 table2
+------+------+------+ +------+------+------+
| A | B | C | | C | D | E |
+------+------+------+ +------+------+------+
| 1 | 2 | 3 | | 2 | 3 | 4 |
| 4 | 5 | 6 | | 6 | 7 | 8 |
+------+------+------+ +------+------+------+
现在通过表联结,获取两个表中的数据。
mysql> SELECT *
-> FROM table1 AS t1, table2 AS t2
-> WHERE t1.C = t2.C;
+------+------+------+------+------+------+
| A | B | C | C | D | E |
+------+------+------+------+------+------+
| 4 | 5 | 6 | 6 | 7 | 8 |
+以上是关于❤️吐血总结《Mysql从入门到入魔》,图文并茂(建议收藏)❤️的主要内容,如果未能解决你的问题,请参考以下文章