MySQL 学习笔记 Part1
SQL(Structed Query Language)
视频链接:https://www.bilibili.com/video/BV1Xb41177na?p=1
一、准备
1. 下载安装MySQL
MySQL Community
Downloads
在Accounts and Roles界面设置root用户的密码,Connect To Server
界面再次输入密码。
其余全部默认
2. 配置MySQL
3. 创建一个数据库
下载链接下SQL Course Materials
:https://github.com/JiaZhengJingXianSheng/Study-File
运行create-databases.sql
二、单一表格中检索数据
MySQL语句在执行时关键字是忽视大小写的,建议关键字使用大写。
同时也会忽略回车
空格,所以下方两个指令是一样的,但建议使用第二种。
1 SELECT * FROM customers # 读取customers表
1 2 SELECT * FROM customers # 读取customers表
1. SELECT 语句
USE
用来指定数据库
SELECT
用来查询具体的信息
FROM
指定了从某个表中查询
ORDER BY
可以用来排序
1 2 3 4 5 6 7 8 USE sql_store; # 选中数据库 # SELECT customer_id, fisrt_name 选择指定列 # 下面3行是一起的 -- SELECT * FROM customers # 读取customers表 -- WHERE customer_id = 1 # WHERE 语句可以查询某一条记录 -- ORDER BY first_name -- 根据first_name排序
读取指定列,如果需要查询列过多,可以换行。也可以直接在SELECT
语句中进行数学运算。
AS
可以指定名称。如果指定的名称包含空格,可以用引号包含起来。
1 2 3 4 5 6 SELECT first_name, last_name, points, (points + 10) * 100 AS 'discount factor' FROM customers # 读取指定列
如果我们想检索出不重复的结果可以使用 DISTINCT
关键字
1 2 SELECT DISTINCT state FROM customers
2. WHERE 子句
下面命令实在customers表下查找points大于300的值
">,>=,<,<=,=(等于),!=(不等于),<>(不等于)"
MySQL中日期的标准写法是 '1990-01-01'
1 2 3 SELECT * FROM customers WHERE points > 300
1 2 3 4 -- Get the orders placed 2019-01-01 SELECT * FROM orders WHERE order_date >= '2019-01-01'
3. AND OR NOT 操作符
1 2 3 4 -- Get the orders placed 2019-01-01 SELECT * FROM orders WHERE order_date >= '2019-01-01' OR (points > 1000 AND state = 'VA')
4. IN 操作符
1 2 3 4 SELECT * FROM customers -- WHERE state = 'VA' OR state = 'GA' OR state = 'FL' WHERE state IN ('VA', 'GA', 'FL')
5. BETWEEN
比如找出 1000 <= points <= 3000
的列
BETWEEN
用来查找范围值
1 2 3 4 SELECT * FROM customers -- WHERE points >= 1000 AND points <= 3000 WHERE points BETWEEN 1000 AND 3000
6. LIKE 筛选
LIKE 可以用来筛选,例如下面可以筛选出last_name
以b开头的数据。
1 2 3 SELECT * FROM customers WHERE last_name LIKE 'b%'
7. REGEXP 正则表达式
REGEXP
是正则表达式的简称
比如我们想在last_name
里找出包含 field
的条目,可以使用 REGEXP ,如下
^
幂符号代表以此开始
$
符号代表结尾
|
可以搜索多个字符
[]
代表多个字符,比如 '[gim]e'
代表 ge 或 ie 或 me
-
代表范围, 例如 a-f
代表从 a 到
f
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 SELECT * FROM customers -- WHERE last_name LIKE '%field%' WHERE last_name REGEXP 'field' -- 代表以field开头 -- WHERE last_name REGEXP '^field' -- 代表以field结尾 -- WHERE last_name REGEXP 'field$' -- 代表包含field或mac -- WHERE last_name REGEXP 'field|mac' -- 代表包含 ge 或 ie 或 me -- WHERE last_name REGEXP '[gim]e'
8. IS NULL 检索缺失项
1 2 3 4 5 6 SELECT * FROM customers -- 为空 WHERE phone IS NULL -- 不为空 -- WHERE phone IS NOT NULL
9. ORDER BY 排序
默认为升序排列,如果需要逆序,在后面增加 DESC
字符
1 2 3 4 5 6 SELECT * FROM customers -- 升序 ORDER BY first_name -- 降序 -- ORDER BY first_name DESC
也可以混合排序,比如下方是先按照 state 排序,在同一个 state
内再按 first_name 排序
1 2 3 SELECT * FROM customers ORDER BY state, first_name
10. LIMIT
LIMIT 只加一个参数代表查找前多少个
LIMIT 加两个参数,其中第一个参数代表偏移量
LIMIT 子句永远写在最后
1 2 3 4 5 6 7 8 9 10 11 SELECT * FROM customers -- 只查询前3个 -- LIMIT 3 -- page 1: 1-3 -- page 2: 4-6 -- page 3: 7-9 -- 第一个参数为偏移量, 表示忽视前六个 -- 表示7-9 LIMIT 6, 3
三、 多个表中检索数据
1. 库内合并数据
SQL 有两种连接方式,inner 和
outer , 默认inner
JOIN 和 ON 合起来使用可以将表拼接起来
1 2 3 4 5 6 7 8 9 10 11 12 -- 把customer 和 orders按id相同拼接起来 SELECT * FROM orders JOIN customers ON orders.customer_id = customers.customer_id -- 只查看order_id, customer_id, first_name, last_name 匹配项 -- 如果要查看customer_id 应该加上前置表名,比如 orders.customer_id SELECT order_id, orders.customer_id, first_name, last_name FROM orders JOIN customers ON orders.customer_id = customers.customer_id
1 2 3 4 5 SELECT order_id, o.customer_id, first_name, last_name -- order 命名为 o, customer 命名为 c FROM orders o JOIN customers c ON o.customer_id = c.customer_id
2. 跨库合并数据
1 2 3 4 5 6 USE sql_store; SELECT * FROM order_items oi JOIN sql_inventory.products p ON oi.product_id = p.product_id
3. 合并表
1 2 3 4 5 6 7 8 9 USE sql_hr; SELECT e.employee_id, e.first_name, m.first_name AS manager FROM employees e JOIN employees m ON e.reports_to = m.employee_id
4. 跨表匹配合并数据
比如我们一个表中记录着状态位,而对应的状态却在另外的表里,这时候就需要跨表匹配
下面实现了,找到orders里对应的客户(客户信息存放在customers),再匹配状态(状态信息存放在order_statues)
1 2 3 4 5 6 7 8 9 10 11 12 13 USE sql_store; SELECT o.order_id, o.order_date, c.first_name, c.last_name, os.name AS status FROM orders o JOIN customers c ON o.customer_id = c.customer_id JOIN order_statuses os ON o.status = os.order_status_id
5. 隐式合并
下面第二种写法是隐式合并
1 2 3 4 5 6 7 8 9 10 11 USE sql_store; SELECT * FROM orders o JOIN customers c ON o.customer_id = c.customer_id -- 隐式合并 SELECT * FROM orders o, customers c WHERE o.customer_id = c.customer_id