一、sql语言简介
sql是用于访问和处理数据库的标准计算机语言,主要分为四种。
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等。
本篇文章主要讨论的是mysql的DDL和DML的编写,因为DDL和DML是企业开发中最常用的。可能有人会问了,为啥子要讨论mysql,不讲别的数据库呢。呵呵,本人进入IT最先了解的数据库就是mysql,so。。。
下面开始进入正题了
二、正题
1.书写规范
无规矩不成方圆,尤其是在企业开发中,如果人人都按照自己的想法做,这样就很容易导致开发混乱,后期维护困难,review尴尬的局面。所以还是先提一下规范要求吧,别嫌我啰嗦,遵守开发规范能养成良好的开发习惯,好的开发习惯会让你在IT开发中受益匪浅的。
1.1 保留字关键字全部大写,其余的小写。这样的好处是美观大方,拿得出去带的回来,哈哈哈
1.2 表名、字段名或索引名等建议遵守下划线命名法。驼峰命名不适合。mysql是大小写不敏感的,像user、User、UsEr等这些在mysql中都是一致的,等同于user。 像test_user,user_family就是好孩子。。。
2.DDL
2.1 创建表
模板:
DROP TABLE IF EXISTS 【库名a】.【表名b】;
CREATE TABLE 【库名a】.【表名b】(
【字段名c1】 【字段类型属性等】,
【字段名c2】 【字段类型属性等】,
PRIMARY KEY(【字段名c1】),
UNIQUE KEY 【唯一索引名k1】(【字段名c2】) USING 【索引方法】 COMMENT '唯一索引xxx'
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '表b的备注';
说明:
一般的做法是先删除以前存在的同名表,然后再创建新表,也可以CREATE TABLE IF NOT EXISTS 【库名a】.【表名b】(),防止误删表。
一个表最多只有一个AUTO_INCREMENT列。
KEY:索引,主键primary key也是唯一索引,用于快速查询。
ENGINE:指定表的存储引擎,如:InnoDB,MyISAM,HEAP,EXAMPLE,CSV,ARCHIVE,MERGE, FEDERATED或NDBCLUSTER。如果不指定存储引擎,MySQL将默认使用InnoDB。
CHARSET:指定字符集,企业开发一般都使用utf8。
示例:
DROP TABLE IF EXISTS test_dev.test_user;
CREATE TABLE 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.1节)。
2.3 创建索引
模板:
CREATE [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY]【索引名i】 USING [BTREE |HASH] ON 【库名a】.【表名b】(创建索引的字段名[(length)])[ASC|DESC] COMMENT'备注信息';
说明:
UNIQUE|FULLTEXT|SPATIAL:分别是唯一索引、全文索引和空间索引。
INDEX|KEY:使用其中一个即可。
索引名:建议不使用&*等特殊字符,可以使用下划线_。
BTREE |HASH:索引结构,BTREE 型或HASH型。
创建索引的字段名的length:主要是给字段长度大的类型(比如BLOB和TEXT)使用,如果不使用length,默认使用整列的值创建索引,使用length会根据每列的前length个字符创建索引,这样会减少索引文件的大小,节省磁盘空间。
示例:
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 删除索引
模板:
ALTER TABLE 【库名a】.【表名b】 DROP [INDEX|KEY] 【索引名i】;
示例:
ALTER TABLE test_dev.test_user DROP INDEX unq_comment ;
说明:
删除test_dev库test_user表中索引名为unq_comment的索引。
2.5 修改索引
索引是无法修改的,只能先删除索引(参考2.4节),然后创建同名索引(参考2.5节),so这一节我也省略了。
3.DML
3.1 insert语句
模板:
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时就不用手动添加了,数据库会自动处理。
示例:
INSERT INTO test_dev.test_user (user_name,user_code) VALUES ('张三','zs'),('张一','zy');
说明:
向test_dev库中test_user表插入两条数据,分别是张三和张一。
3.2 update语句
模板:
UPDATE 【库名a】.【表名b】 SET 【字段名1】=【对应字段1的值】,【字段名2】=【对应字段2的值】,【字段名3】=【对应字段3的值】,... WHERE 【条件语句】;
说明:
update每次只能更新一行数据,建议加上where条件,防止误更新整张表的数据。
示例:
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语句
模板:
单表删除
DELETE FROM 【库名a】.【表名A】 [WHERE 条件];
多表删除
DELETE 【表名A】, 【表名B】 FROM 【库名a】.【表名A】 LEFT JOIN 【库名b】.【表名B】 ON [关联条件] [WHERE 条件];
说明:
使用delete语句时,建议要加上where语句,防止误删数据。
示例:
单表删除
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表
模板:
INSERT INTO 【库名b】.【表名B】 (【字段名B1】,【字段名B2】,【字段名B3】,...) SELECT 【字段名A1】,【字段名A2】,【字段名A3】,... FROM 【库名a】.【表名A】 [WHERE 条件];
说明:
A表和B表的字段要对整,像模板中字段A1的值只能插入给字段B1。
不加WHERE 条件,则A表中的所有数据插入到B表。
示例:
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 表。
三、结束语
欢迎留言交流,tks。