<>目录

第一部分:基础——增删查改
【第一章】做好准备 Getting Started (时长25分钟)
【第二章】在单一表格中检索数据 Retrieving Data From a Single Table (时长53分钟)
【第三章】在多张表格中检索数据 Retrieving Data From Multiple Tables (时长1小时2分)
【第四章】插入、更新和删除数据 Inserting, Updating, and Deleting Data (时长42分钟)

第二部分:基础进阶——汇总、复杂查询、内置函数
【第五章】汇总数据 Summarizing Data (时长33分钟)
【第六章】编写复杂查询 Writing Complex Query (时长45分钟)
【第七章】MySQL的基本函数 Essential MySQL Functions (时长33分钟)

第三部分:提高效率——视图、存储过程、函数
【第八章】视图 Views (时长18分钟)
【第九章】存储过程 Stored Procedures (时长48分钟)

第四部分:高阶主题——触发器、事件、事务、并发
【第十章】触发器和事件 Triggers and Events (时长22分钟)
【十一章】事务和并发 Transactions and Concurrency (时长49分钟)

第五部分:脱颖而出——数据类型、设计数据库、索引、保护
【十二章】数据类型 Data Types (时长35分钟)
【十三章】设计数据库 Designing Databases (时长1时30分)
【十四章】高效的索引 Indexing for High Performance (时长58分钟)
【十五章】保护数据库 Securing Databases (时长20分钟)

<>【第一章】做好准备

<>什么是SQL

* 数据库是一个以易访问格式存储的数据集合
* 为了管理我们的数据库 我们使用一种叫做数据库管理系统(DBMS, Database Management
System)的软件。我们连接到一个DBMS然后下达查询或者修改数据的指令,DBMS就会执行我们的指令并返回结果
* 有关系型和非关系型两类数据库,在更流行的关系型数据库中,我们把数据存储在通过某些关系相互关联
的数据表中,每张表储存特定的一类数据,这正是关系型数据库名称的由来。(如:顾客表通过顾客id与订单表相联系,订单表又通过商品id与商品表相联系)
* SQL(Structured Query Language,结构化查询语言)是专门用来处理(包括查询和修改)关系型数据库的标准语言
* 不同关系型数据库管理系统语法(MySQL、SQL
Server、Oracle)略有不同,但都是基于标准SQL,本课使用最流行的开源关系型数据库管理系统,MySQL
<>【第二章】在单一表格中检索数据

<>选择子句

SELECT 是列/字段选择语句,可选择列,列间数学表达式,特定值或文本,可用AS关键字设置列别名(AS可省略),注意 DISTINCT 关键字的使用。

注意

SQL会完全无视大小写(绝大数情况下的大小写)、多余的空格(超过一个的空格)、缩进和换行,SQL语句间完全由分号 ;
分割,用缩进、换行等只是为了代码看着更美观结构更清晰,这些与Python很不同,要注意。

实例

USE sql_store;

SELECT
DISTINCT last_name,
– 这种选择的字段中部分取 DISTINCT 的是如何筛选的?
first_name,
points,
(points + 70) % 100 AS discount_factor/‘discount factor’
– % 取余(取模)
FROM customers
练习

单价涨价10%作为新单价

SELECT
name,
unit_price,
unit_price * 1.1 ‘new price’
FROM products
如上面这个例子所示,取别名时,AS 可省,空格后跟别名就行,可看作是SQL会将将列变量及其数学运算之后的第一个空格识别为AS

<>WHERE子句

WHERE 是行筛选条件,实际是一行一行/一条条记录依次验证是否符合条件,进行筛选

导航

3~9 节讲的都是写 WHERE 子句中表达筛选条件的不同方法,这一节(第3节)主要讲比较运算,第4节讲逻辑运算
AND、OR、NOT,5~9可看作都是在讲特殊的比较运算(是否符合某种条件):IN、BETWEEN、LIKE、REGEXP、IS NULL。

所以总的来说WHERE条件就是数学→比较→逻辑运算,逻辑层次和执行优先级也是按照这三个的顺序来的。

实例

USE sql_store;

SELECT *
FROM customers
WHERE points > 3000
/WHERE state != ‘va’ – ‘VA’/'va’一样
比较运算符 > < = >= <= !=/<> ,注意等于是一个等号而不是两个等号

也可对日期或文本进行比较运算,注意SQL里日期的标准写法及其需要用引号包裹这一点

WHERE birth_date > ‘1990-01-01’

<>AND, OR, NOT运算符

USE sql_store;

SELECT *
FROM customers
WHERE birth_date > ‘1990-01-01’ AND points > 1000
/WHERE birth_date > ‘1990-01-01’ OR
points > 1000 AND state = ‘VA’
AND优先级高于OR,但最好加括号,更清晰

WHERE birth_date > ‘1990-01-01’ OR
(points > 1000 AND state = ‘VA’)
NOT的用法

WHERE NOT (birth_date > ‘1990-01-01’ OR points > 1000)
去括号等效转化为

WHERE birth_date <= ‘1990-01-01’ AND points <= 1000

<>IN运算符

用IN运算符将某一属性与多个值(一系列值)进行比较
实质是多重相等比较运算条件的简化

案例

选出’va’、‘fl’、'ga’三个州的顾客

USE sql_store;

SELECT * FROM customers
WHERE state = ‘va’ OR state = ‘fl’ OR state = ‘ga’
不能 state = ‘va’ OR ‘fl’ OR ‘ga’ 因为数学和比较运算优先于逻辑运算,加括号 state = (‘va’ OR ‘fl’ OR
‘ga’) 也不行,逻辑运算符只能链接布林值。

用 IN 操作符简化该条件

WHERE state IN (‘va’, ‘fl’, ‘ga’)
可加NOT

WHERE state NOT IN (‘va’, ‘fl’, ‘ga’)
这里可用NOT的原因:可以这么看,IN语句 IN (‘va’, ‘fl’, ‘ga’)
是在进行一种是否符合条件的判断,可看作是一种特殊的比较运算,得到的是一个逻辑值,故可用NOT进行取反

练习

库存量刚好为49、38或72的产品

USE sql_store;

select * from products
where quantity_in_stock in (49, 38, 72)

<>BETWEEN运算符

用于表达范围型条件

注意

用AND而非括号
闭区间,包含两端点
也可用于日期,毕竟日期本质也是数值,日期也有大小(早晚),可比较运算
同 IN 一样,BETWEEN 本质也是一种特定的 多重比较运算条件 的简化
案例

选出积分在1k到3k的顾客

USE sql_store;

select * from customers
where points >= 1000 and points <= 3000
等效简化为:

WHERE points BETWEEN 1000 AND 3000
注意两端都是包含的 不能写作BETWEEN (1000, 3000)!别和IN的写法搞混

练习

选出90后的顾客

SELECT * FROM customers
WHERE birth_date BETWEEN ‘1990-01-01’ AND ‘2000-01-01’

<>LIKE运算符

模糊查找,查找具有某种模式的字符串的记录/行

注意

过时用法(但有时还是比较好用,之后发现好像用的还是比较多的),下节课的正则表达式更灵活更强大
注意和正则表达式一样都是用引号包裹表示字符串
USE sql_store;
SELECT * FROM customers
WHERE last_name like ‘brush%’ / ‘b____y’
引号内描述想要的字符串模式,注意SQL(几乎)任何情况都是不区分大小写的

两种通配符:

% 任何个数(包括0个)的字符(用的更多)
_ 单个字符
练习

分别选择满足如下条件的顾客:

*
地址包含 ‘TRAIL’ 或 ‘AVENUE’

*
电话号码以 9 结束

USE sql_store;

select *
from customers
where address like ‘%Trail%’ or
address like ‘%avenue%’
LIKE 执行优先级在逻辑运算符之后,毕竟 IN BETWEEN LIKE
本质可看作是比较运算符的简化,应该和比较运算同级,数学→比较→逻辑,始终记住这个顺序,上面这个如果用正则表达式会简单得多

where phone like ‘%9’
/where phone not like ‘%9’
LIKE的判断结果也是个TRUE/FASLE的问题,任何逻辑值/布林值都可前置NOT来取反

<>REGEXP运算符

正则表达式,在搜索字符串方面更为强大,可搜索更复杂的模板

实例

USE sql_store;

select * from customers
where last_name like ‘%field%’
等效于:

where last_name regexp ‘field’
regexp 是 regular expression(正则表达式) 的缩写

正则表达式可以组合来表达更复杂的字符串模式

where last_name regexp ‘^mac|field$|rose’
where last_name regexp ‘[gi]e|e[fmq]’ – 查找含ge/ie或ef/em/eq的
where last_name regexp ‘[a-h]e|e[c-j]’

正则表达式总结:

符号 意义
^ 开头
$ 结尾
[abc] 含abc
[a-c] 含a到c
| logical or
(正则表达式用法还有更多,自己去查)

练习

分别选择满足如下条件的顾客:

*
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 ∣ o n |on ∣on’
/where last_name regexp ‘^my|se’
/where last_name regexp ‘b[ru]’/‘br|bu’

<>IS NULL运算符

找出空值,找出有某些属性缺失的记录

案例

找出电话号码缺失的顾客,也许发个邮件提醒他们之类

USE sql_store;

select * from customers
where phone is null/is not null
注意是 IS NULL 和 IS NOT NULL 这里 NOT 不是前置于布林值,而是更符合英语语法地放在了be动词后

练习

找出还没发货的订单(在线商城管理员的常见查询需求)

USE sql_store;

select * from orders
where shipper_id is null
回顾

3~9 节全在讲WHERE子句中条件的具体写法 :

第3节:比较运算 > < = >= <= !=
第4节:逻辑运算 AND、OR、NOT
5~9节:特殊的比较运算(是否符合某种条件):IN 和 BETWEEN、LIKE 和 REGEXP、IS NULL
所以总的来说WHERE条件就是

数学运算 → 比较运算(包括特殊的比较运算)→ 逻辑运算
逻辑层次和执行优先级也是按照这三个的顺序来的。

<>ORDER BY子句

排序语句,和 SELECT …… 很像:

可多列
可以是列间的数学表达式
可包括任何列,包括没选择的列(MySQL特性,其它DBMS可能报错),
可以是之前定义好的别名列(MySQL特性,甚至可以是用一个常数设置的列别名)
任何一个排序依据列后面都可选加 DESC
注意

最好别用 ORDER BY 1, 2(表示以 SELECT …… 选中列中的第1、2列为排序依据)
这种隐性依据,因为SELECT选择的列一变就容易出错,还是显性地写出列名作为排序依据比较好

注:workbench 中扳手图标可打开表格的设计模式,查看或修改表中各列(属性),可以看到谁是主键。省略排序语句的话会默认按主键排序
实例

USE sql_store;

select name, unit_price * 1.1 + 10 as new_price
from products
order by new_price desc, product_id
– 这两个分别是 别名列 和 未选择列,都用到了 MySQL 特性
练习

订单2的商品按总价降序排列:

法1. 可以以总价的数学表达式为排序依据

select * from order_items
where order_id = 2
order by quantity * unit_price desc
– 列间数学表达式
法2. 或先定义总价别名,在以别名为排序依据

select *, quantity * unit_price as total_price
from order_items
where order_id = 2
order by total_price desc
– 列别名

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

练习

找出积分排名前三的死忠粉

USE sql_store;

select *
from customers
order by points desc
limit 3
回顾

SELECT 语句完结了,里面的子句顺序固定要记牢,顺序乱会报错
select from where + order by limit
纵选列,确定表,横选行(各种条件写法和组合要清楚熟悉),最后再进行排序和限制

<>【第三章】在多张表格中检索数据

技术
©2019-2020 Toolsou All rights reserved,
CSS实现溢出显示省略号mysql导出数据sql语句_mysql 根据sql查询语句导出数据HTML+CSS+JavaScript实现模态框(可拖拽)关于串口单片机给上位机的发送数据七大排序算法Java学生信息管理系统控制台版react中解决css样式全局污染qt使用数据库sqlite2020第十一届蓝桥杯国赛Python组vue 限制input只能输入正数