Mysql 的学习笔记

2021-03-21 1391点热度 0人点赞

书籍为《Mysql 必知必会》,欢迎恰知识。


0 、笔记状态

图书链接 [链接] [数据库下载]

第一轮阅读至《Mysql 必知必会》第八章。

第二轮阅读至《Mysql 必知必会》第十三章。


1 、定义

SQL(Structured Query Language):SQL 是一种专门用来与数据库通信的语言

数据库(database): 保存有组织的数据的容器(通常是一个文件或一组文件)
理解数据库的一种最简单的办法是将其想象为一个文件柜。此文件柜是一个存放数据的物理位置,不管数据是什么以及如何组织的

数据库管理系统(DBMS):数据库软件的一种称呼,有别于人们将数据库软件称为数据库。数据库是通过 DBMS 创建和操纵的容器。
DBMS 可分为两类:一类为基于共享文件系统的 DBMS(包括诸如 Microsoft Access 和 FileMaker 用于桌面用途),另一类为基于客户机-服务器的 DBMS,例如 Mysql 、 SQLServer 、 Oracle 、 SQLite 。

表(table):某种特定类型数据的结构化清单。
可用来存储某种特定类型的数据。可以保存顾客清单、产品目录,或者其他信息清单。
存储在中的数据是一种类型的数据或一个清单。决不应该将顾客的清单与订单的清单存储在同一个数据库中。这样做将使以后的检索和访问很困难。应该创建两个,每个清单一个

模式(schema):关于数据库和表的布局及特性的信息。
表具有一些特性,这些特性定义了数据在表中如何存储,如可以存储什么样的数据,数据如何分解,各部分信息如何命名,等等。描述表的这组信息就是所谓的模式模式可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)

列(column):表中的一个字段。所有表都是由一个或多个列组成的。
数据类型(datatype):列所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据。

字段(field) 基本上与 列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。

行(row):表中的一个记录。

主键(primary key):一列(或一组列),其值能够唯一区分表中每个行。
主键用来表示一个特定的行。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。

主键值规则:任意两行都不具有相同的主键值;每个行都必须具有一个主键值(主键列不允许 NULL 值)
主键的好习惯:不更新主键列的值;不重用主键列的值;不在主键列中使用 可能会更改 的值

子句(clause):SQL 语句由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。子句的例子有 SELECT 语句的 FROM 子句。

字面值(literal type):也称为常量值,文字值或标量值,是表示一个特定数据值的符号。


2 、 MySQL Community Server 初始化

每个 MySQL Community Server 安装都有一个名为 mysql 的简单命令行实用程序。这个实用程序没有下拉菜单、流行的用户界面、鼠标支持或任何类似的东西。

命令输入在 mysql> 之后
命令表名列名不区分大小写,行信息内的字段区分大小写,同时行信息内的字段涉及特殊符号需要补充转义字符。
命令用 ; 或 \g 结束,仅按 Enter 不执行命令。处理 SQL 语句时,其中所有空格都被忽略。(P22 有疑虑)
输入 help 或 \h 获得帮助,也可以输入更多的文本获得特定命令的帮助(如,输入 help select 获得使用 SELECT 语句的帮助)
输入 quit 或 exit 退出命令行实用程序

MySQL 完成安装后,可以使用指定了参数值的命令行选项来进行登录。默认如下(Ubuntu20)
完整的命令行选项和参数列表可用 mysql --help 获得。

mysql -u root -p -h localhost -P 3306
Password: /不显示**********不显示/
Welcome to the MySQL monitor.  Commands end with ; or \g.
 Your MySQL connection id is 9
 Server version: 10.3.17-MariaDB-log MariaDB Server
 Copyright (c) 2000, 2018, Oracle, MySQL Corporation Ab and others.
 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 MySQL [(none)]>

关于初次安装 MySQL,会涉及到初始密码和第一次修改密码的情况。 [ 链接 ] [ 链接 ] [ 链接 ]

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

显示日志文件中的初始密码
cat /var/log/mysqld.log | grep "A temporary password" | awk -F ' ' '{print $11}'
删除日志文件中的初始密码
sed -i '/A temporary password/d' /var/log/mysqld.log
登录 Mysql 命令行后可以使用 ALTER 修改密码
MySQL [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
MySQL [(none)]> FLUSH PRIVILEGES;
登录 Mysql 命令行后可以使用 SET 修改密码
MySQL [(none)]> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass4!');  
MySQL [(none)]> FLUSH PRIVILEGES;
也可以使用 MySQL Administrator 修改密码
mysqladmin -u root -p -h localhost password "MyNewPass4!"

3 、 Mysql 命令

3.1 、 SHOW 命令

查看数据库清单
MySQL [(none)]> SHOW DATABASES;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | mysql              |
 | performance_schema |
 +--------------------+

指定操作数据库(选择自带安装的 mysql 这个数据库)(只有这个可以不带分号)
MySQL [(none)]> USE mysql
Database changed

查看操作数据库中的表的清单
MySQL [(mysql)]> SHOW TABLES;
 +---------------------------+
 | Tables_in_mysql           |
 +---------------------------+
 | user                      |
 +---------------------------+

查看操作数据库中的表的表列(字段名,数据类型,是否允许为空,键信息,默认值,其他信息)
MySQL [(mysql)]> SHOW COLUMNS FROM user;
 +------------------------+-----------------------------------+------+-----+----------+-------+
 | Field                  | Type                              | Null | Key | Default  | Extra |
 +------------------------+-----------------------------------+------+-----+----------+-------+
 | Host                   | char(60)                          | NO   | PRI |          |       |
 | User                   | char(80)                          | NO   | PRI |          |       |
 | Password               | char(41)                          | NO   |     |          |       |
 | ssl_cipher             | blob                              | NO   |     | NULL     |       |
 | authentication_string  | text                              | NO   |     | NULL     |       |
 +------------------------+-----------------------------------+------+-----+----------+-------+
查看 MySQL Server 端的状态信息
MySQL [(none)]> SHOW STATUS;

查看 MySQL Server 端的全部用户权限
MySQL [(none)]> SHOW GRANTS;

查看 MySQL Server 端的错误消息
MySQL [(none)]> SHOW ERRORS;
查看 MySQL Server 端的警告消息
MySQL [(none)]> SHOW WARNINGS;

3.2 、 SELECT 命令 与 WHERE 子句

MySQL [(mysql)]> SELECT * FROM user;(查看操作数据库中的 user 表的 所有 的行信息)
MySQL [(none)]> SELECT * FROM mysql.user;(查看操作数据库中的 user 表的 所有 的行信息,其中 user 表采用完全限定名称 mysql.user 数据库 A. 数据库 A 下的表 B)
MySQL [(none)]> SELECT Host,User,Password,authentication_string FROM mysql.user;(查看操作数据库中的 user 表的 指定列 的行信息)
MySQL [(none)]> SELECT Host,user.User,mysql.user.Password FROM mysql.user;(查看操作数据库中的 user 表的 指定列 的行信息,其中采用两种完全限定名称 数据库 A. 数据库 A 下的数据表 B. 数据库 A 下的数据表 B 的数据列 C / 数据表 B. 数据表 B 下的数据列 C
SELECT 语句之查询去除重复 DISTINCT
MySQL [(none)]> SELECT DISTINCT Password FROM mysql.user; 
显示去重后的查询结果,如查询多项,多项都相同才会视为重复
SELECT 语句之查询指定行区间 LIMIT X OFFSET Y
MySQL [(none)]> SELECT Host,User,Password,authentication_string FROM mysql.user LIMIT X OFFSET Y; 
显示指定行区间的查询结果, X 为检索行数, Y 为开始行数。默认 Y 为 0 ,代表第一行。
当检索行数 Y 不够时,则只返回已检索出的内容。
SELECT 语句之查询排序 ORDER BY X ASC,Y DESC
MySQL [(none)]> SELECT Host,User,Password,authentication_string FROM mysql.user ORDER BY X ASC,Y DESC; 
显示查询结果并对结果进行排序,依据根据数据表的行数据值进行排序并 先排 X 列后排 Y 列, X,Y 均为数据表的行字段名,ASC 为升序排序,DESC 为降序排序。默认排序方式为数据底层表的顺序,即随最初添加顺序排序。排序支持一个或多个的查询排序方式。升序或降序排序的依据是 数据库字典
SELECT 语句之筛选结果 WHERE X = NA AND (Y != NB OR Y != NC)
MySQL [(none)]> SELECT Host,User,Password FROM mysql.user WHERE User = "root" AND (Host != "127.0.0.1" AND Host != " "); 
MySQL [(none)]> SELECT Host,User,Password FROM mysql.user WHERE User = "root" AND Host NOT IN ("127.0.0.1"," "); 
MySQL [(none)]> SELECT * FROM mysql.user WHERE Select_priv IS True;
MySQL [(none)]> SELECT * FROM mysql.user WHERE Select_priv = 2;
显示查询结果并对结果进行筛选,判断方式为条件语句。支持以下操作符
逻辑操作符 AND 与 / OR 或 / NOT 非 /(NOT 最高,AND 优先,OR 次之)

MySQL 中的 NOT MySQL 支持使用 NOT 对 IN 、 BETWEEN 和 EXISTS 子句取反,这与多数其他 DBMS 允许使用 NOT 对各种条件 取反有很大的差别。未测试)

比较操作符 = 等于 / != 不等于 (<> 也一样是不等于) / < 小于 /  <= 小于等于 /  > 大于 /  >= 大于等于 / IS 是布尔值或 Null / BETWEEN ? AND ? 在指定的两个值之间 / IN 在指定的值中含有

·为什么要使用 IN 操作符?其优点具体如下
   在使用长的合法选项清单时,IN 操作符的语法更清楚且更直观。
   在使用 IN 时,计算的次序更容易管理(因为使用的操作符更少)。
   IN 操作符一般比 OR 操作符清单执行更快。
   IN 的最大优点是可以包含其他 SELECT 语句,使得能够更动态地建立 WHERE 子句。
   IN WHERE 子句中用来指定要匹配值的清单的关键字,功能与 OR 相当。

4 、 Where 的模糊查询

通配符(wildcard):用来匹配值的一部分的特殊字符。

搜索模式(search pattern): 由字面值、通配符或两者组合构成的搜索条件
数据库中的 schema(见 1.1.2 节)和 pattern 都译作 “模式”,特此说明,请读者注意。

正则表达式(Regular expression):是用来匹配文本的特殊的串(字符集合)。

通配符使用的注意事项
不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

LIKE 指示 检索采用 通配符 匹配
字符串默认区分大小写,可使用多种通配符

通配符 % 多字符匹配
MySQL [(none)]> SELECT * FROM mysql.user where Host LIKE 'l%a%s%';
可以匹配空,但是如果结尾存在空格可能无法正确匹配。(可用 RTrim 函数解决)
通配符 _ 单字符匹配
MySQL [(none)]> SELECT * FROM mysql.user where Host LIKE 'l__alhost';
不可以匹配空,总是匹配一个字符。

REGEXP 指示 检索采用 正则表达式 匹配
字符串不区分大小写,支持的正则表达式只是标注的子集

正则表达式 字符串 匹配方式
MySQL [(none)]> SELECT * FROM mysql.user where Host REGEXP 'localho';
相对通配符版本的匹配,正则表达式如果被匹配的文本在列值中出现,会返回结果。
如果尝试匹配完整列值,可以尝试使用 ^ 或者 $ 两种定位符(行首行尾)。
正则表达式 | 匹配方式 (或)
MySQL [(none)]> SELECT * FROM mysql.user where Host REGEXP 'localhost|127.0.0.1|::1';
正则表达式 [] 匹配方式 (或)(限定内部范围)
MySQL [(none)]> SELECT * FROM mysql.user where Host REGEXP '[123.:]';
同时可以使用 ^ 标注反向匹配(非)例如 [^0-9.:]
正则表达式 - 连续字符串
MySQL [(none)]> SELECT * FROM mysql.user where Host REGEXP '[0-9]';
正则表达式 . 任意字符串
MySQL [(none)]> SELECT * FROM mysql.user where Host REGEXP '[0-9]';
正则表达式 \\ 转义表达式字符
MySQL [(none)]> SELECT * FROM mysql.user where Host REGEXP '\\.';
\\f 换页 \\n 换行 \\r 回车 \\t 制表 \\v 纵向制表
正则表达式 常见匹配
[:alnum:]    任意字母和数字(同 [a-zA-Z0-9])
[:alpha:]    任意字符(同 [a-zA-Z])
[:blank:]    空格和制表(同 [\t])
[:cntrl:]    ASCII 控制字符(ASCII 0 到 31 和 127)
[:digit:]    任意数字(同 [0-9])
[:graph:]    与 [:print:] 相同,但不包括空格
[:lower:]    任意小写字母(同 [a-z])
[:print:]    任意可打印字符
[:punct:]    既不在 [:alnum:] 又不在 [:cntrl:] 中的任意字符
[:space:]    包括空格在内的任意空白字符(同 [\f\n\r\t\v])
[:upper:]    任意大写字母(同 [A-Z])
[:xdigit:]   任意十六进制数字(同 [a-fA-F0-9])
*     0 个或多个匹配
+     1 个或多个匹配(等于 {1,})
?     0 个或 1 个匹配(等于 {0,1})
{n}   指定数目的匹配
{n,}  不少于指定数目的匹配
{n,m} 匹配数目的范围(m 不超过 255)
^       文本的开始(注意此符号同时还是内部字符的反向匹配)
$       文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾

例子 stickers? 代表 stickers|sticker
例子 [0-9]{2,3} 代表 00-99 与 000-999 的匹配 = [0-9][0-9]|[0-9][0-9][0-9]
如果想测试一个正则表达式是否正确,可以使用 SELECT 'example' REGEXP '[0-9]'; 进行测试
并返回匹配成功 (1) 和未能匹配 (0)

5 、输出格式处理

字段(field):基本上与 列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。

拼接(concatenate):将值联结到一起构成单个值。

CONCAT() 拼接函数
MySQL [(none)]> SELECT CONCAT(User,'@',Host),Password,authentication_string FROM mysql.user;
多数 DBMS 使用 + 或 || 来实现拼接,MySQL 则使用 Concat() 函数来实现。
AS NAME 指定列别名
MySQL [(none)]> SELECT Concat(User,'@',Host) AS LinkHost,Password,authentication_string FROM mysql.user;
别名还有其他用途。常见的用途包括在实际的表列名包含不符合规定的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩充它,等等。
如果想测试一个表达式是否正确,可以使用 'SELECT 表达式' 的方式进行测试,并返回有效结果

文本处理函数

LTRIM() RTRIM() TRIM() 去除字符串左侧/右侧/两侧的空格
MySQL [(none)]> SELECT TRIM(' Password ');
LEFT(str,num) RIGHT(str,num) 返回 str 串从 左/右 数 num 个字符
MySQL [(none)]> SELECT LEFT('Mr Zhao',4);
LOWER() UPPER() 将字符串格式转为 小写/大写
MySQL [(none)]> SELECT LOWER('Mr Zhao');
LENGTH() CHAR_LENGTH() 返回字符串 字节长度/字符个数
MySQL [(none)]> SELECT LENGTH('中文');
英文单字母数字符号长度为 1 个字节,中文单字符长度为 3 个字节,Emoji 表情单字符长度为 6 个字节。
LOCATE(substr,str,pos) 找出字符串的一个子串位置
MySQL [(none)]> SELECT LOCATE('bar','foobarbar','5');
返回 substr 子字符串 在 str 主字符串 中的开始位置。如携带 pos 参数则从检索点查找,如未检索到 substr,返回 0
SUBSTRING(str,pos,len) 提取字符串的指定长度
MySQL [(none)]> SELECT SUBSTRING('foobarbar','3','6');
返回 str 子字符串 从第 3 个字符开始,一共 6 个字符的内容。(字符串从 1 开始)
SOUNDEX(str) 将字符串转换为读音格式
MySQL [(none)]> SELECT SOUNDEX('foobarbar');
返回 str 子字符串 从第 3 个字符开始,一共 6 个字符的内容。(字符串从 1 开始)
算数操作符号
+  加
-  减
*  乘
/  除
(默认数字计算采用 BIGINT 格式,并将字符串转换为数字格式后计算,无法有效转换时字符串视为 0 并返回 Warnings)
日期和时间处理函数
AddDate() 增加一个日期(天、周等)
AddTime() 增加一个时间(时、分等)
CurDate() 返回当前日期
CurTime() 返回当前时间
Date() 返回日期时间的日期部分
DateDiff() 计算两个日期之差
Date_Add() 高度灵活的日期运算函数
Date_Format() 返回一个格式化的日期或时间串
Day() 返回一个日期的天数部分
DayOfWeek() 对于一个日期,返回对应的星期几
Hour() 返回一个时间的小时部分
Minute() 返回一个时间的分钟部分
Month() 返回一个日期的月份部分
Now() 返回当前日期和时间
Second() 返回一个时间的秒部分
Time() 返回一个日期时间的时间部分
Year() 返回一个日期的年份部分
数值处理函数
Abs() 返回一个数的绝对值
Cos() 返回一个角度的余弦
Exp() 返回一个数的指数值
Mod() 返回除操作的余数
Pi() 返回圆周率
Rand() 返回一个随机数
Sin() 返回一个角度的正弦
Sqrt() 返回一个数的平方根
Tan() 返回一个角度的正切

聚集函数(aggregate function) 运行在行组上,计算和返回单个值的函数。
默认对所有的行执行计算。默认指定 ALL 参数或不给参数(因为 ALL 是默认行为)

COUNT() 返回某列的行数
SUM()   返回某列值之和(忽略值为 Null 的行)
AVG()   返回某列的平均值
MAX()   返回某列的最大值
MIN()   返回某列的最小值
DISTINCT 参数 只包含行组内不同的值(去除重复), 例如 ( AVG(DISTINCT,str) ) 
使用 DISTINCT 必须使用列名,不能用于计算或表达式(比如 *)。

6 、 SELECT 命令 与 GROUP 子句

GROUP BY 子句指
示 MySQL 按 vend_id 排序并分组数据。这导致对每个 vend_id 而不是整个表
计算 num_prods 一次。

SELECT * FROM * WHERE * GROUP BY * HAVING * ORDER BY * LIMIT *


StarryVoid

Have a good time