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 教程



发表评论

0 评论