前端 MySQL 入门 (上)

159 阅读12分钟

前言

    作为一个前端,有时候和后端联调总需要后端给造数据,后端如果比较忙,没空搞,那就只能自己 mock,但 mock 数据往往会存在漏掉交互场景的情况,导致漏测场景而产生交互 bug。所以掌握一些基础 sql 语法,有需要的时候自己造数据还是很有必要的。以下绝大部分内容都来自《MySQL必知必会》这本书。(当然,demo 除外,也推荐大家在学习mysql 的时候自己敲一遍语句。)

一、了解SQL

1.1 数据库基础

1.1.1 什么是数据库(databse,DB)

数据库是一个以某种组织的方式存储的数据集合。(DBMS 是数据库管理系统,和DB不是一回事)

1.1.2 表(table)

表:一种结构化文件,可用来存储某种特定类型的数据。

模式 (schema): 描述表的特性。

1.1.3 列(column)和数据类型

列:表中的一个字段,所有表都是一个或多个列组成的

1.1.4 行(row)

行:表中的一个记录。(也有说法称行为数据库记录)

1.1.5 主键(primary key)

主键:一列(或一组列),其值能唯一区分表中的每个行。表中的每一行都应该有可以为一标识自己的一列(或一组列)。

表中人列都可以作为主键,只要满足以下条件:

1、任意两行都不具有相同的主键值

2、每个行都必须有一个主键值(主键列不允许NULL值)

好的习惯:

1、不更新主键列中的值

2、不重用主键列的值

3、不在主键列中使用可能会更改的值(例如使用名字就不好,名字容易被改)

1.2 什么是SQL

SQL是结构化查询语言(Structured Query Language) 的缩写。是一种专门用来与数据库通信的语言。

二、MySQL简介

2.1 什么是MySQL

MySQL是一种DBMS(DataBase Manage System),即它是一种数据库管理软件。

2.2.1 客户机-服务器软件

DBMS分为两类:一类 是基于共享文件系统的DBMS,另一类是基于客户机-服务器的DBMS。

MySQL数据库就是基于客户机-服务器的数据库。

2.2 MySQL工具

mysql 命令行实用程序,是核心MySql安装的一部分。

还有其他图形交互客户机,比如MySQL Adminstrator、MySQL Query Browser,不是MySQL核心安装的一部分。

三、使用MySQL

3.1 连接

连接MySQL需要:

1、主机名——如果连接到本地MySQL服务器,为localhost;

2、端口,默认3306

3、一个合法的用户名

4、用户口令(密码)

3.2 选择数据库

use + 数据库名 // 必须先使用use 打开数据库,才能读取器中的数据

3.3 了解数据库和表

show databases; // 返回可用数据列表,注意结尾的's' 和 ‘;’

show tables; // 返回当前数据库内的表的一个列表

show columns from 表名; (快捷方式 describe + 表名;) // 显示表的所有列信息

help show; // 显示show 命令的所有用法

1、多条sql语句必须以(;) 分隔

2、使用MySQL命令行必须每条语句加封号,其他的DBMS没要求,最好都加封号

3、SQL语句不区分大小写。但是好的习惯是SQL关键字都大写,所有列和表名小写

4、SQL语句所有空格都被忽略,好的习惯是分成多行,这样更容易理解

四、检索数据

4.1 select 语句

SQL语句由简单的英语单词(关键字)组成。

select语句的作用是从一个或多个表中检索信息。

4.2 检索单个列

select 列名 from 表名;// 从某个表中检索出某列

4.3 检索多个列

SELECT 列1, 列2, 列3 FROM 表名; // 列名之间用逗号,最后一列不能用逗号

4.4 检索所有列

SELECT * FROM 表名;

除非确实需要所有列,否则不用通配符,虽然这样会省事,但是通常会降低索引和应用程序的性能。

4.5 检索不同的行(DISTINCT)

前提:products表里的vend_id 列有很多重复的供应商id。如果下边这句不加 DISTINCT 关键字,就会检索出当前列的所有行。
SELECT DISTINCT vend_id FROM products;
// 使用 DISTINCT 关键字,告诉MySQL只返回不用(唯一)的vend_id 行。

// DISTINCT 关键字必须直接放在列名前面

// DISTINCT 关键字 作用于所有检索的列,不能只作用于一列。

// 比如 SELECT DISTINCT vend_id, pro_price from products; 返回的结果是每一整行数据都是唯一的

4.6 限制结果(LIMIT)

SELECT pro_name FROM products LIMIT 5; // 返回不多于5行;

SELECT pro_name FROM products LIMIT 5, 5; // 返回从第5行开始后的5行,LIMIT后面第一个数是开始的位置,第二个数是要检索的行数

// LIMIT 1, 1 检索出来的是第二行。

// LIMIT 3, 4 等同于 LIMIT 4 OFFSET 3; 意为从第三行开始的后面四行

4.7 使用完全限定的表名

SELECT products.pro_name FROM test.products; // 等同于 SELECT pro_name from products;

五、排序检索数据

5.1 排序数据

子句(clause)。SQL语句由子句构成。一个子句通常由一个关键字和所提供的数据组成。
比如:SELECT语句的FROM子句、ORDER BY子句

5.2 按多个列排序

SELECT prod_id, pro_price, pro_name FROM products ORDER BY pro_price, pro_name

5.3 指定排序方向

SELECT pro_id, pro_price, pro_name FROM products ORDER BY pro_price DESC; // 默认是ASC

小例子:

通过ORDER BY 和 LIMIT 组合,找出最大值或最小值。

SELECT pro_price FROM products ORDER BY pro_price DESC LIMIT 1;

六、过滤数据

6.1 使用 WHERE 子句

在 SELECT 语句中,数据根据WHERE子句中指定的搜索条件(也叫过滤条件)进行过滤,WHERE子句在表名(FROM 子句)之后给出,例如:

SELECT pro_name, pro_price FROM products WHERE pro_price = 2.5;

WHERE 子句的位置。在同时使用ORDER BY 和 WHERE 子句时,应该是ORDER BY 在WHERE后面(先过滤再排序)

6.2 WHERE 子句操作符

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

6.2.1 检查单个值

SELECT pro_name, pro_price FROM products WHERE pro_name = 'fuses'; // 执行匹配时不区分大小写

6.2.2 不匹配检查

SELECT vend_id, pro_name FROM products WHERER vend_id <> 1003;

关于引号:如果是字符串,需要单引号,如果是数值比较,则不需要引号

6.2.3 范围值检查

SELECT pro_name, pro_price FROM products WHERE pro_price BETWEEN 5 AND 10;

// 使用BETWEEN时,必须指定起始值和终止值,必须用AND分隔。

6.2.4 空值检查

在创建表时,表设计人员可以指定其中的列是否可以不包含值,一个列不包含值时,称其为包含空值NULL。

特殊的WHERE 子句: IS NULL

SELECT pro_name FROM products WHERE pro_price IS NULL; // 这条语句返回没有价格的产品(空 pro_price 字段,不是价格为0)

NULL 与不匹配: 在匹配过滤或不匹配过滤时,不返回NULL的行(因为数据库不知道它们是否匹配)

七、数据过滤

7.1 组合WHERE子句

MySQl允许给出多个WHRER子句,这些子句可以以两种方式使用:以AND子句的方式或OR子句方式使用。

操作符:用来联结或改变WHERE子句中的子句的关键字。也成为逻辑操作符。

7.1.1 AND操作符

SELECT pro_id, pro_price, pro_name FROM products WHERE vend_id = 1003, AND pro_price > 10;

// 这语句中包含两个条件,并且用 AND 关键字联结它们,它指示DBMS只返回满足所有给定条件的行。可以添加多个条件,每添加一条就要使用一个AND

7.1.2 OR操作符

SELECT pro_price, pro_name FROM products WHERE pro_price = 9.99 OR pro_name = 'product 1';

// 注意 pro_name = 'product 1', 这里是字符串

7.1.3 计算次序

SELECT pro_price, vend_id FROM products WHERE pro_price >= 9.99 AND (vend_id = 1 OR vend_id = 3);

// 选出 products 表中 价格大于等于9.99 且 vend_id = 1 或者 3 的数据

// 默认是AND优先,但是任何时候在AND 和 OR 操作一起使用时,都应该使用圆括号明确的分组

7.2 IN 操作符

圆括号在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。

SELECT pro_name, pro_price FROM products WHERE vend_id IN (1002, 1003) ORDER BY pro_name;

IN 操作符的优点:

1、计算的次序更容易管理(括号里选择多的时候少用很多OR)

2、比一般OR操作符执行更快

3、最大的优点是可以包含其他SELECT语句,使得能更动态的建立WHERE子句

7.3 NOT 操作符

NOT:否定它之后跟的任何条件。

SELECT pro_name, pro_price FROM products WHERE vend_id NOT IN (1001, 1004) ORDER BY pro_name;

// 在与IN操作符联合使用时,NOT 取反找出不匹配的行非常简单

MYSQL 中的NOT
MYSQL 支持NOT 对IN、BETWEEN 和 EXISITS 子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大差别

八、通配符过滤

8.1 LIKE 操作符

通配符:

1、用来匹配值的一部分的特殊字符。

2、通配符本身是SQL的WHERE子句中有特殊含义的字符

3、为在搜索子句中使用通配符,必须使用LIKE操作符。

搜索模式:由字面值、通配符或者两者组合而成的搜索条件

8.1.1 百分号(%)通配符

在搜索串中,% 表示任何字符出现任意次数。

// 从products表中找出以ject开头的产品。
SELECT pro_id, pro_name FROM products WHERE pro_name LIKE 'ject%';

// 通配符可在搜索模式中的任意位置使用,并且可以使用多个通配符
SELECT pro_id, pro_name FROM products WHERE pro_name LIKE '%ject%';

区分大小写:根据MYSQL的配置方式,搜索是可以区分大小写的
通配符“%” 不能匹配 NULL

8.1.2 下划线(_)通配符

与%的区别是只能匹配一个字符

8.2 通配符使用技巧

通配符使用是由代价的,比一般的搜索处理要慢。

1、如果其他操作符能达到目的,就使用其他操作符,尽量不要用通配符

2、在确实需要使用通配符时,尽量不要把通配符置于搜索模式的开始处,这样搜索起来是最慢的。

九、使用正则表达式搜索

MYSQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据。

MYSQL支持的正则表达式仅是正则表达式语言的一个子集。

9.1 基本字符匹配

SELECT pro_name, pro_price FROM products WHREE pro_name REGEXP '1000';

// 使用 REGEXP 关键字,后面跟的是正则表达式 ‘1000’

SELECT pro_name, pro_price FROM products WHREE pro_name REGEXP '.00';
// '.' 表示匹配任意一个字符

如果要区分大小写,可以使用BINARY关键字。

如 WHERE pro_name REGEXP BINARY 'Jetpack .00';

9.2 进行OR匹配

SELECT pro_name FROM poducts WHERE prod_name REGEXP '1000 | 2000' ORDER BY pro_name;

// pro_name 中有1000 或者 2000 的都将被匹配到

9.3 匹配几个字符之一

SELECT pro_name FROM products WHERE pro_name REGEXP 'product [13]';

// pro_name 中有 product 1 或者 product 3 的都被匹配到 , [13] 其实是 [1|3]的缩写,也可以使用后者

9.4 匹配范围

SELECT pro_name FROM products WHERE pro_name REGEXP 'product [1-5]';

9.5 匹配特殊字符

多数正则表达式实现使用单个反斜杠来转义特殊字符,但是MYSQL要去用两个反斜杠(MYSQL自己解释一个,正则表达式库解释另一个)。

除了转义 “. , | []” 等特殊字符,\ 也用来转义元字符

元字符说明
\f换页
\n换行
\r回车
\t制表
\v纵向制表

9.6 匹配字符类

说明
[: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:]任意可打印字符(在 SQL 中,可打印字符是指可以在屏幕上显示的可见字符。)
[:punct:]既不在[:alnum:]又不在[:entrl:]中的任意字符
[:space:]包括空格在内的任意空白字符(同\f \n \r \t \v)
[:upper:]任意大写字母(同[A-Z])
[:xdigit:]任意16进制数字(同 [a-fA-F0-9])

9.7 匹配多个实例

SELECT pro_name FROM products WHERE pro_name REGEXP '\([0-9] sticks?\)'

\ 使用 ‘\’ 转义‘(’, 后面的'?' 匹配0个货1个 ‘s’,然后再‘\’转义 后半个 ‘)’

SELECT pro_name FROM products WHERE pro_name REGEXP '[[:digit:]]{4}'

\ 匹配连在一起的4位数字

9.8 定位符

元字符
^文本的开始
$文本的结尾
[[:<:]]词的开始
[[:>:]]词的结尾

十、创建计算字段

10.1 计算字段

计算并不实际存在于数据库表中,是运行时在SELECT语句内创建的

10.2 拼接字段

10.2.1 拼接

多数DBMS使用 + 或者 “||” 实现拼接,MySQL是用Concat()函数。

SELECT Concat(RTrim(pro_name), ' (', pro_price, ')') FROM products;

// 里面先用RTrim 去除 pro_name 右边的空格,类似地,可以使用LTrim

//

上面的结果没什么问题,但是标题是一个未命名的列名,这样没法直接被客户机引用,所以需要alias(别名)。

10.2.2 别名

SELECT Concat(pro_name, ' (', pro_price, ')') AS vend_title FROM products WHERE pro_price IS NOT NULL;

// 使用 AS 关键字取了个别名
// 把结果中的 NULL 去掉

10.3 执行算数计算

SELECT order_id, item_name, quantity, price, quantity * price AS total_price FROM orderitems;

如何测试计算?使用SELECT语句可以省略FROM子句以简单的访问和处理表达式

比如: SELECT 3 * 2

SELECT Now();

image.png

篇幅所限,其余内容在这里: