贡献者: addis
SHOW DATABASES;
--
注释直到行末,用 /* */
注释块
SELECT * FROM 表名;
;
隔开(即使不在一行)
SELECT
- 提取数据
UPDATE
- 更新数据
DELETE
- 删除数据
INSERT INTO
- 添加数据
CREATE DATABASE
- 创建新数据库
ALTER DATABASE
- 更改数据库
CREATE TABLE
- 创建新表格
ALTER TABLE
- 修改表格
DROP TABLE
- 删除表格
CREATE INDEX
- 新增 index (search key)
DROP INDEX
- 删除 index
SELECT 列1, 列2, ... FROM 表格名;
获取的数据表叫做 result-set。如果要选取所有列,用 *
即可 e.g. SELECT * FROM 表格名;
显示名为 表格名
的表格中全部内容
SELECT DISTINCT 列1, 列2, ... FROM 表格名;
仅列出(输出中)不完全相同的行,例如 SELECT DISTINCT Country FROM 表格名;
SELECT COUNT(*) FROM 表格名
SELECT COUNT(DISTINCT Country) FROM 表格名;
显示表格中有多少不同的国家。(这个命令在 Microsoft Access 里面没用),除了 COUNT
还有 AVG
和 SUM
SELECT MIN(列) FROM 表格名;
SELECT 列1, 列2, ... FROM 表格名 WHERE condition;
SELECT * FROM 表格名 WHERE Country='Mexico';
SELECT * FROM 表格名 WHERE CustomerID=1;
WHERE
后面可以是 =
, >
, <
, >=
, <=
, <>
(不等于,有时候 !=
也行), BETWEEN
LIKE
IN
(在几个可能的值之中)
SELECT * FROM Products WHERE Price BETWEEN 50 AND 60;
WHERE
后面的条件可以用 AND
, OR
, NOT
SELECT 列1, 列2, ... FROM 表格名 WHERE NOT condition;
SELECT * FROM 表格名 WHERE City='Berlin' OR City='München';
SELECT OCTET_LENGTH(列名) FROM 表名 WHERE ...;
可以返回 blob 的大小
SELECT EXISTS(SELECT 1 FROM 表格名 WHERE 条件);
可以检查表格中是否有满足条件的行。其中 SELECT 1
并不返回任意表格中的数据而是如果改行存在就返回 1
(一行一列的数据)。而 SELECT EXISTS()
如果接收到任何返回值就返回 1
,否则返回 0
。
SELECT * FROM 表格名 WHERE 列名 LIKE '%字符%';
可以搜索某列中是否包含 字符
。
ORDER BY
来进行排序 SELECT 列1, 列2, ... FROM 表格名 ORDER BY 列1, 列2, ... ASC|DESC;
SELECT * FROM 表格名 ORDER BY Country DESC;
SELECT MAX("time") as max_time, "order_id" FROM "orders" WHERE "customer"='david' GROUP BY "item" ORDER BY max_time DESC;
INSERT INTO 表格名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...);
插入行,如果每列都插入,那么 (列1, 列2,...)
可以省略
NULL
(见下文)
SELECT 列 FROM 表格名 WHERE 列 IS NULL;
SELECT 列 FROM 表格名 WHERE 列 IS NOT NULL;
WHERE
可以选择一条或多条 record
WHERE
,所有行的指定列都会被更新
UPDATE 表格名 SET 列1 = 值1, ..., 列n = 值n WHERE condition;
UPDATE 表格名 SET ContactName = 'Alfred Schmidt', City= 'Frankfurt' WHERE CustomerID = 1;
UPDATE 表格名 SET 列名 = 列名 + 1 WHERE ...
数值加 1。
DELETE FROM 表格名 WHERE condition;
删除符合条件的行
DELETE FROM 表格名;
删除表格的所有数据(表格还在)。
DELETE FROM 表格名 WHERE CustomerName='Alfreds Futterkiste';
ALTER TABLE 旧名字 RENAME TO 新名字;
ALTER TABLE 表名 DROP COLUMN 列名;
ALTER TABLE 表名 RENAME COLUMN 列名 TO 新列名;
CREATE TABLE Person (列1名称 类型 选项1 选项2 ... , 列2名称 类型 选项1 选项2 ... , ...)
add
。因为为了区分关键字,在命令中需要使用 "add", [add]
或者 `add`
来 escape。普通列名则不需要 escape。
INT
就是 INTEGER
。
NULL, INT, REAL, TEXT, BLOB
PRIMARY KEY
可以使表格的某一列不出现重复的值且不能为 NULL
。一个表格中只能有一个 PRIMARY KEY
,但可以是多行。
列名称 类型 UNIQUE
可以保证该列没有重复数据。
AUTO_INCREMENT
选项可以在新增一行时(如果不提供)自动比该列当前的最大值加 1,例如 ID 号。在 sqlite 中叫做 AUTOINCREMENT
且只能出现在 INT PRIMARY KEY AUTOINCREMENT
中。
PRIMARY KEY
,那就使用 FOREIGN KEY (本表列名) REFERENCES 别的表名 (别的表的列名)
。例如在 Orders
表中链接 Persons
表中名为 PersonID
的 primary key:
CREATE TABLE Orders (
OrderID INT NOT NULL,
OrderNumber INT NOT NULL,
PersonID INT,
PRIMARY KEY (OrderID),
FOREIGN KEY (PersonID) REFERENCES Persons (PersonID)
);
NOT NULL
或者 NULL
,那就默认 NULL
,也就是该列是 optional 的,允许 NULL 值。
DROP TABLE 表名
删除表。
可以在条件前面加上 JOIN 另一个表的一行 ON 当前表.列 = 另一个表.列
,然后在这个命令的任何地方,就可以使用 当前表.列
和 另一个表.列
。注意如果 WHERE
中的条件满足但 JOIN
中的条件不满足,那么该条记录将不会输出也不会报错。
一个例子:
SELECT "column1", "table2"."column2", "table3"."column3",
FROM "table1"
JOIN "table2" ON "table2"."column1" = "table1"."column2"
JOIN "table3" ON "table2"."column1" = "table1"."column3"
WHERE ...;
SELECT COUNT(1)
FROM history
JOIN entries ON history.entry = entries.id
WHERE
history.author IN (
SELECT id
FROM authors
WHERE name LIKE 'john'
) AND
history.time >= '20220101' AND
history.time <= '20230101' AND
entries.type = 'Xiao'