mysql 数据库 常见命令和实例

第一章 为什么选择mysql

1.1 什么是数据库

将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合称为数据库 (DataBase,简称 DB)
用来管理数据库的计算机系统称为数据库管理系统 (DataBase Management System,简称DBMS)。
从事管理和维护数据库管理系统(DBMS)的相关工作人员称为数据库管理员(Database Administrator 简称DBA)

为什么要使用数据库?
因为数据库可以多人共享数据 应对多次修改数据 操作大量数据。

1.2数据库的分类

关系型数据库:把复杂的数据结构归结为简单的二元关系(即二维表格形式)

表的结构:

表由表名、行、列、列名(表格的第一行)构成
表格实质上是一个二维数组,行和列都是从 0 开始数的(数组的特性)

表的关系:关系就是数据能够对应的匹配,在关系型数据库中正式名称叫联结,对应的英文名称叫做 join。
SQL(Structured Query Language)结构化查询语言,用于从数据库中有结构的查询。
NoSQL(非关系型数据库)泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的 ACID 特性(为了解决大规模数据集合多重数据种类带来的挑战)

相较于其他关系型数据库,例如oracle和sqlserver mysql免费开源,所以一般都会选择mysql数据库。

1.3 线上数据库的购买和设置

RDS(Relational Database Service),关系型数据库服务是一种即开即用、稳定可靠、可弹性伸缩的在线数据库服务。
我们来看看rds和自建数据库的差别:

支出项 自建数据库 rds
运维 需要招一个靠谱的 DBA,年薪 12w 不需要额外招人,无额外费用
服务器及扩容 需要购买昂贵的服务器,扩容时间按月计 可以按需购买服务器,扩容时间按分钟计
备份和网络安全 需要自行搭建防火墙和备份机 不需要,阿里云会提供相应的服务
网络费和电费 需要专门搭建网络专线,并缴纳不菲的电费和通
信费,机房需要防尘防水通风 不需要,机器在阿里云上面
故障解决能力 解决按日计算,由自己的 DBA 负责解决 解决按小时计算,解决不了就投诉,搞个大新闻
抗灾能力 服务器会老化会起火会出现各种意外 阿里云保障安全,出问题阿里云赔偿

自己在阿里云上面购买rds然后配置数据库。(上网找视频)

第二章 crud

2.1 表格的结构

数据库和表:在云服务器上我们可以创建很多DB,它们共用一个云服务,我们配置链接的是其中一个数据库。

表名:一般英文小写字母,单词之间用_分隔
字段:在数据库表中,每一列都是一个字段,第一行是字段名,下面都是字段的值,我们读取数据时,从第二行开始读取,对应的数组下标是0

主键:每一张数据库表都可以有一个主键(现在要求要有)(primary key),主键最大的作用就是用来标识数据.特点:
1 主键是一个特殊字段
2 表格可以没有主键,但是最多只能拥有一个主键
3 主键的值不能为NULL,必须有对应的值
4 主键的值必须是绝对唯一的,即不能出现两个相同的主键值,比如名字就不能作为主键,因为会出现重名的情况。
5 我们一般使用主键和其他表进行关联

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
英文 中文 SQL HTTP
CREATE 创建 INSERT(插入) POST
READ 读取 SELECT(查询) GET
UPDATE 更新 UPDATE POST
DELETE 删除 DELETE DELETE

2.2 创建表格

创建表格时,我们需要提供:表名 字段名 字段的数据类型
创建表格:

CREATE TABLE  `user`()   //创建一个名为user的表格

创建字段:

字段名+数据类型+长度+是否为 NULL
`id` INT(10)NOT NULL,                  //not null表示必须要输入值
`mobile` VARCHAR(11) NOT NULL,
`nickname` VARCHAR(40) NOT NULL,
`gmt_created` datetime ,                 //datetime 类型没有长度,所以不用定义长度
`gmt_modified` datetime NOT NULL,

约定主键:

PRIMARY KEY ( `id` )                     //表示主键为id字段

主键特点:
主键必须是已经约定的字段
主键不能为空
主键的值不能重复
主键最大的作用是标识,所以它最好是由计算机生成,人工不干预主键生成后的值

`id` INT UNSIGNED AUTO_INCREMENT         //表示id从1开始自加 

企业开发中,往往会使用BIGINT作为主键,防止数据溢出。

设置存储引擎和编码方式:

ENGINE=InnoDB DEFAULT CHARSET=utf8       //储存引擎为 InnoDB,默认编码方式为 utf-8

符号:
所有的符号都是英文输入法输入的
``这个符号用来过滤数据库关键字,比如我们会把它加在字段名和表名外面,注意和 VARCHAR 类型的’'符号做区分
定义字段的语句,语句间有,,最后一句后面没有
SQL 语句以;结尾

关键词或保留字
当你看到单词变了颜色,就说明它是关键字

删除表格:

drop table table_name;             //table_name 表格名
另一种写法
DROP TABLE IF EXISTS table_name; 

2.3插入语句(insert)

插入数据的语法:

INSERT INTO table_name(field1,field2,...fieldN)
VALUES
(value1,value2,...valueN);                       //表示插入若干个字段和对应的值

例如
INSERT INTO
  `user` (`id`, `mobile`, `nickname`, `gmt_created`)
VALUES
  (1, '13426069530', '叶冰', now()); //gmt_created是datetime类型,我们一般使用now()
                                      这个函数来获取服务器当前时间,并将它作为值插入

插入语句的简化: 如果主键设置为自增,可以不添加主键的字段和值
如果插入的是所有的字段的数据,那么可以省略字段名,直接插入值。

INSERT INTO table_name
VALUES
(value1,value2,...valueN);

批量插入数据:

INSERT INTO table_name
VALUES
(value1,value2,...valueN),              //对应一行
(value1,value2,...valueN);              //对应表格的一行

2.4 查询select

语法:

SELECT field1,field2,.... FROM table_name;  //从指定表中查询指定列的信息
SELECT * FROM timi_adc;               //查询timi_adc的所有字段信息


SELECT
  id,
  hero_name
FROM
  timi_adc;              //从timi_adc中查询hero-name字段的信息

限定条件 where子句
语法:

SELECT * FROM table_name WHERE condition;  //condition就是条件判断

2.5 limit子句

返回指定的行数
语法

SELECT * FROM table_name LIMIT parameter;   //parameter是参数

示例
SELECT * FROM timi_adc  LIMIT 
  5, 6;          //这句话表示返回第6行开始的之后6行  第一个参数5表示从第6行开始,第二个6表示查询6行

SELECT * FROM timi_adc  LIMIT 5;  //表示查询一到5行 等同于limit 0,5

一般会和where一起使用,例如:查询查询登场率超过百分之10的前5条数据

SELECT  * FROM  timi_adc WHERE  appearance_rate > 0.1 LIMIT 5;

2.6排序 order by子句

语法:排序默认按照升序排序,对于int,double而言,是从小到大,对于varchar而言,是从字母A到Z,
对于datetime而言,是从过去到现在

SELECT * FROM table_name ORDER BY field_name;

示例
SELECT
  *
FROM
  timi_adc
ORDER BY
  win_rate;             //胜率从小到大排序

加上desc使其变为倒序

SELECT
  *
FROM
  timi_adc
ORDER BY
  win_rate DESC;       //胜率从大到小排序

2.7 更新和删除

更新 update语句语法:
注意:UPDATE语句我们必须加入WHERE限定条件,否则的话UPDATE语句就会对整列起作用

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

示例:
UPDATE
  timi_adc
SET
  ban_rate = 0.01
WHERE
  hero_name = '艾琳';           //把艾琳的ban率改为0.01

删除语句语法:

DELETE FROM table_name [WHERE Clause]

示例
delete from user where id=4; //删除id=4的行

delete from `user` where id<20; //删除id小于20的所有行

delete from user;  //删除表中所有数据

第三章 查询优化

3.1 like 查询

我们来看看模糊查询: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 '_尚香'; //表示查询名为x尚香的英雄 如孙尚香可以被查询到而公孙尚香不可以

3.2 and 与or

使用多个条件时会使用and和or关键字

 SELECT * FROM table_name WHERE conditionA AND/OR condtionB;

示例
SELECT
  *
FROM
  timi_adc
WHERE
  win_rate > 0.5
  AND win_rate < 0.51
  OR win_rate < 0.47;   //胜率在0.5到0.51或者小于0.47的英雄信息

我们可以添加()来分割条件,使得条件更加清晰

3.3 in/not in

精准查询 in 语法:

SELECT * FROM table_name WHERE column IN (condtionA,condtionB);

示例:
SELECT
  *
FROM
  timi_adc
WHERE
  fever IN ('T0', 'T3');  //表示查询热度to或者t3的英雄

not in /not like

SELECT
  *
FROM
  timi_adc
WHERE
  fever NOT IN ('T0')  //表示查询除了to之外的所有英雄 not in表示否定  注意括号不能省略

3.4 null值的处理

null的概念:NULL对应的是NOT NULL,它们是 MySQL 字段的数据类型的属性,本身不属于任何数据类型,
NULL值也不等于空值,空值是不占用存储空间的,NULL占用存储空间

MySQL为处理 NULL 值提供了三种运算符:
IS NULL:当列的值是 NULL 时,这个运算符返回 true
IS NOT NULL:当列的值不为 NULL,这个运算符返回 true
<=>:比较操作符,当比较的两个值都为 NULL 时或者相等时,返回为 true

语法:

SELECT field_name1,field_name2
FROM table_name
WHERE field_name2 IS NOT NULL/IS NULL;  

示例:
SELECT
  id,
  mobile
FROM
  student
WHERE
  mobile IS NOT NULL;          //查询mobile不为空的字段的id和mobile

第四章 mysql字符串处理

4.1 concat 函数

concat函数可以处理字符串,我们来看看它的语法:

SELECT column_name1,CONCAT(column_name2,str,column_name3),column_name4 FROM table_name;
输出结果:列名为column_name1,CONCAT(column_name2,str,column_name3) 列的内容为 拼接值

我们来分析一下语法:
首先这是一个查询语句,最基本的结构是 SELECT 列名 FROM 表名
CONCAT函数可以拼接列名,也可以拼接字符串
在使用CONCAT函数的时候可以同时查询其他的列
CONCAT函数的参数之间用英文,分隔

注意:如果拼接的值中有NULL,则结果一律为NULL,

别名:as 关键字

SELECT
  concat(hero_name, '的胜率是', win_rate) as result      //自定义为result
FROM
  timi_adc
WHERE
  id = 3;

4.2trim 函数

我们经常会使用trim函数来清除数据中的空格
语法:

TRIM (str)

示例
SELECT
  trim(hero_name),
  trim(fever)
FROM
  timi_adc
WHERE
  id = 20;

语法拓展:
trim()函数也可以精准的去掉前面或者后面的空格,或者其他的字符,语法如下:

TRIM( BOTH|LEADING|TRAILING removed_str FROM str);

TRIM函数可以加上LEADING来只除去前面的空格,或者加上TRAILING来只除去后面的空格,如果都不加,则默认是BOTH
TRIM函数可以删除指定的字符串内容,如果不加,则默认删除空格

SELECT
  TRIM(
    TRAILING 'Q'            //去除qtiq尾部的q
    FROM
      fever
  )
FROM
  timi_adc
WHERE
  id = 21;

replace函数
TRIM()函数不能去掉字符串中间的值,如果要修改中间的值,我们可以使用REPLACE()函数,它的语法如下

UPDATE table_name 
SET colunm_name = 
REPLACE(column_name,string_find,string_to_replace) 
WHERE conditions;

第五章 mysql 关联查询

###5.1 左连接

语法:

SELECT
  *
FROM
  TableA LEFT  JOIN
  TableB
  ON condition;

JOIN 是关联查询的关键词,基础的结构是 TableA JOIN TableB,即表 A 和表 B 关联查询,LEFT 表示是左连接
ON 是关联查询的条件
左连接就是返回左表的所有数据,即使右表没有匹配的数据(此时右表会以 NULL 的形式匹配数据)。

表结构涉及规范:
1 一个字段只表示一个含义。
2 总是包含两个日期字段:gmt_created(创建日期),gmt_modified(修改日期),且这两个字段不应该包含有额外的业务逻辑。
3 MySQL 中,gmt_created、gmt_modified 使用 DATETIME 类型。
4 禁止使用复杂数据类型(数组,自定义类型等)
5 表必须要有主键。
6 禁止使用物理外键,使用逻辑外键
7 禁止物理删除,使用逻辑删除 is_deleted

注意:使用有关联关系的字段进行关联查询,这样能查询得到有意义的数据。

5.2 右连接

返回右表所有的数据,即使左表没有匹配的数据
语法:

SELECT
  *
FROM
  TableA RIGHT JOIN 
  TableB 
  ON condition;

多表关联查询:
在实际应用中,我们有时候会对三张表以上进行关联查询,在这种情况下,我们往往会选中一张表作为主表,以它为基准,
进行LEFT或者RIGHT JOIN查询。
语法:

SELECT
  *
FROM
  TableA LEFT JOIN 
  TableB ON conditionA
  LEFT JOIN
  TableC
  ON conditionB;                 // A先和B关联 然后再和C关联

5.3 内连接


得到的是两张表内部共有的数据
语法:

SELECT
  *
FROM
  Table_A
  INNER JOIN Table_B
ON
  Table_A.id = Table_B.student_id;

这里INNER可以省略,只写JOIN,效果是一样的,LEFT JOIN 和 RIGHT JOIN都属于外连接,和内连接对应。

外连接得到的内容:

或者

如果我们想得到下面这种情况:

SELECT
  *
FROM
  Table_A
  LEFT JOIN Table_B ON Table_A.id = Table_B.student_id
WHERE
  Table_B.student_id IS NULL;            // 这是公共部分

union关键字

相当于同时执行左连接和右连接:

SELECT
  *
FROM
  Table_A
  LEFT JOIN Table_B
ON
  Table_A.id = Table_B.student_id
UNION DISTINCT                    //合并结果并且去除重复  用all则不去重
SELECT
  *
FROM
  Table_A
  RIGHT JOIN Table_B ON Table_A.id=Table_B.student_id;

笛卡尔积:
假设有表A,包含2条数据,以AB代指,集合B,包含3条数据以abc代指,
使用cross join关键词查询,得到的结果会是单纯的乘积,一共2*3=6条数据。
在MySQL中INNER JOIN,CROSS JOIN,JOIN都是等价的,
一般INNER JOIN配合ON使用,CROSS JOIN配合其他条件使用。


版权声明:本文为qq_41893646原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。