MySQL
大约 3 分钟
MySQL
目录
SQL命令
USE(使用数据库)
-- SQL不分大小写,一般'命令'大写其他小写
USE sql_store; -- 数据库,若只有一个数据库或在指定数据库下运行则可省略
SELECT(选择列)及其子句
--标准示例
SELECT customer_id, last_name
FROM customers -- 从表选择
WHERE customer_id = 1 -- 筛选。布尔:()>NOT>AND>OR
ORDER BY first_name -- 按某列排序
LIMIT 10 -- 仅显示前10条数据
--SELECT子句扩展(选择)
SELECT points + 10 AS points_factor -- 可输入表达式,若列名有空格可加引号
SELECT DISTINCT state -- 获得唯一值列表
一些子句:WHERE(条件筛选),ORDER BY(排序),LIMIT(限制)
-- WHERE子句扩展(筛选)
WHERE birth_date >= '1990-01-01' --日期标准格式
WHERE state IN ('VA', 'FL', 'GA')
WHERE birth_date BETWEEN '1990-01-01' AND '2020-01-01'
WHERE phone IS NULL -- 匹配空值
WHERE last_name LIKE 'b%' -- 匹配b开头的对象,大小写无关
WHERE last_name LIKE 'b____' -- %任意匹配长度字符,下划线匹配单个字符
WHERE last_name REGEXP 'field' --正则表达式
-- 正则表达式,组合特殊字符建立复杂筛选
'field'包含,'^field'以开头,'field$'以结尾
'aa|bb'并行,'[abcd]e'单字符并行,'[a-d]e'并行优化
-- WHERE嵌套'SELECT子查询'
WHERE client_id =(
SELECT client_id
FROM clients
WHERE name = 'Myworks
)
-- ORDER子句扩展(排序)
ORDER BY state, first_name -- 主次关键词
ORDER BY first_name DESC -- 降序排列,MySQL以外数据库对此支持不好
ORDER BY 1, 2 -- 可填列序,但应尽量避免
-- LIMIT子句扩展(限制)
LIMIT 10 -- 仅显示前10条
LIMIT 6, 3 -- 跳过前6条,显示后3条
-- 一些运算符
>,<,=,>=,<=,!=
AND,OR,NOT
IN,BETWEEN,IS NULL,LIKE,REGEXP
JOIN(连接)(连接字段与字段)
-- 内部链接,可且建议省略INNER
INNER JOIN customers -- 仅返回满足ON条件的记录
-- 外部连接[左连],可且建议省略OUTER
LEFT OUTER JOIN customers -- 返回左表[FROM]全部记录,不满足ON的右表[JOIN]返回NULL
-- 外部连接[右连],可且建议省略OUTER
RIGHT OUTER JOIN customers -- 返回右表[JOIN]全部记录,不满足ON的左表[FROM]返回NULL
-- 自然连接,后面不用加ON。不建议
NATURAL JOIN customers
-- 交叉连接[显式],也可改写为隐式
CROSS JOIN customers
-- 标准示例
SELECT orders.customer_id -- 当两个表都有相同的列名时要加前缀
FROM orders -- 原表
JOIN sql_incentory.customers -- 连接表,可跨多个数据库
ON orders.customer_id = customers.cutomer_id -- 连接条件,可布尔
-- 简化
SELECT o.customer_id
FROM orders o -- As to 'o',引用名简化
JOIN customers c -- As to 'c',引用名简化
USING(customer_id) -- 不同表拥有相同列名时简化
-- USING(order_id, product_id) -- 可匹配多个
-- 允许自己与自己连接(使用不同的别名)
-- 两个以上表的连接,连续用两个JOIN-ON子句
-- 隐式连接。不建议:若忘记WHERE语句则会生成n*m条数据的交叉连接!
SELECT *
FROM orders o, customers c
WHERE o.customer_id = c.customer_id
UNION(联合)(连接记录与记录)
-- 可合并多个SELECT表
SELECT ...
UNION
SELECT ...
INSERT(插入)
-- 标准示例
INSERT INTO customers (first_name, last_name, birth_date, address, city, state) -- 小括号可选
VALUES (DEFAULT, 'John', 'Smith', '1990-01-01', NULL) -- 自动增加的id给DEFAULT。设置默认NULL的可空值给DEFAULT或NULL都行
-- 插入多行
INSERT INTO products (name, quantity)
VALUES ('Product1', 10),('Product2', 15),('Product3', 20) -- 插入多行记录
-- 从表插入
INSERT INTO orders_archived
SELECT *
FROM orders
WHERE order_date < '2019-01-01'
-- 其他
SELECT LAST_INSERT_ID() -- 最末插入查询
UPDATE(更新,更改值)
--标准示例
UPDATE invoices
SET payment_total = 10, payment_date = '2019-03-01'
WHERE invoice_id = 1
DELETE(删除)
DELETE FROM invoices
WHERE invoice_id = 1
CREARE(创建表)
-- 复制表。注意:复制后没有主键和标记自动增加
CREATE TABLE orders_archived AS -- 这里的AS和之前的用法不同
SELECT * FROM orders
PROJECT
-- 这个教程没有,计算机基础的书有