跳至主要內容

MySQL

LincZero大约 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

-- 这个教程没有,计算机基础的书有