主讲老师:Mosh;教程链接:【【中字】SQL进阶教程 | 史上最易懂SQL教程!10小时零基础成长SQL大师!!-哔哩哔哩】 https://b23.tv/MqVRzdk
-- 以下为课程笔记,每一段单个运行是不出错的
-- 第一章:基础语句
USE sql_store; -- 加分号,因为和后面不是同一句,不能写在同一行
SELECT *
FROM customers -- 从customer中调取所有列
WHERE customer_id = 1 -- 筛选满足cuetomer id 为1的
ORDER BY first_name -- 用名排序
SELECT
first_name, -- 换行后按Tab键,格式更清晰
last_name,
points,
points+10 AS discount_factor -- 可以直接在调取的时候进行简单数据处理:加减乘除,并另赋名
FROM customers
SELECT DISTINCT state -- 此处的distinct用于导出不含重复项的state列
FROM customers
SELECT -- 练习题
name,
unit_price, -- 记得列的名称中间要加上符号
unit_price*1.1 AS new_price
FROM products
SELECT * -- 练习题
FROM order_items
WHERE order_id = 6 AND quantity * unit_price > 30
SELECT *
FROM customers
WHERE points > 3000 -- 不等号:!=或<>
WHERE state = 'VA' -- 字符串相等加符号
WHERE birth_date > '1990-01-01'
WHERE birth_date > '1990-01-01' AND points > 3000 -- 逻辑运算符: AND OR NOT,其中AND 被首先考虑,像乘除法一样
WHERE NOT (birth_date > '1990-01-01' OR points > 1000) -- 用NOT时,对第一个条件取否定,而不对第二个条件进行操作,
-- 将OR变为AND,故该子句最终输出,出生年份在1990年之前并且积分大于1000的人
-- 上面等同于 WHERE birth_date <= '1990-01-01' AND points > 1000
SELECT *
FROM customers
WHERE state = 'VA' OR state = 'GA' OR state = 'FL' -- 不用‘VA’OR‘GA’OR‘FL’是因为OR运算符不能与‘VA’直接相连,因为VA不能自己表示真假
WHERE state IN ('VA','FL','GA') -- 与上一条完全相同
WHERE state NOT ('VA','FL','GA') -- 不包括那三个州的
SELECT * -- 练习题
FROM products
WHERE quantity_in_stock IN ('49','38','72')
SELECT *
FROM customers
WHERE points >= 1000 AND points <= 3000 -- 等同于下式
WHERE points BETWEEN 1000 AND 3000 -- BTEWEEN运算符:圈出范围,在什么之间
SELECT * -- 练习题
FROM customers
WHERE birth_date BETWEEN '1990-01-01' AND '2000-01-01'
SELECT *
FROM customers
WHERE last_name LIKE 'b%' -- 以b开头的姓,%代表任意长度字符
WHERE last_name LIKE '%b%' -- 含b
WHERE last_name LIKE '%b' -- 以b结尾
WHERE last_name LIKE '_b' -- 只有两个字符长度,且以b为结尾,_代表一个字符
SELECT * -- 练习题
FROM customers
WHERE address LIKE '%TRAIL%' OR address LIKE '%AVENUE'
WHERE phone NOT LIKE '%9%' -- 不包括9
SELECT *
FROM customers
WHERE last_name REGEXP 'field' -- 什么都不加:包含field
WHERE last_name REGEXP '^field' -- 在前面加上^:以field开头
WHERE last_name REGEXP 'field$' -- 在后面加上$:以field结尾
WHERE last_name REGEXP 'field|mac|rose' -- 在中间加上|:包含mac或field
WHERE last_name REGEXP '^field|mac|rose' -- 在field的前面加上^,表示寻找以field开头,或包含mac或包含rose的
WHERE last_name REGEXP '[gim]e' -- 此处方括号内的代表可选项,gim三个中选一个满足,
-- 方括号外的e为必选项,即寻找包含ge,或ie,或me的,方括号放后面就找eg,或ei,或em
WHERE last_name REGEXP '[a-h]e' -- a到h中的任何一项都可选, - 表示范围
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]'
SELECT *
FROM customers
WHERE phone IS NULL -- 找到电话缺失的人
WHERE phone IS NOT NULL -- 找到有电话的人
SELECT * -- 练习题
FROM orders
WHERE shipped_date IS NULL
SELECT *
FROM customers
ORDER BY first_name -- 用名排序,默认升序
ORDER BY first_name DESC -- 用名排序,此时为降序
ORDER BY state DESC, first_name -- 用降序的州和名排序,先排洲,再排名,例如两人在同一洲时,排两人的名
-- ORDER BY 可以给任意一列排序,即使那一列不在SELECT范围内,也可以对重命名的列排序,也可以对算数表达式排序
-- SELECT 10 AS points 其中points是另赋的一列,定值10
-- ORDER BY points 同样可以对points排序
-- 也可以使用列位置排序,比如first_name是第一列,对1列排序,ORDER BY 1,但列位置排序容易被影响
SELECT * -- 练习题
FROM order_items
WHERE order_id = 2
ORDER BY quantity*unit_price DESC
SELECT *
FROM customers
LIMIT 3 -- 限制只返回前三条记录,可以用于限制每页记录数
LIMIT 6,3 -- 其中6代表偏移量,意味着跳过前6条记录,输出第7到第6+3=9条记录
SELECT * -- 练习题
FROM customers
ORDER BY points DESC
LIMIT 3 -- 注意limit语句要永远放在最后