做了两年 PM,每次拉数据都直接找开发,之前怕把数据库搞坏了。换了家公司,开启自力更生。
早上在地铁上,疯狂翻看《SQL必知必会》,其实看不太懂,一定要在 PC 端,边看边在数据库试验。
因为英文输入法、某个符号不知道怎么输入(" `) ,查询多次报错,幸好有 AI ,粘进去帮我改了,我再 copy 出来看看具体是哪里错了。
AI 还有一个不知疲倦的“逐词翻译”的功能,很好用,疯狂用。
奋发图强学习的原因还有一个原因是,昨天开发突然“水灵灵”地说没办法和我解释,我不懂业务也不懂代码怎么写…… 我剩下的就只有专业度,不带情绪地沟通技巧了hhhhhhhhh
学一下
初学者最佳打开模式 -- EXPLAIN
# 这是一条注释:先看单一表的表结构
EXPLAIN item
输出的内容是 item 表里面的列名
基本规则
| database | 数据库 |
|---|---|
| table | 表 |
| column | 列 |
| row | 行 |
| primary key | 主键 |
| SQL | 专门用来与数据库沟通的语言 |
| syntax | 语法 |
检索 -- SELECT FROM
1、所需的列名写在 SELECT 关键字之后,FROM 关键字指出从哪个表中检索数据
SELECE item_id
FROM item
iten id
95,684
188,429
5,244,533
5,903,092
2、形式变换
# 检索
SELECT item_id,user_id,create_time,PID,URL --查找多列
FROM item
SELECT * --查找所有列
FROM item
SELECT * -- 注释:学会加注释 英文下两个连字符,之后加空格
FROM item; -- 注释
# 多行注释
/* SELECT item_id,user_id,create_time,PID,URL --查找多列
FROM item
SELECT * --查找所有列
FROM item*/
SELECT * -- 注释:学会加注释 英文下两个连字符,之后加空格
FROM item; -- 注释
排序 -- ORDER BY
ORDER BY 子句取一个或多个列的名字,据此对输出进行排序。
# 排序
SELECT item_id, user_id, PID, URL
FROM item
ORDER BY user_id -- 按 user_id 排序
# 按多列排序
ORDER BY PID, user_id -- 先按 PID 排序, 然后按 user_id 排序 ,能查出都买过同一pid商品的用户有哪些
# 按列位置排序
ORDER BY 3, 2 -- 先按 PID 排序, 然后按 user_id 排序 ,用数字代表列
# 指定排序方向
SELECT item_id, user_id, PID, unit_price
FROM item
ORDER BY 4 desc -- 先按 unit_price 排序,然后倒序,能查出 最高价商品
# 指定排序方向
SELECT item_id, user_id, PID, unit_price
FROM item
ORDER BY 4 desc ,2 desc -- 先按 unit_price 排序,然后倒序,能查出 最高价商品,user_id 默认降序排列,先看到新用户
limit 100
# 指定排序方向
SELECT item_id, user_id, PID, unit_price
FROM item
ORDER BY 4 desc ,2 -- 先按 unit_price 排序,然后倒序,能查出 最高价商品,user_id 默认升序排列 asc ,先看到老用户
limit 100
过滤 -- WHERE
| where子句操作符 | 说明 |
|---|---|
| = | 等于 |
| <> | 不等于 |
| != | 不等于 |
| <= | 小于等于 |
| !< | 不小于 |
| >= | 大于等于 |
| !> | 不大于 |
| BETWEEN | 在指定的两个值之间 |
| IS NULL | 为空值 |
# 过滤
SELECT item_id, user_id, PID, unit_price
FROM item
WHERE user_id = 2252365
ORDER BY 4 desc --按照价格降序排列
limit 100
# 高级过滤数据 -- AND
SELECT item_id, user_id, PID, unit_price
FROM item
WHERE user_id = 2252365 AND unit_price <10000 -- 用户购买<1w日元的商品
ORDER BY 4 desc
limit 100
# 高级过滤数据据 -- or
SELECT item_id, user_id, PID, unit_price
FROM item
WHERE user_id = 2252365 or unit_price <10000 -- 用户购买>1w日元的商品
ORDER BY 4 desc
limit 100
# 高级过滤数据据 -- in
SELECT item_id, user_id, PID, unit_price
FROM item
WHERE user_id in (2252365 , 2226146) -- 查两个用户购物记录
ORDER BY 4 desc
limit 100
# 高级过滤数据据 -- or
SELECT item_id, user_id, PID, unit_price
FROM item
WHERE user_id = 2252365 OR user_id = 2226146 -- 查两个用户购物记录
ORDER BY 4 desc
limit 100
为什么要使用 IN 操作符?其优点如下。
- 在有很多合法选项时,IN 操作符的语法更清楚,更直观。
- 在与其他 AND 和 OR 操作符组合使用 IN 时,求值顺序更容易管理。
- IN 操作符一般比一组 OR 操作符执行得更快(在上面这个合法选项很 少的例子中,你看不出性能差异)。
- IN 的最大优点是可以包含其他 SELECT 语句,能够更动态地建立 WHERE 子句。
# 使用 not in,数字用英文 () 即可
# 高级过滤数据据 -- not in
SELECT item_id, user_id, PID, unit_price
FROM item
WHERE user_id NOT IN (2252365,2226146) -- 查除了这两个用户,其余所有用户的购物记录
ORDER BY 4 desc
limit 100
# 使用 <>,数字要用英文引号隔开
# 高级过滤数据据 -- <>
SELECT item_id, user_id, PID, unit_price
FROM item
WHERE user_id <> "2252365" "2226146" -- 查除了这两个用户,其余所有用户的购物记录
ORDER BY 4 desc
limit 100