- 数据库
- MySQL 中的SQL(2)
#### 表级约束和列级约束
对一个数据列建立的约束,称为列级约束。
对多个数据列建立的约束,称为表级约束。
列级约束既可以在列定义时声明,也可以在列定义后声明。
表级约束只能在列定义后声明。
#### 数据表操作
数据表(或称表)是数据库最重要的组成部分之一,是其它对象的基础。数据表即二维表,行称为记录,列称为字段。
#### USE
打开数据库
`USE 数据库名称;`
#### 创建数据表
CREATE TABLE [IF NOT EXISTS] table_name (column_name data_type, ...)
#### 查看数据表列表
SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr]
#### 查看数据表结构
SHOW COLUMNS FROM tbl_name
#### 插入表记录
INSERT [INTO] tbl_name [(col_name,...)] VALUES(val,...)
如果省略col_name就需要写全数据表所有的值。
#### 记录查找
SELECT expr,... FROM tbl_name
#### 添加单列(数据表字段)
ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name]
省略[FIRST|AFTER col_name]参数将位于所有列的最后面。
#### 添加多列(数据表字段)
ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition, ...)
#### 删除列(数据表字段)
ALTER TABLE tbl_name DROP [COLUMN] col_name
#### 添加主键约束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name, ...)
#### 添加唯一约束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name, ...)
#### 添加外键约束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) reference_definition
#### 添加/删除默认约束
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
#### 删除主键约束
ALTER TABLE tbl_name DROP PRIMARY KEY
#### 删除唯一约束
ALTER TABLE tbl_name DROP {INDEX | KEY} index_name
#### 删除外键约束
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
#### 修改列定义
ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
#### 修改列名称
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]
#### 数据表更名
#方法1
ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name
#方法2
RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ...
####数据表数据操作
#####INSERT
#插入记录(可以插入多条记录)
INSERT [INTO] tbl_name [(col_name, ...)] {VALUES|VALUE} ({expr|DEFAULT}, ...), (...), ...
#插入记录(不可以插入多条记录)
INSERT [INTO] tbl_name SET col_name = {expr|DEFAULT}, ...
说明:与前一种方式的区别在于,此方法可以使用子查询(SubQuery)。由比较运算引发子查询(SubQuery)。
# 插入记录
INSERT [INTO] tbl_name [(col_name, ...)] SELECT ...
# 说明:此方法可以将查询结果插入到指定数据表。
示例:
1.创建“商品分类”表
CREATE TABLE IF NOT EXISTS tdb_goods_cates(cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,cate_name VARCHAR(40));
2.查询tdb_goods表的所有记录,并且按"类别"分组
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
3.将分组结果写入到tdb_goods_cates数据表
INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
##### UPDATE
# 更新记录(单表更新)
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1 = {expr|DEFAULT} [, col_name2 = {expr|DEFAULT}] ... [WHERE where_condition]
##### DELETE
# 删除记录(单表删除)
DELETE FROM tbl_name [WHERE where_condition]
##### SELECT
# 查找记录
SELECT select_expr [, select_expr ...]
[
FROM table_references
[WHERE where_condition]
[GROUP BY {col_name|position} [ASC|DESC], ... ]
[HAVING where_condition]
[ORDER BY {col_name|expr|position} [ASC|DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
]
##### select_expr 查询表达式
每一个表达式表示想要的一列,必须至少有一个。
多个列之间以英文逗号分隔。
星号(`*`)表示多有列。`tbl_name.*`可以表示命名表的所有列。
查询表达式可以使用[AS] alias_name为其赋予别名。
别名可用于GROUP BY,ORDER BY或HAVING子句。
##### WHERE 条件表达式
对记录进行过滤,如果没有指定WHERE子句,则显示所有记录。
在WHERE表达式中,可以使用MySQL支持的函数或运算符。
##### GROUP BY 查询结果分组
`[GROUP BY {col_name|position} [ASC|DESC], ... ]`
ASC:生序,默认值。
DESC:降序。
##### HAVING 分组条件
`[HAVING where_condition]`
`where_condition`中要么使用聚合函数,要么出现的字段一定要在SELECT中出现。
聚合函数:count() …
##### ORDER BY 对查询结果进行排序
`[ORDER BY {col_name|expr|position} [ASC|DESC], ...]`
##### LIMIT 限制查询返回的数量
`[LIMIT {[offset,] row_count | row_count OFFSET offset}]`
offset是从0开始的。
##### CREATE … SELECT
创建数据表同时将查询结果写入到数据表
`CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition, ...)] select_statement`
示例:
* 通过CREATE…SELECT来创建数据表并且同时写入记录
CREATE TABLE tdb_goods_brands (brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,brand_name VARCHAR(40) NOT NULL) SELECT brand_name FROM tdb_goods GROUP BY brand_name;
#### 子查询
子查询(Subquery)是指出现在其他SQL语句内的SELECT子句。例如:
`SELECT * FROM t1 WHERE col1=(SELECT col2 FROM t2);`
其中`SELECT * FROM t1`称为Outer Query/Outer Statement。`SELECT col2 FROM t2`称为SubQuery。
子查询指嵌套在查询内部,且必须始终出现在圆括号内。子查询可以包含多个关键字或条件,如DISTINCT、GROUP BY、ORDER BY、LIMIT函数等。子查询外层的查询可以是:SELECT、INSERT、UPDATE、SET或DO。
子查询可以返回标量、一行、一列或子查询。