Kaze
Kaze
Published on 2022-04-09 / 72 Visits
0
0

MySQL入门

配置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)

img

UNION 关键字

UNION关键字可以将两个查询语句的结果合并,并去除重复数据。

UNION DISTINCT 和 UNION 的效果一样,所以我们一般直接使用UNION。

有时候我们需要展示不去重的数据,我们可以把DISTINCT关键词换为ALL关键词。


Comment