首先本人学习跟的视频教程为mosh中字翻译的教程,还是建议大家去听原版:
【第一章】SQL介绍
SQL是一种特定目的编程语言,用于管理关系数据库管理系统,或在关系流数据管理系统中进行流处理。 SQL基于关系代数和元组关系演算,包括一个数据定义语言和数据操纵语言。SQL的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。(来自维基百科)
从介绍很容易看得出数据库与SQL有很多关系所在,顾名思义数据库是一个以易访问格式存储的数据集合,里面存储的数据也需要被查询、修改等操作,而SQL只是一种编程语言,还需要一个载具可以使用它,那就是数据库管理系统(DBMS, Database Management System)。其与数据库的关系如下,很清楚看出数据库是通过DBMS来实现数据的各类操作的。
而数据库有很多种分类,本文只分析关系数据库:
关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。简单来说就是表格。
同关系型数据库管理系统语法略有不同,但都是基于标准SQL,本课使用最流行的开源关系型数据库管理系统,MySQL。关于MySQL的安装本文不会过多的写,我用的版本是mysql-8.0.15,以及用的不是workbench用的是Navicat来操作的。(但完全是不冲突的!)
【第二章】在单一表格中检索数据
这一章会涉及各种语法,以下我将逐一向大家介绍。
-
选择语句
整体语段
USE sql_store;-- 选择哪一个数据库
SELECT * / 1, 2 -- 纵向筛选列,甚至可以是常数
FROM customers -- 选择表
WHERE customer_id < 4 -- 横向筛选行
ORDER BY first_name -- 排序
-- 单行注释
/*
多行注释
*/
-
USE语句一般是用来选择使用数据库,如果你是直接在数据库里查询的就可以忽略这个语句。像上面的例子中就选择了 sql_store 这一个数据库。
-
SELECT语句,一般需要搭配from(选择数据库的哪个表)一起使用,作用是查询数据,可选择列,列间数学表达式,特定值或文本。可用AS关键字设置列别名(AS可省略),注意
DISTINCT
关键字的使用。*号代表查询所有列,如果需要查询特定的列则可以将*改为xx,xx。如果要查询列间数学表达式可以写成xx+10之类的,查询的表上会加上新的这一列。 -
一般的用法如下,可以先看前两个语句,后面的几个后面我会再来说明
-- 选择users里的所有列的所有行 SELECT * FROM users; -- 选择user特定列(username、email)的所有行 SELECT username, email FROM users; -- 添加 WHERE 子句,选择满足条件的行(类似于条件判断语句) SELECT * FROM users WHERE is_active = TRUE; -- 添加 ORDER BY 子句,按照某列的升序排序 SELECT * FROM users ORDER BY birthdate; -- 添加 ORDER BY 子句,按照某列的降序排序 SELECT * FROM users ORDER BY birthdate DESC; -- 添加 LIMIT 子句,限制返回的行数 SELECT * FROM users LIMIT 10;
注意:SQL会完全无视大小写(绝大数情况下的大小写)、多余的空格(超过一个的空格)、缩进和换行,SQL语句间完全由分号 ;
分割,用缩进、换行等只是为了代码看着更美观结构更清晰,这些与Python很不同,要注意。
以下是关于基础select语句的举例说明:
1.1 选择sql_store数据库中customers表的所有列(注意第一个;号不能省略)(还有注释--后一定要加空格不然会报错!这个图里面我没有空格所以之后我编译的时候就有问题了)
1.2 选择sql_store数据库中customers表的first_name,phone, points以及points+10,这里还用了AS语句将points+10列改名为'total points'
练习
将sql_store数据库中products表中产品的单价涨价10%作为新单价。
注:取别名时,AS 可省,空格后跟别名就行,可看作是SQL会将将列变量及其数学运算之后的第一个空格识别为AS。
2.WHERE 语句
WHERE 子句用于在 MySQL 中过滤查询结果,只返回满足特定条件的行。类似于条件判断语句。一般用法如下:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
其实理解很简单,就是一个类似于if语句的话,来给查询结果一些限制,这里是一些判断符的介绍:
直接来练习吧!
练习
查询sql_store数据库中orders表中2019年的订单:
注意:日期的写法xxxx-xx-xx
3.AND, OR, NOT运算符
这里主要就是涉及到逻辑判断的问题,很类似与或非。
优先级:数学→比较→逻辑;AND大于OR
这里也直接来做练习吧!
练习
查询sql_store数据库中order_item表中订单号为6且总价大于30的商品。
这里有个容易犯错的点就是在where语句里用了别名,会出错。那是因为在SQL中,别名(如 total price
)不能直接在 WHERE
子句中使用,因为 WHERE
子句是在 SELECT
子句之前处理的。
4. IN运算符
用IN运算符将某一属性与多个值(一系列值)进行比较,实质是多重相等比较运算条件的简化。
举个例子:
WHERE state = 'va' OR state = 'fl' OR state = 'ga'
上面的语句与下面的语句是等效的:
WHERE state IN ('va', 'fl', 'ga')
直接来练习吧!
练习
查询sql_store数据库中products表中库存量刚好为49、38或72的产品。
5.BETWEEN运算符
想到between当然要想到and啦
意思是这个运算符代表的含义是:在什么什么之间。需要注意的点:
-
用AND而非括号
-
闭区间,包含两端点
-
也可用于日期,毕竟日期本质也是数值,日期也有大小(早晚),可比较运算
-
同 IN 一样,BETWEEN 本质也是一种特定的 多重比较运算条件 的简化
举个例子:
where points >= 1000 and points <= 3000
可以等效为:
WHERE points BETWEEN 1000 AND 3000
直接来练习吧!
练习
在sql_store数据库中customers表中选出90后的顾客。
6.LIKE运算符
LIKE 子句是在 MySQL 中用于在 WHERE 子句中进行模糊匹配的关键字。它通常与通配符一起使用,用于搜索符合某种模式的字符串。LIKE 子句中使用百分号 %字符来表示任意字符,_表示单个字符。如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。一般用法如下:
SELECT column1, column2, ...
FROM table_name
WHERE column_name LIKE pattern;
注意:SQL(几乎)任何情况都是不区分大小写的
直接来练习吧!
练习
在sql_store数据库中customers表中选出1.地址包含 'TRAIL' 或 'AVENUE';2.电话号码以 9 结束(可以很明显看出给出的条件很模糊,所以此时可以不用=而转为用like)
7.REGEXP运算符
REGEXP 用于检查一个字符串是否匹配指定的正则表达式模式,以下是 REGEXP 运算符的基本语法:
SELECT column1, column2, ...
FROM table_name
WHERE column_name REGEXP 'pattern';
-- column_name 是你要进行正则表达式匹配的列的名称
-- 'pattern' 是一个正则表达式模式
正则表达式的用法有很多,一下是知乎的博主的一个小总结
直接开始练习!
练习
分别选择满足如下条件的顾客:
-
first names 是 ELKA 或 AMBUR
-
last names 以 EY 或 ON 结束
-
last names 以 MY 开头 或包含 SE
-
last names 包含 BR 或 BU
代码如下:
select *
from customers
where first_name regexp 'elka|ambur'
/where last_name regexp 'ey$|on$'
/where last_name regexp '^my|se'
/where last_name regexp 'b[ru]'/'br|bu'
8.IS NULL 运算符
找出空值,找出有某些属性缺失的记录。举个例子:就是把某一类信息丢失的顾客信息给找出来。
直接做练习吧!
练习
在 orders 中找出还没发货的订单(在线商城管理员的常见查询需求)
ps.因为如果还没有发货的话,其shipper_id就是null。
ps.我们也可以找出已经发货的,其实就是在null前加个否定词not
9. ORDER BY子句(排序语句)
从英文意思就可以看出来,是排序的意思。如果我们需要对读取的数据进行排序,我们就可以 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。ORDER BY(排序) 语句可以按照一个或多个列的值进行升序(ASC)或降序(DESC)排序。基础用法如下:
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
练习
orders_items 表中订单2的商品按总价降序排列:
方法1:
方法2:定义别名再排序
10.LIMIT子句
限制返回结果的记录数量,“前N个” 或 “跳过M个后的前N个”
举个例子:
USE sql_store;
select *
from customers
limit 3/300/6,3 -- /是或的意思
6, 3 表示跳过前6个,取第7~9个,6是偏移量,如:网页分页 每3条记录显示一页 第3页应该显示的记录就是 limit 6, 3
练习
在customers表中找出积分排名前三的顾客
总结(查询语句)
SELECT 语句完结了,里面的子句顺序固定要记牢,顺序乱会报错 select
from
where
+ order by
limit
纵选列,确定表,横选行(各种条件写法和组合要清楚熟悉),最后再进行排序和限制。