我的MySQL学习笔记

前言

欢迎你来阅读我的这篇文章,这是我浓缩了 《MySQL 必知必会》 上的内容所编写的一篇快速入门文章,注意在学习该文章的时候一定要搭配实践,不然的话单看是没有效果的,有时间我会给这篇文章加上实践的,如果访问量够大那么我这几天就加上

数据类型

MySQL 中数据字段的类型对数据库的优化很重要,错误的数据类型会严重影响应用的功能和性能

数值类型

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

除了BITBOLLEAN以外其他的数值类型都有有符号和无符号两种状态
默认都是有符号,如果不需要存储负值可以使用 UNSIGNED 关键字,这样可表示的数值增大一倍
有符号的数值类型可以表示正数和负数,而无符号的数值类型只能表示正数

数据类型 有符号范围 无符号范围 说明
BIT 位字段,1~64位
TINYINT -128~127 0~255 整数值
SMALLINT -32768~32767 0~65535 整数值
MEDIUMINT -8388608~8388607 0~16777215 整数值
INT 或 INTEGER -2147483648~2147483647 0~4294967295 整数值
BIGINT -9223372036854775808~9223372036854775807 0~18446744073709551615 整数值
REAL 4字节的浮点值
FLOAT 单精度浮点数
DOUBLE 双精度浮点数
DEC 或 DECIMAL 精度可变的浮点数
BOOL 或 BOOLEAN TRUE 或 FLASE TRUE 或 FLASE 布尔标志

串类型

最常用的数据类型就是串类型,串类型有两种基本的类型,分别为定长串和变长串

定长串存储长度固定的字符串,长度是在创建表的时候指定的
变长串存储长度可变的字符串,有些变长串是完全变长,有些具有最大的定值长度无法超过定值

数据库处理定长串的速度比处理变长串的速度快得多

数据类型 说明
CHAR 1~255个字符的定长串,它的长度要在创建时指定,否则MySQL将假定为 CHAR(1)
VARCHAR 长度可变,但是最多不超过255字节,如果在创建时指定为 VARCHAR(n) 则可以存储0到n个字符的变长串(n<=255)
TINYTEXT 最大长度为 255B 的变长文本
MEDIUMTEXT 最大长度为 16KB 的变长文本
TEXT 最大长度为 64KB 的变长文本
LONGTEXT 最大长度为 4GB 的变长文本

不管是何种类型的串类型,串值都必须在引号内(单双引号都可以,通常单引号更好)

如果数值是计算中使用的数值,则应该存储在数值数据类型中,如果是作为字符串使用,则应该保存在串数据类型列中

日期和时间类型

MySQL中使用特殊的类型来存储日期和时间

数据类型 说明
DATE 表示从 1000-01-01 ~ 9999-12-31 的日期,格式为 YYYY-MM-DD
TIME 格式为 HH:MM:SS
DATETIME DATE和TIME的组合 格式为 YYYY-MM-DD HH:MM:SS
TIMESTAMP DATE和TIME的组合,比DATETIME小一些,表示从 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 的时间,格式为 YYYY-MM-DD
YEAR 用两位数字表示,范围是70(1970年)~69(2069年),用四位数字表示,范围是1910年到2155年

二进制数据类型

二进制数据类型可以存储任何数据,如图像、多媒体、压缩文件等等

数据类型 最大长度
TINYBLOB 255 Byte
BLOB 64 KB
MEDIUMBLOB 16 MB
LONGBLOB 4 GB

小结

数据类型已经全部总结了,如果有错误或者有遗漏的可以在下方评论区提出来
表中数据类型的搭配对于表的性能有很大的影响,在设计表的时候应该慎重选择数据类型

数据库

创建数据库

在登录MySQL服务器之后可以使用CREATE DATABASE创建数据库

1
CREATE DATABASE 数据库名字;

如果数据库已经存在执行该语句将导致错误

选择数据库

最初登录到MySQL服务器之后没有数据库打开供我们使用,而在执行其他操作之前我们必须要选择一个数据库,此时我们可以使用 USE 语句选择数据库

1
USE 数据库名字;

执行成功将输出

1
Database changed

删除数据库

在MySQL中要删除已创建的数据库可以使用DROP DATABASE语句

1
2
3
4
-- 删除数据库
DROP DATABASE 数据库名字;
-- 如果数据库存在就删除
DROP DATABASE IF EXISTS 数据库名字;

IF EXISTS是一个可选的子句,表示如果数据库存在就删除,避免因为数据库不存在而产生错误

注意!在执行任何删除操作时一定要三思而后行,不要等到数据被删除后再追悔莫及

关于创建、更新、删除表的基本操作

创建表

MySQL中创建表有两种方法

  • 使用MySQL语句创建
  • 使用MySQL管理工具创建,但是其本质上还是MySQL语句
    我们这里使用MySQL语句CREATE TABLE创建表
  • 表的名字要跟在 CREATE TABLE 后面
  • 列的名字和定义要使用 “,” 分开
    示例
1
2
3
4
5
6
7
8
9
10
CREATE TABLE users
(
user_id VARCHAR(10) NOT NULL,
user_name VARCHAR(12) NOT NULL,
user_email VARCHAR(50) NULL DEFAULT 'zjh_34@qq.com',
user_age TINYINT UNSIGNED NULL,
user_image MEDIUMBLOB NULL,
user_create_date DATA NULL,
PRIMARY KEY (user_id)
) ENGINE=InnoDB;

NULL 和 NOT NULL

为什么在数据类型后面还跟了NOT NULLNULL呢?
NOT NULL表示的意思是这个字段的值不能为NULL
NULL的意思相反,表示这个字段的值可以为NULL

默认值

user_email后面的DEFAULT 'zjh_34@qq.com'的意思是是什么呢?看到这个单词你应该就能猜出来了吧
不要自我怀疑,这个子句就是设置默认值的,这个子句设置了user_email的默认值为zjh_34@qq.com

主键

可以通过PRIMARY KEY语句设置主键PRIMARY KEY不只能设置一个主键,也可以设置多个主键,使用方式如下

1
PRIMARY KEY (字段名1,字段名2,字段名...)

数据库引擎

==这个容我偷偷懒晚些写😁==

更新表

更新表可以使用ALTER TABLE语句,按照常理来说我们的表在设计时应该考虑好,在设计好之后不应有大规模的改动
来,举个添加列的栗子给你看看

1
2
ALTER TABLE users
ADD user_city VARCHAR(40);

在这个栗子里我们给前面创建的users表添加了一个名为user_city的列
既然可以添加列,那么我们肯定也能删除列
删除我们刚才添加的列可以这样做

1
2
ALTER TABLE users
DROP COLUMN user_city;
注意!使用ALTER TABLE语句的时候要极为注意,如果增加了不需要的列可能会无法删除它们,如果删除了不应该删除的列,可能会丢失列中的所有数据

==定义外键,晚些写==

重命名表

重命名表可以使用RENAME TABLE语句
举个栗子

1
RENAME TABLE 表名 TO 新表名

也可以通过下面这种方式重命名多个表

1
2
3
RENAME TABLE 表名1 TO 新表名1,
表名2 TO 新表名2,
...;

删除表

删除表可以使用DROP TABLE语句,这个语句是删除整张表,并非它的内容,这个语句非常简单,看栗子吧

1
DROP TABLE 表名;

这个语句删除了一个表(如果这个表存在的话),删除表没有确认,不能撤销,在执行这条语句后将永久删除该表

小结

学习了创建、更新、重命名、删除表语句
CREATE TABLE用来创建新表
ALTER TABLE用来改变表列
RENAME TABLE用来重命名表
DROP TABLE用来删除表

数据

检索数据

最经常使用的检索数据的SQL语句就是SELECT语句了,在这里我将会讲一些常用的SELECT语句的用法

检索单个列

我们从一个简单的检索单列数据的SQL语句开始

1
2
SELECT user_name
FROM users;

这个SQL语句的意思是从users表中检索出名为user_name的列
输出如下

1
2
3
4
5
6
7
+-------------+
| user_name |
+-------------+
| SLow |
| Finish |
| Do not back |
+-------------+

检索多个列

如果想要检索多个列的数据也是很简单的,请看栗子

1
2
SELECT user_name,user_email
FROM users;

这个栗子我们检索了user_nameuser_email这两列,列名之间用逗号(,)分隔,输出如下

1
2
3
4
5
6
7
+-------------+-----------------+
| user_name | user_email |
+-------------+-----------------+
| SLow | zjh_345@qq.com |
| Finish | zjh_3456@qq.com |
| Do not back | zjh_34@qq.com |
+-------------+-----------------+

检索所有列

我们如果想要检索所有的列的时候不必一个一个输入列名,可以使用在列名的位置使用通配符(*)来达到

1
2
SELECT *
FROM users;

输出如下

1
2
3
4
5
6
7
+---------+-------------+-----------------+----------+------------------------+------------------+
| user_id | user_name | user_email | user_age | user_image | user_create_date |
+---------+-------------+-----------------+----------+------------------------+------------------+
| c34v32 | SLow | zjh_345@qq.com | 18 | NULL | NULL |
| j34x54 | Finish | zjh_3456@qq.com | 23 | NULL | NULL |
| z34x67 | Do not back | zjh_34@qq.com | 23 | NULL | NULL |
+---------+-------------+-----------------+----------+------------------------+------------------+

过滤数据

过滤数据我们可以使用WHERE子句,先看栗子

1
2
3
SELECT *
FROM users
WHERE user_email = 'zjh_34@qq.com';

这个语句检索所有列,但是只返回user_email等于zjh_34@qq.com的行,输出如下

1
2
3
4
5
+---------+-------------+---------------+----------+------------------------+------------------+
| user_id | user_name | user_email | user_age | user_image | user_create_date |
+---------+-------------+---------------+----------+------------------------+------------------+
| z34x67 | Do not back | zjh_34@qq.com | 23 | NULL | NULL |
+---------+-------------+---------------+----------+------------------------+------------------+

WHERE子句的操作符

操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 介于(在指定的两个值之间)

范围值检查

需要检查某个范围的值时,我们可以使用BETWEEN操作符,其语法与其他的操作符不同,因为它需要两个值
下面这个栗子说明如何使用BETWEEN操作符,它会检索年龄在18到27之间的所有用户

1
2
3
SELECT *
FROM users
WHERE user_age BETWEEN 18 AND 27;

在使用BETWEEN必须要指定两个值,检索范围的最小值和最大值,这两个值必须使用AND关键字分隔

空值检查

SELECT有一个特殊的WHERE子句可以用来检查值为NULL的列,其语法如下

1
2
3
SELECT *
FROM users
WHERE user_email IS NULL;

这条语句将返回没有邮箱地址的所有行

插入数据

INSERT是SQL中比较重要的语句,它的作用是插入(或添加)行到表中

插入单行数据

下面的栗子插入了新的一行到了表中

1
2
3
4
5
6
7
8
9
INSERT INTO users 
VALUES(
'j34x54',
'Finish',
'zjh_3456@qq.com',
23,
NULL,
NULL
);

这便向表中插入了新的一行,当然还有一种更安全的方法,请看栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INSERT INTO users(
user_id,
user_name,
user_email,
user_age,
user_image,
user_create_date
)
VALUES(
'f34d34',
'Echo.',
'zjh_34531@qq.com',
24,
NULL,
NULL
);

这个栗子完成了和前一个INSERT语句相同的工作,但是在表名的后面的括号里面明确的给出了列名,应为提供了列名所以VALUES必须以其指定的次序匹配指定的列名,它的有点事表的结构更改,此INSERT语句仍然能够正确工作

插入多行数据

INSERT可以插入一行到一个表中,但是如果想要插入多个行怎么办?
可以使用一种方法,那就是使用多条INSERT语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
INSERT INTO users(
user_id,
user_name,
user_email,
user_age,
user_image,
user_create_date)
VALUES(
'f34d34',
'Echo.',
'zjh_34531@qq.com',
24,
NULL,
NULL
);
INSERT INTO users(
user_id,
user_name,
user_email,
user_age,
user_image,
user_create_date)
VALUES(
'j34x54',
'Finish',
'zjh_3456@qq.com',
23,
NULL,
NULL
);

上一种方法看起来可能繁琐了些,你可以使用下面这种方法,请看栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
INSERT INTO users(
user_id,
user_name,
user_email,
user_age,
user_image,
user_create_date
)
VALUES(
'f34d34',
'Echo.',
'zjh_34531@qq.com',
24,
NULL,
NULL
),
(
'j34x54',
'Finish',
'zjh_3456@qq.com',
23,
NULL,
NULL
);

虽然第二种方法比第一种简洁一点,但是第一种插入语句的速度比第二中插入语句的速度快

更新数据

更新(修改)表中的数据可以使用UPDATE语句

==注意,在使用UPDATE的时候一定要注意细心,应为稍不注意可能就会更新(修改)表中的所有行==

UPDATE很容易使用,来,上栗子!

1
2
3
UPDATE users
SET user_id = 'o11n4514'
WHERE user_id = 'c34v32';

UPDATE后面跟的是要更新(修改)的表的名字,在这个栗子中要更新的是user_idc34v32的用户的user_id使用SET子句将其设置成指定值
那么该如何修改多个列呢?还是看栗子

1
2
3
4
UPDATE users
SET user_name = 'Ethan',
user_email = 'zjh3442@qq.com'
WHERE user_id = 'j34x54';

这个栗子中更新user_idj34x54user_emailuser_id

删除数据

从表中删除数据可以使用DELETE语句,看栗子

1
2
DELETE FROM users
WHERE user_id = 'z34x67';

DELETE FROM指定删除数据的表名,使用WHERE过滤要删除的行
那么该如何删除所有数据呢?
你可以在不删除表的情况下,删除表中所有的行。这意味着表结构、属性、索引将保持不变
==在删除记录时要格外小心!因为您不能重来==

1
DELETE FROM user;

结语

这篇MySQL学习笔记是我浓缩了我这几天学到的MySQL知识写出来了,当然还不是很完善,可能有些地方比较重要但是我漏写了,你可以在下面的评论区提出来,我补上,下次我的学校放月假了我会更新一篇SQL基础知识,在里面讲解一些SQL中的概念,比如什么是字段?什么是数据库?之类的。好了,这篇笔记到此结束,听一首歌吧