SQL相关指令整理
-
- 1 表
-
- 1.1 数据类型
-
- 数值型
- 字符串型
- 日期时间类型
- 1.2表的创建
- 1.3 表的删除
- 1.4 表的修改
- 2 数据的处理
-
- 2.1 插入数据
- 2.2 更新记录
- 2.3 删除记录
- 3 其他指令语言
-
- 3.1 SELECt
- 3.2 WHERe
- 3.3 AS
- 3.4 ORDER BY
- 3.5 GROUP BY
- 3.6 HAVINg
- 4 多表操作
-
- 4.1 多表的JOIN连接
- 4.2 自连接
- 4.3 UNIOn
SQL是用于数据库查询,删改等的一种语言,方便对数据库进行操作。本文主要讲述MySQL下的SQL相关指令。 每一行指令结束记得写分号;
DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
1 表
数据库管理着表以及表和表之间的关系,表中存储着数据,我们绝大多数的操作也都是针对于表。
数据表由行(row)和列(column)组成,是一个二维的网格结构。每个列都是一个字段,每一行是一个记录。字段由字段名称和字段的数据类型以及一些约束条件组成。
常见的约束条件:
NOT NULL:该字段的值不能为空
PRIMARY KEY: 主键,有唯一约束,不能为空,
FOREIGN KEY:外键,数据表2中索引数据表1中主键的键
NOT NULL: 非空约束
UNIQUE : 唯一约束
DEFAULT :如果插入数据时没有给该字段赋值,则使用默认值
1.1 数据类型
常见的数据类型有数值型,字符串类型和日期时间类型:
数值型
- 整数型
- TINYINT 非常小的整数
- SMALLINT 小整数
- MEDIUMINT 中等大小的整数
- INT 正常大小的整数
- BIGINT 大整数 - 浮点型(近似值)
- FLOAT 一个小的(单精度)浮点数
- DOUBLE 正常大小(双精度)浮点数 - 定点型(精确值)
- DECIMAL 定点数
字符串型
- CHAR
- VARCHAR
CHAr(X)的长度确定,VARCHAr(X)的长度可变,当X=5时,对于CHAR若输入一个字符,会用空格补齐 - BINARY
- VARBINARY
- BLOB
- TEXT
- ENUM
- SET
日期时间类型
- TIME
- DATE
- DATETIME
- TIMESTAMP
- YEAR
1.2表的创建
对于postgresSQL,创表的时候必须显示定义主键。对于MySQL,当创建表时没有显示定义主键时。首先判断表中是否有非空的整形唯一索引,如果有,则该列为主键(这时候可以使用 select _rowid from table 查询到主键列);如果没有符合条件的则会自动创建一个6字节的主键(该主键是查不到的).
所以创表的时候还是应该显示定义主键。
CREATE TABLE <table_name> (
column_name1 type1,
column_name2 type2,
...
column_nameN typeN
);
#例:
CREATE TABLE IF NOT EXISTS user(
id INT,
account VARCHAR(50) NOT NULL,
name VARCHAR(20) NOT NULL,
age INT,
gender ENUM('male','female','unknown') DEFAULT 'unknown',
PRIMARY KEY(id)#如果多个字段组合成一个主键,用逗号隔开。
#也可以在定义id时直接写成 id INT PRIMARY KEY
);
1.3 表的删除
DROp TABLE <table_name>;
);
#例
DROP TABLE user;
1.4 表的修改
使用ALTER TABLE。
1)加入column
ALTER TABLE <table_name>
ADD <definition_of_column>;
#例:
ALTER TABLE user
ADD married BINARY;
2)删除column
ALTER TABLE <table_name>
DROP COLUMN <column_name>;
#例:
ALTER TABLE user
DROP COLUMN married;
3)修改字段类型
ALTER TABLE <table_name>
MODIFY COLUMN <definition_of_column>;
#例:
ALTER TABLE user
MODIFY COLUMN married VARCHAR(5);
2 数据的处理
2.1 插入数据
直接插入
未经赋值的字段为NULL,当不指明要赋值的字段列表时,自动依次对应录入
INSERT INTO <table_name> (<要赋值的字段的有序列表>) VALUES (
<要赋值的列表,逗号隔开>
);
#例:
INSERT INTO user (id,account,name,age,gender) VALUES (
1,"橘子鸭血粉丝汤","clemence",18,"male"
);
向表2中根据表1选出的内容进行插入
INSERT INTO <table_name> (<要赋值的字段的有序列表>)
SELECT column1,..column2
FROM <table_name2>
(WHERe <限制条件>);
#例:
INSERT INTO user (id,account,name)
SELECt id,account
FROM user2
WHERe id=1;
2.2 更新记录
UPDATe <table_name>
SET <column1=value1,..,columnN=valueN>
(WHERe <限制条件>);
#例:
UPDATE user
SET name='clementine'
WHERe id=1;
2.3 删除记录
当仅有DELETE FROM时,删除所有column里的值。
DELETe FROM <table_name>
(WHERe <限制条件>);
#例:
DELETe FROM user
WHERe id=1;
3 其他指令语言
3.1 SELECt
想要删除重复项时,使用SELECT DISTINCT。
SELECT <name_of_columns>
FROM <table_name>
(WHERe <restriction>)
#---选择所有字段内数据---
SELECt *
FROM <table_name>
(WHERe <restriction>)
#例
SELECt id,name
FROM user
WHERe id=1
3.2 WHERe
以下的运算符可以在WHERe中使用:
运算符 | 描述 | 举例 |
---|---|---|
= | 等于 | WHERe id=1 |
<> | 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 != | WHERe id<>1 |
> | 大于 | WHERe id>1 |
< | 小于 | WHERe id<1 |
>= | 大于等于 | WHERe id>=1 |
<= | 小于等于 | WHERe id<=1 |
BETWEEN | 在某个范围内 | WHERe id BETWEEN 1 AND 5 |
IN | 某个列的多个可能值 | WHERe id IN (1,3,4) |
LIKE | 模糊查询搜索某种模式 | WHERe id LIKE ‘M%’ |
M 为要查询内容中的模糊信息:
- % 表示多个字值,_ 下划线表示一个字符;
- M% : 正则表达式,查询以 M 开头的所有内容。
- %M% : 查询只包含M的所有内容。
- %M_ : 查询以M在倒数第二位的所有内容
多个查询条件可以使用AND,OR来连接。
3.3 AS
重命名column。
SELECt <column1> AS <a1>, <column2> AS <a2>
FROM <table_name>
(WHERe <restriction>);
#例
SELECt id AS identifiant, account AS account_name
FROM user;
3.4 ORDER BY
对选择出的记录进行排序,DESC为从大到小排序,ASC为从小到大排序,默认为ASC。DESC 或者 ASC 只对它紧跟着的第一个列名有效,其他不受影响,仍然是默认的从小到达排序。
ORDER BY 多列的时候,先按照第一个column name排序,再对第一次排序好的各同属部分分别按照第二个column name排序
SELECt <column1>, <column2>
FROM <table_name>
(WHERe <restriction>)
ORDER BY <column_names>;
#例
SELECt id, account, name
FROM user
ORDER BY id,name DESC #先按id从小到大排序,再按照name从大到小排序
#或
ORDER BY id DESC,name #先按id从大到小排序,再按照name从小到大排序
ORDER BY id DESC, name DESC 等价于 ORDER BY CONCAT(code,name) DESC #先按id从大到小排序,再按照name从大到小排序
3.5 GROUP BY
使用GROUP BY一定要遵循single value rule:
- 跟在SELECt后的column,要么出现在了GROUP BY后面, 要么在聚合函数里
- 如果GROUP BY的column是键,则SELECT后别的column可以不遵循上述原则(但最好不要这样)
SELECT <column1,...,聚合函数(columnN)>
FROM <table_name>
(WHERe <restriction>)
GROUP BY <column1>
可以使用的聚合函数有:
- COUNT()
- AVG()
- SUM()
- MIN()
- MAX()
3.6 HAVINg
用于筛选成组后的各种数据,可以在HAVINg中使用聚合函数,但不能在WHERe中使用聚合函数。
SELECt <column1,...,聚合函数(columnN)>
FROM <table_name>
(WHERe <restriction>)
GROUP BY <column1>
HAVINg <condition>
#例
SELECt Company.name,AVG(Person.age)
FROM Company, Person
WHERe Company.name=Person.ComName
GROUP BY Company.name
HAVINg Company.type IN ('technologie','environment')
SQL中指令调用的顺序为:
FROM->WHERe->GROUP BY->HAVINg->SELECt->ORDER BY
4 多表操作
4.1 多表的JOIN连接
INNER JOIN 可以简写为JOIN,LEFT OUTR JOIN 可以简写为LEFT JOIN,RIGHT OUTER JOIN 可以简写为RIGHT JOIN。
SELECT *
FROM T1,T2
WHERe T1.C=T2.X;
#等价于
SELECt *
FROM T1 INNER JOIN T2
ON T1.C=T2.X;
4.2 自连接
SELECt *
FROM T T1, T T2
WHERe T1.X=T2.X;
4.3 UNIOn
UNIOn:R1和R2的被选出的columns的数量要一致,最后的结果会删除重复值。如果不想删除重复值可以使用UNIOn ALL
SELECt * FROM T1
UNIOn
SELECt * FROM T2