网站建设中,中国大陆地区请使用VPN访问,欢迎提建议,关注LSKR Mastodon

mysql入门学习笔记详解数据库

探索MySQL数据库管理系统的全面指南。学习数据类型、表操作、查询语句和常见问题解决方案,适用于初学者提升数据库技能。


Mysql 学习笔记

简介

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 数据库软件是一个客户端/服务器系统,由一个支持不同后端的多线程 SQL 服务器、几个不同的客户端程序和库、管理工具和广泛的应用程序编程接口 (API) 组成。

终端管理命令:mysqladmin

MariaDB 代替,MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。开发这个分支的原因之一是:甲骨文公司收购了 MySQL 后,有将 MySQL 闭源的潜在风险,因此社区采用分支的方式来避开这个风险。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品

关系型数据的组成

在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:

数据库: 数据库是一些关联表的集合。

数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。

列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。

行:==一行(=元组,或记录)==是一组相关的数据,例如一条用户订阅的数据。

冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。

主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。

外键:==外键用于关联两个表==。

复合键:复合键(组合键)将多个列作为一个索引键,一般用于==复合索引==。

索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。

参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

.img

安装

参考APT安装方式的文档

$> sudo apt-get install mysql-server

安装后自动开启。

查看安装状态

$> systemctl status mysql

.image-20220405164945168

查看帮助

$> mysql --help

发生错误

ERROR 1045 (28000): Access denied for user 'neon'@'localhost' (using password: YES)

使用root 用户 解决,权限不够造成的

mysql -u root -p ###登录成功
mysql -h host -u user -p menagerie[数据库] ### 登录后,直接访问指定的数据库

退出

mysql> exit

访问数据库

查看数据库

SHOW DATABASES;

.image-20220405170849608

说明:mysql数据库描述用户访问权限

创建数据库

CREATE DATABASE menagerie;

如何访问数据库

USE mysql[数据库名称];

命令结尾没有分号

删除数据库

drop DATABASE [数据库]

数据类型

大致可以分为三类:数值、日期/时间和字符串(字符)类型;

数值类型

MySQL 支持所有标准 SQL 数值数据类型。

TINYINT1 Bytes(-128,127)(0,255)小整数值
SMALLINT2 Bytes(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 Bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4 Bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 Bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 Bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值
DOUBLE8 Bytes(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值
DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型大小用途
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-4 294 967 295 bytes极大文本数据

注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

数据库中表

MySQL数据表需要以下信息:

  • 表名

  • 表字段名

  • 定义每个表字段

查看表相关信息

USE [数据库名称];
SHOW TABLES;

查看数据表的相关信息

显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息

SHOW COLUMNS FROM [数据表];

显示数据表的详细索引信息

SHOW INDEX FROM [数据表];

创建表

创建语句格式:CREATE TABLE table_name (column_name column_type);

后面追加的表示字段属性

CREATE TABLE IF NOT EXISTS `runoob_tbl`(
  `runoob_id` INT UNSIGNED AUTO_INCREMENT,
  `runoob_title` VARCHAR(100) NOT NULL,
  `runoob_author` VARCHAR(40) NOT NULL,
  `submission_date` DATE,
  PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

NOT NULL如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。

AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。

PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。

ENGINE 设置存储引擎,CHARSET 设置编码。编码表示将数值存储的,进行编码,最后的读取的编码的方式。

实际使用过程

实例

以下为创建数据表 runoob_tbl 实例:

root@host### mysql -u root -p
Enter password:*******
mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_tbl(
  -> runoob_id INT NOT NULL AUTO_INCREMENT,
  -> runoob_title VARCHAR(100) NOT NULL,
  -> runoob_author VARCHAR(40) NOT NULL,
  -> submission_date DATE,
  -> PRIMARY KEY ( runoob_id )
  -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.16 sec)
mysql>

注意:MySQL命令终止符为分号 ;

删除表

Drop table [table name]

插入数据

格式:

INSERT INTO table_name ( field1, field2,...fieldN )
                      VALUES
                      ( value1, value2,...valueN );

使用箭头标记 -> 不是 SQL 语句的一部分,它仅仅表示一个新行,如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写 SQL 语句,SQL 语句的命令结束符为分号 ;

表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值

实例

mysql> INSERT INTO runoob_tbl
   -> (runoob_title, runoob_author, submission_date)
   -> VALUES
   -> ("JAVA 教程", "RUNOOB.COM", '2016-05-06');

我们并没有提供 runoob_id 的数据,因为该字段我们在创建表的时候已经设置它为 AUTO_INCREMENT(自动增加) 属性

查询数据

格式:

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]

查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。

SELECT 命令可以读取一条或者多条记录。

你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据

你可以使用 WHERE 语句来包含任何条件。

你可以使用 LIMIT 属性来设定返回的记录数。

Where 条件

格式:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....

条件连接符号

你可以使用 AND 或者 OR 指定一个或多个条件。

操作符描述实例
=等号,检测两个值是否相等,如果相等返回true(A = B) 返回false。
<>, !=不等于,检测两个值是否相等,如果不相等返回true(A != B) 返回 true。
>大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true(A > B) 返回false。
<小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true(A < B) 返回 true。
>=大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true(A >= B) 返回false。
<=小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true(A <= B) 返回 true。

UPDATE

格式:UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]

mysql> UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3;
Query OK, 1 rows affected (0.01 sec)

DELETE

格式:DELETE FROM table_name [WHERE Clause]

LIKE字句,在条件设置中使用通配符

LIKE用于在Where 子句中使用,通配符

与正则表达式的区别是: REGEXP用于正则表达式,LIKE仅仅用于通配符

通配符表

通配符描述
%替代 0 个或多个字符
_替代一个字符
[charlist]字符列中的任何单一字符
[^charlist] 或 [!charlist]不在字符列中的任

实例

mysql> use RUNOOB;
Database changed
mysql> SELECT * from runoob_tbl  WHERE runoob_author LIKE '%COM';

UNION 操作符

将多个表中查询结果集放入到一起输出

连接两个以上的 SELECT 语句的结果组合到一个结果集合。

格式:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

将一个两个表中的数据整合输出到一个集合体中。

expression1, expression2, ... expression_n: 要检索的列。

tables:要检索的数据表。

WHERE conditions:可选, 检索条件。

DISTINCT:可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。

ALL: 可选,返回所有结果集,包含重复数据。

排序

ORDER BY格式:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]

你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。

你可以设定多个字段来排序

你可以使用 ASCDESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。

你可以添加 WHERE...LIKE 子句来设置条件。

分组

GROUP BY格式:

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

选择一列,然后根据分组结果调用处理函数。

根据某一列的结果,对其进行分区。

.image-20220405213406699

JOIN

根据表之间数据连接关系来获取结果集

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。

LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。

RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

NULL值的处理方式

MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。

为了处理这种情况,MySQL提供了三大运算符

IS NULL: 当列的值是 NULL,此运算符返回 true
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true
<>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true

关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。

在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 NULL,即 NULL = NULL 返回 NULL 。

MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符。

NULL 即指的是空值

ALTER 表格的修改

修改数据表名,以及数据的字段名

删除字段(一列)

ALTER TABLE [table name ] DROP [字段名称]

添加字段(新增一列)

ALTER TABLE [table name ] ADD [字段名] [数据类型] [FIRST] [AFTER 字段]

FIRST第一列,[AFTER 字段] 在某一列后面

修改字段类型

ALTER TABLE [table name ] MODIFY [字段名称] [新的数据类型];

修改字段名称

ALTER TABLE testalter_tbl CHANGE [原来字段] [新字段名称] [新字段数据类型];

修改字段的属性:NULL或者默认值

修改表格的字段j 为NOT NULL且默认值 100

ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100;

设置默认值

ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

删除默认值

ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

查询表

正则表达式

MySQL可以通过 LIKE ...% 来进行模糊匹配。

MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。

MySQL 函数

MySQL 有很多内置的函数,以下列出了这些函数的说明。

MySQL 运算符

算术运算符

比较运算符

逻辑运算符

位运算符

总结

在学习使用MySQL 的时候,更多的是学习了关于SQL常见的增删改查相关内容。

这一步内容更多的是和SQL注入有关,而更多的使用方式,这里并不涉及。

参考文档

[1] mysql指导文档

[2] MySQL 菜鸟教程

[3] MySQL 教程



发表评论

Cookie Consent
我们使用 Cookie 来了解您如何使用我们的网站并提升您的体验。这包括个性化内容和广告。
Oops!
It seems there is something wrong with your internet connection. Please connect to the internet and start browsing again.
AdBlock Detected!
We have detected that you are using adblocking plugin in your browser.
The revenue we earn by the advertisements is used to manage this website, we request you to whitelist our website in your adblocking plugin.
Site is Blocked
Sorry! This site is not available in your country.