配置MySQL
安装并启动MySQL
安装:
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=423414a. mysql
进入服务:
docker exec -it mysql bash
登录:
mysql -u root -p 密码
创建数据库:
CREATE DATABASE xxx;
登出:
\quit
CRUD
表格的结构
表名:
表名就是表格名,一般在数据库中,我们将表名、字段名都小写,将数据库操作语句都大写。
字段:
在数据库表中,每一列都是一个字段,第一行是字段名,下面都是字段的值,我们读取数据时,从第二行开始读取,对应的数组下标是0。
字段必须是唯一的,即不能出现同名的字段。
字段用来约定行的值,或者和其他的表格产生联系。字段的值可以为NULL
。
主键:
每一张数据库表都可以有一个主键(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类型一致 |
数据:
通常把表格中的一行称为一条数据
创建表格
在创建表格时我们需要提供以下的属性:==表名== ==字段名== ==字段的数据类型==
CREATE TABLE `user`(
// 创建字段,字段名+数据类型+长度+是否为 NULL
`id` INT(10) NOT NULL, // 若加上AUTO_INCREMENT,则id 会从 1 开始自增
`mobile` VARCHAR(11) NOT NULL,
`nickname` VARCHAR(40) NOT NULL,
`gmt_created` datetime NOT NULL,
`gmt_modified` datetime NOT NULL,
PRIMARY KEY ( `id` ) // 这张表格的主键(primary key)是id这个字段
)ENGINE=InnoDB DEFAULT CHARSET=utf8;// 设置储存引擎和编码方式
`` 这个符号叫作 反引号 ,是用来过滤数据库关键字,比如我们会把它加在字段名和表名外面,避免字段名和表名跟 MySQL 系统的关键字冲突。
SQL 语句以 ; 结尾
删除表格:
DROP TABLE table_name;
查看表结构:
desc table_name;
插入语句(INSERT)
INSERT INTO
`user` (`id`, `mobile`, `nickname`, `gmt_created`)
VALUES
(1, '13426069530', '叶冰', now());
user是表名
id,mobile等是字段名
id的值是数字,可以直接写,比如1
mobile的值是VARCHAR类型,所以要用 ' ' 包含
gmt_created是datetime类型,我们一般使用now()这个函数来获取服务器当前时间,并将它作为值插入
简写:
如果主键设置为自增,则可以不插入主键和对应的数据
如果插入的是所有的字段,可以省略字段名,直接插入值,但是类型必须全部一致,比如:
这两种情况不可以同时简化
INSERT INTO
table_name
VALUES
(value1,value2,...valueN);
批量插入数据:
INSERT INTO
table_name
VALUES
(value1,value2,...valueN),
(value1,value2,...valueN);
插入一条数据对应表格中的一行,当规定为 NOT NULL 的字段没有给到值时,插入语句会报错。
查询(SELECT)
语法:
SELECT field1,field2,.... FROM table_name;
查询所有字段:
SELECT * FROM timi_adc;
WHERE子句:
使用WHERE语句来限定条件,它的作用类似程序语言中的if语句。
语法:SELECT * FROM table_name WHERE 条件;
Limit子句
有时候需要返回指定行,比如需要查询符合某个条件的前十个数据,这时候可以使用LIMIT子句来加强查询功能。
语法:
SELECT * FROM table_name LIMIT parameter;
parameter是LIMIT语句的参数
查询第x-y行:
第一个参数5表示从第6行开始查,第二个参数6,表示一共查询6条记录。数据库的表格类似数组,是从第0行开始数的,所以5表示第6行。
SELECT
*
FROM
timi_adc
LIMIT
5, 6;
LIMIT子句往往和WHERE等其他子句联合使用,LIMIT语句会放在WHERE语句后面
排序(ORDER BY子句)
ORDER BY 子句可以对查询结果进行排序
语法:
SELECT * FROM table_name ORDER BY field_name;
排序默认按照升序排序,对于int,double而言,是从小到大,对于varchar而言,是从字母A到Z,对于datetime而言,是从过去到现在。加上关键词DESC,可以使得排序变为降序
更新(UPDATE)
语法:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
UPDATE语句我们必须加入WHERE限定条件,否则的话UPDATE语句就会对整列起作用。
删除语句(DELETE)
语法:
DELETE FROM table_name [WHERE Clause]
由于删除语句是不可恢复的,所以我们务必要增加WHERE语句,否则将会删除整张表格的数据
DELETE 语句只删除表中的数据,如果要删除表,可以用 DROP TABLE + 表名的语句
查询优化
LIKE查询
语法:
SELECT * FROM table_name WHERE condition LIKE condition;
%:
SQL LIKE 子句中,我们使用百分号 % 字符来表示任意字符,如果我们没有使用任何的%,那此时LIKE就相当于=
%的位置会决定搜索结果的不同,%孙%
表示这个字符串含孙,孙%
表示这个字符串以孙开头,%孙
表示这个字符串以孙结尾,
_:
_尚香
和%尚香
的区别在于,假如有一个人叫公孙尚香,前者查询不到,而后者可以。
SELECT
*
FROM
timi_adc
WHERE
hero_name LIKE '%孙%';
SELECT
*
FROM
timi_adc
WHERE
hero_name LIKE '_尚香';
AND&OR
WHERE 语句使用多个条件,需要使用 AND 和 OR 关键词。
语法:
SELECT * FROM table_name WHERE conditionA AND/OR condtionB;
在多个条件冲突时,需要捋清楚自己的逻辑语句,这时候可以加上()来分隔条件
IN/NOT IN
IN子句需要配合WHERE子句使用,它是一种精准查询。
语法:
SELECT * FROM table_name WHERE column IN (condtionA,condtionB);
fever IN ('T0', 'T3');
等价于fever = 'T0' OR fever = 'T3';
,IN可以简化语法。
NOT IN 子句就是在IN前面加一个NOT,NOT就是非的意思,相当于排除这个条件
NOT LIKE 子句就是在LIKE子句前面加一个NOT,和 NOT IN的用法很相似
NULL值的处理
NULL
值不等于空值,空值是不占用存储空间的,NULL
占用存储空间
IS NULL:当列的值是 NULL 时,这个运算符返回 true
IS NOT NULL:当列的值不为 NULL,这个运算符返回 true
MySQL字符串处理
CONCAT函数
语法:
SELECT column_name1,CONCAT(column_name2,str,column_name3),column_name4 FROM table_name;
CONCAT函数可以拼接列名,也可以拼接字符串
如果拼接的值中有NULL,则结果一律为NULL
如果希望查询结果的列名叫result,可以这样写:concat(hero_name, '的胜率是', win_rate) as result
as也可以省略不写
TRIM函数
语法:TRIM (str)
trim()函数可以去掉查询结果中的空格,但是不会修改原数据。
trim()函数可以精准的去掉前面或者后面的空格,或者其他的字符
语法:
TRIM(BOTH|LEADING|TRAILING removed_str FROM str);
TRIM函数可以加上LEADING来只除去前面的空格,或者加上TRAILING来只除去后面的空格,如果都不加,则默认是BOTH。
TRIM函数可以删除指定的字符串内容,如果不加,则默认删除空格。
MySQL关联查询
左连接
语法:
SELECT
*
FROM
TableA LEFT JOIN
TableB
ON condition;
JOIN 是关联查询的关键词,基础的结构是 TableA JOIN TableB
,即表 A 和表 B 关联查询,LEFT 表示是左连接
ON 是关联查询的条件
左连接就是返回左表的所有数据,即使右表没有匹配的数据(此时右表会以 NULL 的形式匹配数据)。右表去匹配左表
表结构设计规范:
-
表必须要有主键。
-
一个字段只表示一个含义。
-
总是包含两个日期字段:gmt_created(创建日期),gmt_modified(修改日期),且这两个字段不应该包含有额外的业务逻辑。
-
MySQL 中,gmt_created、gmt_modified 使用 DATETIME 类型。
-
禁止使用复杂数据类型(数组,自定义类型等)。
-
禁止使用物理外键,使用逻辑外键
-
禁止物理删除,使用逻辑删除 is_deleted
逻辑删除,又被称软删除、假删除,是一种数据库操作,使用标记将数据标为不可用,而不从数据库删除数据本身。使用适当的方法可恢复被删除的数据。
右连接
语法:
SELECT
*
FROM
TableA RIGHT JOIN
TableB
ON condition;
多表关联查询:
有时候会对三张表以上进行关联查询,在这种情况下,我们往往会选中一张表作为主表,以它为基准,进行 LEFT JOIN 或 RIGHT JOIN 查询。
语法:
SELECT
*
FROM
TableA
LEFT JOIN TableB ON conditionA
LEFT JOIN TableC ON conditionB;
ABC多表查询的本质是A先和B进行连接,生成一张临时表D,D再和C进行连接生成最后的表的数据,更多表格的场景中,原理也是一致的。
内连接
假如我们需要查询班级A中参与B考试的学生,(A,B同时符合某一个条件的数据),得到的数据是内部共有的数据,所以连接方式称为内链接(INNER JOIN)

UNION 关键字:
UNION关键字可以将两个查询语句的结果合并,并去除重复数据。
UNION DISTINCT 和 UNION 的效果一样,所以我们一般直接使用UNION。
有时候我们需要展示不去重的数据,我们可以把DISTINCT关键词换为ALL关键词。