目录
前言
sql(Structured Query Language)是用于访问和处理数据库的标准计算机语言,主要分为四种。
1.DQL:数据查询语言(Data Query Language),用来获取表中的数据,保留字主要有SELECT、WHERE、ORDER BY、GROUP BY和HAVING等。
2.DML:数据操作语言(Data Manipulation Language),用来新增、变更和删除表中的数据,执行的是行级操作,保留字主要有INSERT、UPDATE和DELETE。
3.DDL:数据定义语言(Data Definition Language),用来创建、删除表或者新增、删除索引等,执行的是表级别的操作,保留字主要有CREAT、DROP、ALTER等。
4.DCL:数据控制语言(Data Control Language),用来设置、更改数据库操作者及其角色权限等,保留字主要有GRANT、REVOKE等。
一般在企业开发中,比较常用的是DQL、DML、DDL这三种。本节主要讨论的就是这三种。
1.规范要求
a)保留字关键字全部大写,其余的小写。
b)表名、字段名或索引名等建议遵守下划线命名法。驼峰命名不适合。mysql是大小写不敏感的,像testUser、TestUsEr等这些在mysql中都是一致的,等同于testuser。建议使用test_user、user_name等。
c)建议给字段和表加上备注信息。
2.DDL
2.1 创建表
2.1.1 模板
CREATE TABLE 【库名a】.【表名b】(
【字段名c1】 【字段类型属性等】,
【字段名c2】 【字段类型属性等】,
PRIMARY KEY(【字段名c1】),
UNIQUE KEY 【唯一索引名k1】(【字段名c2】) USING 【索引方法】 COMMENT '唯一索引xxx'
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='表b的备注';
说明:
a)首部也可使用CREATE TABLE IF NOT EXISTS 【库名a】.【表名b】(),防止创建表时报错。
b)一个表最多只有一个AUTO_INCREMENT列。
c)KEY:索引,主键primary key也是唯一索引,用于快速查询。
d)ENGINE:指定表的存储引擎,如:InnoDB,MyISAM,HEAP,EXAMPLE,CSV,ARCHIVE,MERGE, FEDERATED或NDBCLUSTER。如果不指定存储引擎,MySQL将默认使用InnoDB。
e)CHARSET:指定字符集,开发中一般都使用utf8,mysql中没有utf-8。
2.1.2 示例
CREATE TABLE IF NOT EXISTS test_dev.test_user(
user_id INT(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
user_name VARCHAR(45) DEFAULT NULL COMMENT '用户名',
user_code VARCHAR(255) DEFAULT NULL COMMENT '用户code',
user_update_time DATETIME DEFAULT NULL COMMENT '变更时间',
PRIMARY KEY(user_id),
UNIQUE KEY unq_name_code(user_name,user_code) USING BTREE COMMENT '用户名+code在表中唯一'
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
说明:
在test_dev数据库中创建test_user表,其中有字段user_id(主键,自增长,int类型,长度11),user_name(varchar类型,长度45,默认为null)等,唯一索引unq_name_code(user_name+user_code在表中唯一),使用InnoDB引擎,默认字符集utf8。
2.2 删除表
2.2.1 模板
DROP TABLE IF EXISTS 【库名a】.【表名b】;
2.2.2 示例
DROP TABLE IF EXISTS test_dev.test_user;
说明:
若test_dev数据库中存在test_user表,则删除test_user表。
2.3 创建索引
2.3.1 模板
CREATE [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY]【索引名i】
USING [BTREE |HASH] ON 【库名a】.【表名b】(创建索引的字段名[(length)])[ASC|DESC]
COMMENT'备注信息';
说明:
a)UNIQUE | FULLTEXT | SPATIAL:分别是唯一索引、全文索引和空间索引。
b)INDEX | KEY:都表示索引,使用其中一个即可。
c)索引名:建议不使用&*等特殊字符,可以使用下划线_。
d)BTREE | HASH:索引结构,BTREE 型或HASH型。
e)创建索引的字段名的length:主要是给字段长度大的类型(比如BLOB和TEXT)使用,如果不使用length,默认使用整列的值创建索引,使用length会根据每列的前length个字符创建索引,这样会减少索引文件的大小,节省磁盘空间。
2.3.2 示例
CREATE UNIQUE INDEX unq_comment USING BTREE
ON test_dev.test_user (user_comment(10)) COMMENT'备注信息索引';
说明:
创建唯一索引unq_comment,使用 BTREE 结构,取值test_dev库test_user表中字段user_comment前10个字符。
2.4 删除索引
2.4.1 模板
ALTER TABLE 【库名a】.【表名b】 DROP [INDEX|KEY] 【索引名i】;
2.4.2 示例
ALTER TABLE test_dev.test_user DROP INDEX unq_comment;
说明:
删除test_dev库test_user表中索引名为unq_comment的索引。
2.5 修改索引
索引是无法修改的,只能先删除索引(参考2.4 删除索引),然后创建同名索引(参考2.3 创建索引),so这一节我也省略了。
2.6 新增字段
当表已经创建,需要在表中新增字段时使用。
2.6.1 模板
ALTER TABLE 【库名a】.【表名b】 ADD 【字段名1】 【字段名1的属性】
,ADD 【字段名2】 【字段名2的属性】
,ADD 【字段名3】 【字段名3的属性】
,...;
2.6.2 示例
ALTER TABLE test_dev.test_user ADD user_height DOUBLE(5,2) DEFAULT 0.00 COMMENT '身高'
,ADD user_weight DOUBLE(5,2) DEFAULT 0.00 COMMENT '体重';
说明:
test_dev数据库中test_user表新增字段user_height(存储用户身高信息,类型double,默认值0.00)和user_weight(存储用户体重信息,类型double,默认值0.00)。
mysql中类型double、float、decimal一般都需要设置长度和小数点保留几位,如DOUBLE(5,2),括号中5表示数字总长度,不包含小数点,2表示小数点后保留2位,若超过2位则按四舍五入处理。假定要存储1.004,数据库会处理为1.00,存储1.005,则处理为1.01。若要存储2018.01,这个数字长度为6超过总长度5,数据库会报错Out of range value for column。
2.7 修改字段
表中的字段创建后,感觉字段不如意,想重新定义字段属性(不修改字段名)。
2.7.1 模板
ALTER TABLE 【库名a】.【表名b】 MODIFY 【字段名1】 【字段名1的属性】
,MODIFY 【字段名2】 【字段名2的属性】
,MODIFY 【字段名3】 【字段名3的属性】
,...;
2.7.2 示例
ALTER TABLE test_dev.test_user MODIFY user_height VARCHAR(10) DEFAULT '0.00' COMMENT '身高'
,MODIFY user_weight VARCHAR(10) DEFAULT '0.00' COMMENT '体重';
说明:
为防止数据出现Out of range value for column错误,可将test_dev数据库中test_user表字段user_height属性修改为(存储用户身高信息,类型varchar,默认值0.00),user_weight属性修改为(存储用户体重信息,类型varchar,默认值0.00)。
3.DML
3.1 insert语句
3.1.1 模板
INSERT INTO 【库名a】.【表名b】 (【字段名1】,【字段名2】,【字段名3】,...) VALUES
(【对应字段1-1的值】,【对应字段2-1的值】,【对应字段3-1的值】,...)
,(【对应字段1-2的值】,【对应字段2-2的值】,【对应字段3-2的值】,...)
,(【对应字段1-3的值】,【对应字段2-3的值】,【对应字段3-3的值】,...);
说明:
一般主键id是自增长,在insert时就不用手动添加了,数据库会自动处理。
3.1.2 示例
INSERT INTO test_dev.test_user
(user_name,user_code) VALUES
('张三','zs'),
('张一','zy');
说明:
向test_dev库中test_user表插入两条数据,分别是张三和张一。
3.2 update语句
3.2.1 模板
UPDATE 【库名a】.【表名b】
SET 【字段名1】=【对应字段1的值】,【字段名2】=【对应字段2的值】,
【字段名3】=【对应字段3的值】,...
WHERE 【条件语句】;
说明:
update每次只能更新一行数据,建议加上where条件,防止误更新整张表的数据。
3.2.2 示例
UPDATE test_dev.test_user SET user_name='李四',user_code='ls' WHERE user_id=3;
说明:
更新test_dev库中test_user 表中user_id=3的数据,使得user_name=’李四’,user_code=’ls’。
3.3 delete语句
3.3.1 模板
单表删除
DELETE FROM 【库名a】.【表名A】 [WHERE 条件];
--------------------------------------------------------------
多表删除
DELETE 【表名A】, 【表名B】 FROM 【库名a】.【表名A】
LEFT JOIN 【库名b】.【表名B】 ON [关联条件] [WHERE 条件];
说明:
使用delete语句时,建议要加上where语句,防止误删数据。
3.3.2 示例
-- 单表删除
DELETE FROM test_dev.test_user WHERE user_id=3;
-- 多表删除
DELETE tu,tp FROM test_dev.test_user tu LEFT JOIN test_dev.test_person tp ON tu.user_code=tp.person_code WHERE tu.user_id=2;
说明:
单表删除
将test_dev库中test_user表中user_id=3的数据删除。
多表删除
将test_dev库中test_user和test_person表中满足条件user_id=2的数据删除。
3.4 A表中的数据插入到B表
3.4.1 模板
INSERT INTO 【库名b】.【表名B】 (【字段名B1】,【字段名B2】,【字段名B3】,...)
SELECT 【字段名A1】,【字段名A2】,【字段名A3】,... FROM 【库名a】.【表名A】 [WHERE 条件];
说明:
A表和B表的字段要对整,像模板中字段A1的值只能插入给字段B1。
不加WHERE 条件,则A表中的所有数据插入到B表。
3.4.2 示例
INSERT INTO test_dev.test_user (user_name,user_code,user_update_time)
SELECT person_name,person_code,person_update_time FROM test_dev.test_person WHERE person_id<23;
说明:
将test_dev库中test_person表中person_id<23的数据同步到test_dev库中test_user 表。
4.DQL
DQL一般是进行查询操作,本篇文章就整合到select语句中一起讲吧。
4.1 select语句
4.1.1 模板
SELECT 【字段名1】,【字段名2】,... FROM 【库名a1】.【表名b1】
LEFT JOIN 【库名a1】.【表名b2】 ON 【a1中的字段】 = 【b1中的字段】 [AND 【其他条件】]
LEFT JOIN 【库名a2】.【表名c1】 ON 【a1或b2中的字段】 = 【c1中的字段】 [AND 【其他条件】]
...
WHERE 【查询条件】 [ORDER BY 【排序规则】 LIMIT 【起始页码】,【显示数量】];
说明:
a)LEFT JOIN ... ON ...:左连接查询,以左侧的表为主体进行关联查询,ON后面的为关联条件,若有多个关联条件,各关联条件使用AND连接,最好使用()将关联条件括起。
b)ORDER BY:后面为排序规则,多个排序规则使用,连接。
c)LIMIT:分页条件。
4.1.2 示例
SELECT user_id,user_name,order_id,order_code FROM test_dev.test_user
LEFT JOIN test_dev.test_person ON user_code = person_code
LEFT JOIN test_pre.pre_order ON (person_code = order_ref_code AND order_status = 1)
WHERE order_code LIKE '201812%' ORDER BY order_time ASC,user_id DESC LIMIT 0,2;
说明:
从test_dev数据库中的表test_user和test_person以及test_pre数据库中的表pre_order,关联条件user_code = person_code和person_code = order_ref_code 及order_status = 1,查询条件为order_code以‘201812’开头,排序规则为优先以order_time升序,order_time相同时以user_id降序排列,分页显示包含第0条在内的2条数据。