数据表操作
创建数据表
CREATE TABLE [IF NOT EXISTS] table_name(
column_name data_type,
...
);
//CREATE SELECT语句,将select的结果添加到新表的后面
CREATE TABLE [IF NOT EXISTS] table_name(
column_name data_type,
...
)
SELECT ...;
CREATE TABLE tdb_goods_brands(
brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT
)
SELECT brand_name FROM tdb_goods GROUP BY brand_name;
查看数据表列表
SHOW TABLES [FROM db_name]
[LIKE 'pattern' | WHERE expr]
[FROM db_name] 表示可以查看其它数据库中的数据表,查看时并不会改变当前打开的数据库
查看数据表的表结构
SHOW COLUMNS FROM table_name;
//或者
DESC table_name;
查看数据表内容
SELECT * FROM table_name;
修改数据表表结构
//添加单列
ALTER TABLE table_name ADD [COLUMN] column_name column_definition [FIRST | AFTER column_name];
//添加多列
ALTER TABLE table_name ADD [COLUMN] (col_name col_definition,...);
添加单列时,[FIRST | AFTER column_name] ,表示新添加的列在指定列的前一列或后一列,若不加该参数项则表示在最后面添加新列
添加多列时,无法指定位置,只能将添加的列置于最末端
//删除列
ALTER TABLE table_name DROP [COLUMN] col_name;
删除和添加列可以在一条语句中同时进行,之间用逗号分隔
ALTER TABLE table_name DROP col_name1, ADD col_name2 col_definition2;
//使用"MODIFY"修改列定义 (只能修改列的类型,列的位置)
ALTER TABLE table_name MODIFY [COLUMN] column_name column_definition [FIRST | AFTER column_name];
//使用"CHANGE"修改列定义 (可以修改列名称,列类型,列的位置)
ALTER TABLE table_name CHANGE [COLUMN] old_col_name new_col_name col_definition [FIRST | AFTER col_name];
//修改数据表名
//方法1
ALTER TABLE table_name RENAME [TO|AS] new_table_name;
//方法2
RENAME TABLE table_name TO new_table_name [,table_name2 TO new_table_name2]...;
//添加主键约束
ALTER TABLE table_neme ADD [CONSTRINT[symbol]] PRIMARY KEY [index_type] (index_col_name,...);
//删除主键约束
ALTER TABLE table_name DROP PRIMARY KEY;
[CONSTRINT[symbol]] 参数可以为添加的主键起名字
//添加唯一约束
ALTER TABLE table_name ADD [CONSTRAINT[symbol]]UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name);
//删除唯一约束
ALTER TABLE table_name DROP {INDEX | KEY} index_name;
//添加外键约束
ALTER TABLE table_name ADD [CONSTRAINT[symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition;
//删除外键约束
ALTER TABLE table_name DROP FOREIGN KEY fk_symbol;
fk_symbol 是外键的名字,如若不指定,系统会自动分配,可以通过 "SHOW CREATE TABLE table_name;" 查看
ALTER TABLE test ADD FOREIGN KEY (username) REFERENCES test2 (id);
//添加或删除默认约束
ALTER TABLER table_name ALTER [COLUMN] column_name {SET DEFAULT literal | DROP DEFAULT};
记录操作
插入记录
//方法1 INSERT VALUES
INSERT [INTO] table_name [(col_name1,col_name2,...)]
{VALUES|VALUE} ({EXPR|DEFAULT},...),(...),...;
省略 [(col_name1, col_name2,...)] 时,意味着需要为所有的字段赋值,
主键自增列插入赋值时可以赋为"NULL" 或 "DEFAULT", 该列仍保持自增性
插入时所赋的值也可以为表达式(expr), 默认值 (DEFAULT, 定义了默认值的情况下)
//方法2 INSERT SET
INSERT [INTO] table_name
SET col_name1={expr|DEFAULT},col_name2={expr|DEFAULT},...;
方法2与方法1的区别在于,方法2可以使用子查询(SubQuery),因为set后跟着比较运算符"="
方法2一次性只能插入一条记录,而方法1一次性可以插入多条记录
//方法3 INSERT SELECT
INSERT [INTO] table_name [(col_name,...)]
SELECT...;
方法3可以将查询的结果插入到指定的数据表
INSERT test(username)
SELECT username FROM user WHERE age>25;
INSERT tdb_goods_cates (cate_name)
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
更新记录
//单表更新
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr|DEFAULT} [,col_name2={expr|DEFAULT}]...
[WHERE where_condition];
UPDATE user SET age=age+2 WHERE id>20;
删除记录
//单表删除
DELETE FROM table_name [WHERE where_condition]
删除数据表中的所有记录(清空数据表)
TRUNCATE TABLE table_name;
查找记录
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 | exor | position} [ASC | DESC],...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
]
1.查询表达式 select_expr
- 每一个表达式表示想要的一列,必须至少有一个
- 多个列之间用英文逗号分隔
- 星号(*)表示所有列,table_name.*可以表示命名表的所有列
- 查询表达式可以使用 [AS] alias_name 为其查询的字段赋予别名,查询结果将以别名显示
- 别名可以用于GROUP BY, ORDER BY 或 HAVING 子句
- 查询表达式中的字段顺序可以和原数据表中的字段顺序不一致,查询结果按照查询表达式中的字段顺序排列
SELECT id,username FROM test;
//为查询结果设置别名
SELECT id AS uid, username AS uname FROM test;
2.条件表达式 WHERE
- 用于对记录进行过滤,如果没有指定WHERE子句,则显示所有记录
- 在WHERE表达式中,可以使用MySQL支持的函数或者运算符
3.查询结果的分组 GROUP BY
- 对查询到的记录分组时,可以通过列的列名(col_name) 也可以通过列的位置(position)进行划分
- 列位置指的是查询语句中出现的字段的位置
SELECT sex FROM user GROUP BY sex;
SELECT sex FROM user GROUP BY 1;
4.分组条件 HAVING
- HAVING 后跟的字段要么出现在选择字段中要么出现在聚合函数中
SELECT id, sex FROM test GROUP BY 2 HAVING id>10;
SELECT sex FROM test GROUP BY sex HAVING count(id)>15;
5.对查询结果进行排序 ORDER BY
- 根据选择语句中出现的字段名或者出现的字段序号进行排序
- 出现多个字段时,先按先出现的字段排,先出现的字段的值一样时,在根据后面的字段排序
- DESC表示降序,ASC表示升序
SELECT * FROM user ORDER BY id, sex DESC;
6.限制查询结果的返回数量 LIMIT
- LIMIT a, b 表示从查询结果中编号为a的记录开始依次显示b条记录 (第一条记录的编号为0,后面依次递增)
SELECT * FROM user LIMIT 2,2;
约束
- 约束保证了数据的完整性和一致性
- 约束分为表级约束和列级约束,只对一个字段做约束属于列级约束
- 约束类型包括:NOT NULL(非空约束),PRIMARY KEY(主键约束),UNIQUE KEY(唯一约束),DEFAULT(默认约束),FOREIGN KEY(外键约束)
非空约束
- NULL: 该字段可以为空
- NOT NULL: 该字段不可为空
CREATE TABLE tb_name (
username VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED NULL);
自动编号设定
- AUTO_INCREMENT: 自动编号,且必须与主键组合使用;
- 默认起始值为1,每次增量也为1
主键约束
- PRIMARY KEY : 主键约束
- 每张数据表只能存在一个主键
- 定义为主键的字段不允许赋重复的值,主键用于保证记录的唯一性
- 主键自动为NOT NULL
- AUTO_INCREMENT必须与主键一起使用,但主键不一定要与AUTO_INCREMENT一起使用
唯一约束
- UNIQUE KEY: 唯一约束
- 每张数据表可以存在多个唯一约束
- 唯一约束可以保证记录的唯一性
- 唯一约束的字段可以为空值(NULL)
默认约束
- DEFAULT : 默认值
- 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值
CREATE TABLE table_name (
sex ENUM('1','2','3') DEFAULT '3'
);
外键约束
- FOREIGN KEY:外键约束
- 保证数据的一致性和完整性
- 实现数据表的一对一或一对多关系
1.外键约束的要求:
- 父表和子表必须使用相同的存储引擎,而且禁止使用临时表
- 数据表的存储引擎只能为Inno DB
- 外键列(FOREIGN KEY)和参照列必须具有相似的数据类型.其中,数字的长度或是否有符号位必须相同;而字符的长度可以不同
- 外键列和参照列必须创建索引.如果外键列不存在索引的话,MySQL将自动创建索引
2.编辑数据表的存储引擎
在MySQL配置文件(my.ini)中修改,default-storage-engine=INNODB
3.使用外键
CREATE TABLE provinces(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL);
CREATE TABLE user(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES provinces(id));
父表为"provinces",子表为"user", 具有相同的存储引擎INNODB;
外键列为"pid",参照列为"id",外键列和参照列必须具有相似的数据类型"SMALLINT UNSIGNED"
参照列 "id" 设置了主键约束,而主键约束字段会默认创建索引, 外键列 "pid" 没有创建索引,但MySQL会自动为外键列创建索引
查看索引
SHOW INDEXES FROM table_name\G;
root@localhost test>SHOW INDEXES FROM provinces\G;
*************************** 1. row ***************************
Table: provinces
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL
1 row in set (0.32 sec)
ERROR:
No query specified
root@localhost test>SHOW INDEXES FROM user\G;
*************************** 1. row ***************************
Table: user
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL
*************************** 2. row ***************************
Table: user
Non_unique: 1
Key_name: pid
Seq_in_index: 1
Column_name: pid
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL
2 rows in set (0.19 sec)
ERROR:
No query specified
4.外键约束的参照操作
- CASCADE : 从父表删除或更新则自动删除或更新子表中匹配的行
- SET NULL : 从父表删除或者更新行,则设置子表中的外键列为NULL.如果使用该选项,则必须保证子表列没有指定NOT NULL
- RESTRICT : 拒绝对父表的更新或删除操作
- NO ACTION : 标准SQL的关键字,在MySQL中与RESTRICT相同
CREATE TABLE provinces(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL);
CREATE TABLE user(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES provinces(id) ON DELETE CASCADE);
5.表级约束与列级约束
- 对一个数据列建立的约束,称为列级约束
- 对多个数据列建立的约束,称为表级约束
- 列级约束既可以在列定义时声明,也可以在列定义后声明;表级约束只可以在列定义后声明
- NOT NULL约束和DEFAULT约束不存在表级约束