第一章
本篇笔记仅为本人在观看CodeWithMosh的10小时sql学习视频中自学所记。
特此感谢b站up主:伟大的海伦君 的搬运以及翻译。
第二章
1.选择语句
SELECT * --选择全部语句,顺序影响
SELECT column 1, column 2 --以列为主
FROM customers --table
SELECT DISTINCT column
--distinct 自动删去该列中的重复项
SELECT price, price * 1.1 AS 'new price'
--用AS关键字为列重命名
--用单引号或者双引号写字符串
2.WHERE
写Boolean语句,判断是否符合条件,筛选
SELECT *
FROM orders
WHERE order_date >= '2019-01-01'
--‘xxxx-xx-xx’是sql的日期书写格式,可以用作判断大小
WHERE Order_id = 6 AND price * quantity >30
--还有NOT, OR等判断符号,NOT优先级最高,OR优先级最低
WHERE state IN ('VA','GA','FL')
--IN判断是否在合集里(NOT IN)
WHERE points BETWEEN 1000 AND 3000
--判断points是否【1000,3000】注意是闭区间
WHERE name LIKE 'b____y'
--不区分大小写
--中间几个下划线代表特定数量的字符
WHERE name LIKE '%b%'
--%代表不限数量的字符
--即名字中有b即符合条件
--正则表达式Regular expression
WHERE name REGEXP 'b'
--判断是否有b
--'^b'句首,'b$'句尾
WHERE name REGEXP 'a|b'
--'|'代表或
--'[gim]e'判断e前缀是否有gim中任一字符
--'e[gim]'判断e后缀是否有gim中任一字符
--'[a-h]e'是否有a到h(闭区间)任一字符
WHERE phone IS NULL
--判断是否为空
--IS NOT NULL
3.ORDER BY语句
排序方式
默认排序:根据主键列,且为从小到大(升序)
ORDER BY name DESC
--DESC 降序排列 descending
ORDER BY state DESC, name
--先降序排序 state, 再根据name升序排序
--可以不select 但是order by某些column
4.LIMIT
限制查询返回的记录数。
SELECT *
FROM tables
LIMIT 3
--不超过3行
--limit 300 若小于这个数字则返回所有
--常用于分页
--选择第三页的话
LIMIT 6,3
--跳过前6条,选择3条,即返回第7,8,9
--LIMIT通常语句排序在最后
第三章:连接
1.内连接
从多张表格里选取列。
JOIN
两种类型:内连接,外连接
INNER JOIN。
SELECT *
FROM orders
--FROM orders o
--别名,直接空格加简称,方便书写
JOIN customers
ON orders.customers_id = customers.customers_id
--两张表格单纯连接在一起
SELECT order_id, name, orders.customers_id
--选取不重复的列
--选取重复名列时需要前缀表格名称
2.跨数据库连接
双击设置主数据库。query一般用于当前主数据库。
--navigator 导航
USE sql_store;
--设置当前主数据库或者导航界面双击
SELECT *
FROM orders o
JOIN sql_inventory.products p
--直接将另一个数据库的名字作为table前缀
ON o.product_id = p.product_id
3.自连接
同一张表格自连接
USE sql_hr
SELECT
e.employee_id,
e.name,
m.name
FROM employees e
JOIN employees m AS manager --'manager'也一样
ON e.reports_to = m.employee_id
4.多表连接
USE sql_store;
SELECT
o.id,
o.date,
c.name,
os.status
FROM orders o
JOIN customers c
ON o.id = c.id
JOIN order_statuses os
ON o.status = os.id
5.复合连接条件
复合主键
SELECT oi
JOIN oin
ON oi.id = oin.id
AND oi.pid = oin.pid
6.隐式连接
SELECT *
FROM o, c
WHERE o.id = c.id
--一般不用
7.外连接
OUTER JOIN
INNER JOIN只返回符合ON 条件的语句
但是如果想要返回无论是否有订单的顾客,则需要外连接
分左右两种
SELECT
c.id,
c.name,
o.id
FROM c
LEFT JOIN o
--返回所有from语句中的table的记录
--RIGHT JOIN 返回右表
--类似交集,left返回A∪(A∩B),right相反
--JOIN返回A∩B
ON c.id = o.id
--8.多表格连接
--LEFT JOIN another table
--为了方便理解一般都用LEFT JOIN
ORDER BY c.id
9.自外连接
USE sql_hr;
SELECT
e.id,
e.name,
m.name AS manager
FROM employees e
LEFT JOIN employees m
ON e.reports_to = m.first_name
10.USING
如果两个table中有列的名称完全一样
SELECT
c.id,
c.name,
o.id
FROM c
LEFT JOIN o
--ON c.id = o.id
USING(customer_id)
JOIN shippers sh
USING(Shipper_id,product_id)
--多个列比较时用逗号分隔
11.自然连接(用的很少)
SELECT
o.id,
c.name
FROM orders o
NATURAL JOIN customers c
12.交叉连接
SELECT
c.name AS customers
p.product AS product
FROM customers c
CROSS JOIN products p
--显示连接
--隐式:FROM c, o
--order by c.name
13.联合Unions
SELECT
o.id,
o.date,
'Active' AS 'status'
FROM orders
WHERE order_date>'2019-01-01';
UNION
--合并多段查询记录
SELECT
o.id,
o.date,
'Archived' AS 'status'
FROM orders
WHERE order_date < '2019-01-01';
第四章
1.列属性
Datatype
INT 整数类型
CHAR(50) 字符类型 (填满50个字符)
VARCHAR(50) variable character 不填满也不会浪费空间
DATE XXXX-XX-XX 日期
PK primary key 主键(唯一识别)
NN Not NULL 不允许空值
AI Auto increment 自动递增 通常用作主键列
Default value 默认值
2.插入单行 Inserting a single row
INSERT INTO
INSERT INTO customers
VALUES(
DEFAULT,--主键必须是唯一值
'John',
'Smith',
NULL,
DEFAULT,
'add',
'CA',
200)
--完整赋值
--如果只想赋值某些列,而其他列就默认
INSERT INTO customers(
name,
address,
city)
--以这个顺序为准
VALUES(
'John',
'add',
'CA',)
3.插入多行 Inserting multiple rows
INSERT INTO shippers (name)
VALUES ('shipper1'),
('shipper2'),
('shipeer3')
--逗号分割,且每一个新行的元素都要用括号括起来
4.插入分级行(子母级)(往多张表里插入数据)
INSERT INTO orders(customer_id,order_date,stauts)
VALUES (1,'2019-01-02',1);
--内置函数 LAST_INSERT_ID()
--返回mysql最新生成的id
INSERT INTO order_items
VALUES(LAST_INSERT_ID(),1,1,2.95),
(LAST_INSERT_ID(),2,1,2.45),
(LAST_INSERT_ID(),3,1,2.35);
5.创建表复制
CREATE TABLE new _table AS
SELECT *
FROM orders
--会忽略一些属性,比如主键设置和自动递增
--这个select是子查询
--部分属于另外一段SQL语句的选择语句
右键table-Truncate Table,删除表中所有行
-drop table,删除表
--将选择语句作为insert的子查询
INSERT INTO new_table
SELECT *
FROM orders
WHERE order_date < '2019-01-01'
6.更新单行 update
7.更新多行
UPDATE table1
SET payment = DEFAULT,
date = '2020-01-01',
name = NULL,
price = total *0.5
WHERE id = 1
--WHERE id IN(3,4)
--在table内点击刷新
8.update子查询
WHERE id =
(SELECT id
FROM clients
WHERE name = 'aaa')
WHERE id IN
(SELECT id
FROM clients
WHERE name IN (