1 MySQL环境搭建

采用MySQL数据库系统来使用SQL。下面是在Windows系统上安装MySQL的流程记录。

1) MySQL下载

首先到MySQL官网上下载社区版软件,下载地址:here,选择“mysql-installer-community-8.0.28.0.msi”对应的download,如下图。

然后,选择No thanks, just start my download.直接开始下载。(不用登录)

好像在官网下载很慢很慢(我的就很慢),去datawhale的百度网盘链接中下载吧:link,提取码:80lf

2) MySQL安装

点击msi安装文件,选择full模式安装,然后进行下图所示的步骤:

finish之后就直接next继续完成下面的步骤:

点击execute进行安装就好了。

接下来一路默认,直到Type and Networking部分,勾选上Show Advanced and Logging Options,继续。在Authentication Method部分采用第二种认证方式,如下图:

接下来一路执行下去(默认配置)直到finish,完成。

2 SQL入门

1) 数据库简介

随着计算机的广泛使用,有很多数据需要被存储起来,那么数据库(Database)就出现了。其实数据的存储形式和操作方法多种多样,但 使用最广泛也最容易理解的应该就是关系数据库(relational database),可以理解为一个存储了很多Excel表的地方。(关于其他类型的数据库可以用到时再去search。)

2)SQL

Structured Query Language (SQL)也就是结构化查询语言,它就是和上面的关系数据化进行交流的语言,利用SQL语言可以对数据进行各种操作。

与其他类型数据库相比,使用SQL语言更容易理解,也能同时分析多个表,以及分析一些复杂的问题。SQL能够让你快速获得数据的一些结果。

下面是利用SQL进行的常用操作。

a. 创建数据库和数据表

  • 创建数据库:CREATE DATABASE 库名;

    1
    CREATE DATABASE shop;
    使用上述命令创建了一个名为shop的数据库,可以在该数据库里面建表来存储数据。

  • 创建数据表:CREATE TABLE 表名 ( 列名1 数据类型 该列所需约束, 列名2 数据类型 该列所需约束, 列名3 数据类型 该列所需约束, ...);

1
2
3
4
5
6
7
8
CREATE TABLE product
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));

通过上述的SQL语句创建了一个二维表,如下图所示:

行也叫做记录,列也叫做字段。

其中,CHARVARCHARINTEGERDATE是列将要存储的数据类型,解释如下表所示,在创建数据表时所有的列都必须指定数据类型,每一列都不能存储与该列数据类型不符的数据。

数据类型 解释
INTEGER 用来指定存储整数的列的数据类型(数字型),不能存储小数。
CHAR 用来存储定长字符串,当列中存储的字符串长度达不到最大长度的时候,使用半角空格进行补足,由于会浪费存储空间,所以一般不使用。
VARCHAR 用来存储可变长度字符串,定长字符串在字符数未达到最大长度时会用半角空格补足,但可变长字符串不同,即使字符数未达到最大长度,也不会用半角空格补足。
DATE 用来指定存储日期(年月日)的列的数据类型(日期型)。

创建表的时候还在列的最后加入了约束,其中,NOT NULLPRIMARY KEY是对列的数据进行限制。约束能够确保数据库中数据的正确性和有效性,如下表所示。

约束 解释
NOT NULL 非空约束,保证列中数据不能有 NULL 值
UNIQUE 唯一约束,保证列中的所有数据各不相同
PRIMARY KEY 主键约束,唯一标识数据表中的行(记录)
FOREIGN KEY 外键约束,唯一标识该表中引用的其他表中的行(记录),它对应的列是其他表中的主键列
DEFAULT 默认值约束,提供该列数据未指定时所采用的默认值
CHECK 检查约束,保证列中的所有值满足某一条件

b. 增删查改

  • 增:向表中插入数据

1
INSERT INTO 表名 (列1, 列2, 列3, ……) VALUES (值1, 值2, 值3, ...);  

对表进行全列 INSERT 时,可以省略表名后的列清单。这时VALUES子句的值会默认按照从左到右的顺序赋给每一列。

例子:

1
2
3
4
-- 包含列清单
INSERT INTO productins (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
-- 省略列清单
INSERT INTO productins VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');  
--

  • 查:查询数据
1
2
3
SELECT <列名>, ...
FROM <表名>
WHERE <条件表达式>, ...;

具体的先不展开。

  • 改:修改数据

1
2
3
4
5
UPDATE 表名
SET 列名1 = 表达式1, 列名2 = 表达式2, ...;  
WHERE 条件;  -- 可选。
ORDER BY 子句; --可选
LIMIT 子句; --可选

使用 update 时要注意添加 where 条件,否则将会将所有的行按照语句修改

例子,

1
2
3
4
UPDATE product
SET sale_price = sale_price * 10,
purchase_price = purchase_price / 2
WHERE product_type = '厨房用具';  
--

  • 删:删除数据

DROP,删除某个表:

1
DROP TABLE 表名;
DROP语句删除表结构、所有数据及关联的触发器,并将表所占用的空间全部释放。

例子:

1
DROP TABLE product;
DELETE,删除表中的记录:

1
DELETE FROM 表名 WHERE COLUMN_NAME='列名';

一定注意添加WHERE条件,否则将会删除所有的数据,但是表还在。

DELETE语句删除记录(行数据),可以是某几行,也可以是所有行。

TRUNCATE,删除所有数据:

1
TRUNCATE TABLE TABLE_NAME;

TRUNCATE语句仅删除表内所有数据,等同于不带WHERE条件的DELETE语句。(表还在)

关于执行速度:drop > truncate > delete

c. 索引

索引就是指向表中数据的指针,数据库的索引和书籍的索引非常相像。例如, 如果想要查阅一本书中与某个特定主题相关的所有页面,你会先去查询索引(索引按照字母表顺序列出了所有主题),然后从索引中找到一页或者多页与该主题相关的页面。

创建索引的命令:

1
2
3
4
5
-- 方法1
CREATE INDEX 索引名 ON 表名 (列名)

-- 方法2
ALTER table 表名 ADD INDEX 索引名(列名)
或者,在创建表的时候直接给列加索引:
1
2
3
4
5
CREATE TABLE mytable(  
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [索引名] (username(length))
);
关于索引分类:

  • 主键索引

    建立在主键上的索引被称为主键索引,一张数据表只能有一个主键索引,索引列值不允许有空值,通常在创建表时一起创建。

  • 唯一索引

    建立在UNIQUE字段上的索引被称为唯一索引,一张表可以有多个唯一索引,索引列值允许为空,列值中出现多个空值不会发生重复冲突。

  • 普通索引

    建立在普通字段上的索引被称为普通索引。

  • 前缀索引

    前缀索引是指对字符类型字段的前几个字符或对二进制类型字段的前几个bytes建立的索引,而不是在整个字段上建索引。前缀索引可以建立在类型为char、varchar、binary、varbinary的列上,可以大大减少索引占用的存储空间,也能提升索引的查询效率。

  • 全文索引

    利用“分词技术”实现在长文本中搜索关键字的一种索引。 语法:SELECT * FROM article WHERE MATCH (col1,col2,...) AGAINST (expr [ search _ modifier ]) _

3) 补充

a. SQL语句书写注意

SQL语句要以分号(;)结尾

SQL不区分关键字的大小写,但是插入到表中的数据是区分大小写的

Windows系统默认不区分表名及字段名的大小写

linux / mac 默认严格区分表名及字段名的大小写

常数的书写方式是固定的

在 SQL 语句中直接书写的字符串、日期或者数字等称为常数。常数的书写方式如下所示:

  • SQL 语句中含有字符串的时候,需要像 'abc' 这样,使用英文单引号'将字符串括起来,用来标识这是一个字符串。

  • SQL 语句中含有日期的时候,同样需要使用英文单引号将其括起来。日期的格式有很多种('26 Jan 2010' 或者'10/01/26' 或者'2020-01-26')。

  • 在 SQL 语句中书写数字的时候,不需要使用任何符号标识,直接写成 1000 这样的数字即可。

单词需要用半角空格或者换行来分隔

SQL 语句的单词之间需使用半角空格或换行符来进行分隔,且不能使用全角空格作为单词的分隔符,否则会发生错误,出现无法预期的结果。

b. 练习题

  1. 编写一条 CREATE TABLE 语句,用来创建一个包含下表中所列各项的表 Addressbook (地址簿),并为 regist_no (注册编号)列设置主键约束。

    Solution:

    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE Addressbook(
    regist_no INTEGER NOT NULL,
    `name` VARCHAR(128) NOT NULL,
    `address` VARCHAR(256) NOT NULL,
    tel_no CHAR(10),
    mail_address CHAR(20),
    PRIMARY KEY (regist_no)
    );
    MySQL Workbench中执行后如图:

  2. 假设在创建练习1中的 Addressbook 表时忘记添加如下一列 postal_code (邮政编码)了,请编写 SQL 把此列添加到 Addressbook 表中。

    列名 : postal_code

    数据类型 :定长字符串类型(长度为 8)

    约束 :不能为 NULL

    Solution:

    1
    ALTER TABLE Addressbook ADD COLUMN postal_code CHAR(8) NOT NULL;
    MySQL Workbench中执行后如图:

  3. 填空题

    请补充如下 SQL 语句来删除 Addressbook 表。

    1
    DROP table Addressbook;
  4. 判断题

    是否可以编写 SQL 语句来恢复删除掉的 Addressbook 表?

Solution:是,重新建表重新插入数据。

参考

  • https://www.knowledgedict.com/tutorial/mysql-index.html
  • https://www.w3cschool.cn/sql/cuj91oz2.html
  • https://github.com/datawhalechina/wonderful-sql