SQL
创建: 2021/4/11
完成: 2021/4/13
学习的背景: 以前一直都是用rails的model来处理数据库, 对于各种处理和操作都没什么问题,但是SQL会看不会写。
因为现在越来越多云端的操作都用到各种QL, 所以不仅要能看懂还得自己写,于是花点时间系统看下SQL。
第一次系统学习,因为急用,就放弃用英语学了。之后更进一步的学习全部用英文,到时候会重新从头再做一个SQL文档
此次用书: 『ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)』
安装(mac)与SQL的使用 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
安装 |
brew install postgresql brew services start postgresql # 开机自动启动服务器, 数据库不连接几乎不占资源, 自动就行 # 已经安装的可能新版本无法启动, 需要迁移数据。具体看brew的安装日志
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SQL的种类 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SQL的基本规则 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
注释 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
创建, 删除, 修改表格 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
创建数据库 |
CREATE DATABASE 数据库名; --例: CREATE DATABASE sample;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
创建表格 |
CREATE TABLE <table-name> ( < column1> <type1> <options>, <column2> <type2> <options>, ... <table_options> );
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
删除表格 |
DROP TABLE <table-name>; -- 例: DROP TABLE Samples;
● 删了不能回恢复
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
修改表格定义 |
● 删了不能回恢复
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
搜索 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SELECT |
SELECT <column-name>, ... FROM <table-name>; ● 运行顺序 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
算术运算符与比较运算符 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
逻辑运算符 |
● 一边有NULL则结果为UNKNOWN
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
统计与排序 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
统计 |
统计函数都会先剔除NULL
● 去掉重复再统计, 在参数前加上 DISTINCT
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
分组 |
SELECT ... FROM ... WHERE ... GROUP BY <column-1>, <column-2>, ...;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
对统计结果设条件 |
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING <group-condition>;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
对统计结果排序 |
SELECT ... FROM ... WHERE ... ORDER BY <column1>, <column2>, ...;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
更新数据 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INSERT |
INSERT INTO <table-name> (columns) INTO VALUES (values); -- 例 INSERT INTO shohin (shohin_id, shohin_mei, shohin_bunrui, hanbai_tanka, shiire_tanka, torokubi) VALUES (100, 'dummy', 'dummy_bunrui', 1500, 500, '2020-1-1');
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DELETE |
DELETE FROM <table-name>; -- 删除所有行 DELETE FROM <table-name> WHERE ...; -- 删除满足条件的行
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UPDATE |
UPDATE <table-name> SET <column-name> = <value>; -- 更新所有行 UPDATE <table-name> SET <column-name> = <value> WHERE ...; -- 更新满足条件的行 -- 一次更新多个列 UPDATE <table-name> SET (columns) = (values) WHERE ...;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
TRANSACTION |
BEGIN TRANSACTION -- MYSQL为 START TRANSACTION 或 BEGIN DML1 (DML, 即INSERT/DELETE/UPDATE) DML2 ... COMMIT/ROLLBACK
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
复杂的sql | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
VIEW |
--创建VIEW CREATE VIEW (<column1>, <column2>, ...) AS SELECT ... --删除VIEW DROP VIEW <view-name>;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SubQuery |
SELECT里面套SELECT
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
相关联Query |
SELECT shohin_mei, hanbai_tanka FROM shohin S1 WHERE hanbai_tanka > ( SELECT AVG(hanbai_tanka) FROM shohin S2 WHERE S1.shohin_bunrui = S2.shohin_bunrui);
嵌入的SELECT需要和主SELECT相比较的Query |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
函数, 断言, case | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
函数 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
断言 |
返回Boolean(TRUE/FALSE/UNKNOWN)的函数
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CASE |
-- 普通体, 比较都是= CASE <target> WHEN <condition1> THEN <exp1> WHEN <condition2> THEN <exp2> ... ELSE <expn> END -- 完全体 CASE WHEN <condition1> THEN <exp1> WHEN <condition2> THEN <exp2> ... ELSE <expn> END
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
集合运算与结合 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
集合运算的注意 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UNION |
SELECT ... FROM ... UNION SELECT ... FROM ...; ● 接上ALL显示重复的 SELECT ... FROM ... UNION ALL SELECT ... FROM ...;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INTERSECT |
SELECT ... FROM ... INTERSECT SELECT ... FROM ...;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
EXCEPT |
SELECT ... FROM ... EXCEPT SELECT ... FROM ...;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INNER JOIN |
只取能结合的部分 SELECT ... FROM t1 AS A INNER JOIN t2 AS B on A.dummy_id = B.dummy_id WHERE ... GROUP BY ... HAVING ... ORDER BY...; -- 例 SELECT users.username, authors.name FROM authors INNER JOIN users on authors.user_id = users.id;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
OUTER JOIN |
输出所有主表信息, 没有内容结合的填充NULL SELECT ... FROM A LEFT OUTER JOIN B ON A.b_id = b.id;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
结合三个及以上 |
SELECT users.username, authors.name, fan_comments.body FROM users LEFT OUTER JOIN authors ON users.id = authors.user_id LEFT OUTER JOIN fan_comments ON authors.id = fan_comments.author_no;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CROSS JOIN |
直积, 即所有组合, 行数为两表行数的乘积 SELECT ... FROM a CROSS JOIN b;
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
高级处理 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
window函数 |
<window-function> () OVER ([PARTITION BY <columns>] ORDER BY <sort-column>) -- 指定行范围 -- 到当前行 <window-function> () OVER ([PARTITION BY <columns>] ORDER BY <sort-column> ROWS m PRECEDING) -- 到之后n行 <window-function> () OVER ([PARTITION BY <columns>] ORDER BY <sort-column> ROWS n FOLLOWING) -- 前后 <window-function> () OVER ([PARTITION BY <columns>] ORDER BY <sort-column> ROWS BETWEEN m PRECEDING AND n FOLLOWING)
● window函数的 () 不能省略 ● PARTION BY 可省略 ● 只能用在SELECT里 ● window函数的ORDER BY与SELECT的互不影响, SELECT可以用 ORDER BY ● 指定每一次运行函数的范围
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GROUPING |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
java driver | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||