数据库基础
数据库被分为关系型数据库和非关系型数据库
使用Mysql是基于关系型数据库
而SQL全名 Structured Query Language(结构化查询语言)本质上是一种语言,MySQL才是数据库本身。
表结构设计规范
互联网公司在使用 MySQL 在设计表结构时,需要遵从以下的规范:
- 表必须要有主键。
- 一个字段只表示一个含义。
- 总是包含两个日期字段:gmt_created(创建日期),gmt_modified(修改日期),且这两个字段不应该包含有额外的业务逻辑。
- MySQL 中,gmt_created、gmt_modified 使用DATETIME 类型。
- 禁止使用复杂数据类型(数组,自定义类型等)。
- 禁止使用物理外键,使用逻辑外键
- 禁止物理删除,使用逻辑删除 is_deleted
逻辑删除(英语:logical deletion),又被称软删除、假删除,是一种数据库操作,使用标记将数据标为不可用,而不从数据库删除数据本身。使用适当的方法可恢复被删除的数据。在商业公司的实际开发中会使用。
主键
每一张数据库表都可以有一个主键(primary key),主键最大的作用就是用来标识数据,数据就像我们人,名字可能会重复,生日可能会一样,但是身份证号是肯定每个人都不一样的,身份证号就是社会体系辨别我们每个人谁是谁的键。
主键拥有以下的特点:
- 主键是一个特殊字段
- 表格可以没有主键,但是最多只能拥有一个主键
- 主键的值不能为NULL,必须有对应的值
- 主键的值必须是绝对唯一的,即不能出现两个相同的主键值,比如名字就不能作为主键,因为会出
- 现重名的情况。
- 我们一般使用主键和其他表进行关联
SQL常用数据类型
类型 | 含义 |
---|---|
VARCHAR | 可变的长字符串,可以类比于Java中的String类型 |
INT | 整型,和Java中的int类型一致 |
DOUBLE | 浮点型,和Java中的double类型一致,一般不加长度限制 |
DATETIME | 时间类型,长度为0,格式为YYYY-MM-DD HH:MM:SS,值为2019-12-31 23:59:59 |
BIGINT | 长整形,和Java中的long类型一致 |
CRUD
在计算机程序语言中,创建(Create)、读取(Read)、更新(Update)、删除(Delete),也就是CRUD;这是一连串常见的动作行为,而其行为通常是为了针对某个特定资源所作出的举动(例如:创建数据、读取数据等)。这四个行为最常见的用途能够在使用SQL数据库与网站的API端口时发现。这个词语(CRUD)最早被记载于James Martin所撰写的Managing the Data-base Environment书中。
英文 | 中文 | SQL | HTTP |
---|---|---|---|
CREATE | 创建 | INSERT(插入) | POST |
READ | 读取 | SELECT(查询) | GET |
UPDATE | 更新 | UPDATE | POST |
DELETE | 删除 | DELETE | DELETE |
表的创建:
代码语言:javascript复制CREATE TABLE `user`( //创建一个叫user的表
`id` INT(10)NOT NULL, //创建字段 其语法结构基本符合:字段名 数据类型 长度 是否为 NUL
/*id是字段名,我们用``这个符号把它包含起来。
INT 是数据类型,表示 id 这个字段是 INT 值
(10)表示 id 最长为 10 位
datetime 类型没有长度,所以不用定义长度
NOT NULL 表示这个字段不能为空,也就是必须要输入值,否则就会报错,如果这个值可以为不
输入值,那么不加 NOT NUL*/
`mobile` VARCHAR(11) NOT NULL,
`nickname` VARCHAR(40) NOT NULL,
`gmt_created` datetime ,
`gmt_modified` datetime NOT NULL,//表示创建修改时间
PRIMARY KEY ( `id` ) //约定主键 即意思为该表的主键为`id`
/*主键必须是已经约定的字段
主键不能为空
主键的值不能重复
主键最大的作用是标识,所以它最好是由计算机生成,人工不干预主键生成后的值*/
)ENGINE=InnoDB DEFAULT CHARSET=utf8; //设置储存引擎和编码方式
/*这句话的意思是储存引擎为 InnoDB,默认编码方式为 utf-8。 InnoDB 是 MySQL 的默认储存引擎,utf-8 是一种编码方式*/
定义字段的语句,语句间有 ,
,最后一句后面没有
SQL 语句以 ;
结尾。
我们有时使用以下来定义主键
代码语言:javascript复制`id` INT UNSIGNED AUTO_INCREMENT
这句话的意思是,id 会从 1 开始自增,第二个为 2,第三个为 3,依此类推。
当我们需要删除表时一般使用
代码语言:javascript复制drop table table_name;
有时也用
代码语言:javascript复制DROP TABLE IF EXISTS table_name;//表示如果存在这个表
插入语句
插入语句完整写法为:
代码语言:javascript复制INSERT INTO table_name(field1,field2,...fieldN) //field表示表内要插入的字段名
VALUES
(value1,value2,...valueN); //value 表示字段数据,其与上方field一一对应
- varchar类型插入时要用 ‘ ’ 包裹
- 对于数字 int 类型可以直接写 1
- 对于 datetime 类型可以通过 now() 这个函数来获取服务器当前时间
插入语句的简化
- 如果主键设置为自增,则可以不插入主键和对应的数据
- 如果插入的是所有的字段,可以省略字段名,直接插入值,但是类型必须全部一致,比如:
INSERT INTO table_name
VALUES
(value1,value2,...valueN);
注:两种简化不能同时使用
如果要一次性插入大量数据,可以:
代码语言:javascript复制INSERT INTO table_name
VALUES
(value1,value2,...valueN),
(value1,value2,...valueN);
插入一条数据对应表格中的一行,当规定为 NOT NULL 的字段没有给到值时,插入语句会报错。
查询语句
代码语言:javascript复制SELECT field1,field2,.... FROM table_name; //field表示要查询的字段,table_name表示表名
如:
代码语言:javascript复制SELECT
id,
name
FROM
people;
如果需要查询所以字段则也可以写成
代码语言:javascript复制SELECT * FROM people; //查询所有字段
条件查询(where语句)
实际使用中我们往往是定向对数据库进行查询,此时我们就需要使用 where 语句来限制条件。
代码语言:javascript复制SELECT * FROM table_name WHERE condition; //condition表示条件
代码语言:javascript复制SELECT
*
FROM
people
where
age > 50;
表示了查询年龄大于50岁的所有字段
Limit语句(限制)
在实际工作的数据查询中,我们有时候需要返回指定行,比如我想查询符合某个条件的前十个数据,这时候就需要使用LIMIT子句来加强查询功能。格式如下
代码语言:javascript复制SELECT * FROM table_name LIMIT parameter; //其中parameter表示limit语句的参数
具体使用如下
代码语言:javascript复制SELECT * FROM people LIMIT 5, 6;
//表示从表的第5 1行开始(数据库中的行从第0行开始计数),查询6条记录。即查询6—11行是数据
代码语言:javascript复制SELECT * FROM people LIMIT 5;
//表示查询第0-5行与一下代码作用相同
SELECT * FROM timi_adc LIMIT 0,5;
特殊使用也可如下查询第x行数据
代码语言:javascript复制SELECT * FROM people LIMIT x, 1;
Limit 语句往往与其他语句如 where 一起使用如
代码语言:javascript复制SELECT * FROM people WHERE age>10 LIMIT 5;
即查询年龄大于10的前五条数据(ps where与limit位置的前后决定语句发生的先后)
排序(Order by)语句
我们会需要对查询的数据进行排序,可以使用排序语句,具体如下
代码语言:javascript复制SELECT * FROM table_name ORDER BY field_name;
排序默认按照升序排序,对于int,double而言,是从小到大,对于varchar而言,是从字母A到Z,对于 datetime而言,是从过去到现在。
DESC关键词
排序一般使用升序排序,关键词为ASC(一般不写),我们可以通过加上DESC关键词变为降序排序
代码语言:javascript复制SELECT * FROM table_name ORDER BY field_name DESC;
与其他句子连用如:
代码语言:javascript复制SELECT * FROM people WHERE age>10 OREDER BY age LIMIT 5;
我们一般先排序再limit
更新/删除
更新语句(update):
代码语言:javascript复制UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
使用Update时必须使用 where 来做限制,否则 update 会对整列起作用
代码语言:javascript复制UPDATE
timi_adc
SET
ban_rate = 0.01
WHERE
hero_name = '艾琳';
删除语句(delete):
代码语言:javascript复制DELETE FROM table_name [WHERE Clause]
由于删除语句是不可恢复的,所以我们务必要增加WHERE语句,否则将会删除整张表格的数据。
delete 只是删除表内是数据,如果要删除整个表使用 drop table 表名
的语句,当然,我们一般也这么写 DROP
TABLE IF EXISTS table_name;