MYSQL从0到1

一:MySQL 基础指令学习

1:MySQL的登录

对于MySQL的登录 , 我们可以在电脑上win + r来打开cmd窗口 , 使用"mysql -u root -p" , 来进行MySQL服务的启动

2:数据库的退出:

我们在cmd窗口内部输入"exit" , 就可以直接退出MySQL了!

 3:MySQL常用命令

查看MySQL中有哪些数据库?    

show databases;

 

4:使用数据库

use 数据库名称;

5:创建数据库

create databse 数据库名称;


二:对于基础知识的了解

1:表的理解:

其实数据库本质上就是用表格来存储数据的 

任何的一个表格都是以二维数组的形式存在的 , 而且都有行 , 列 

对于数据库而言 ,

这里的行被称为 "记录 / 数据"

这里的列被称为 "字段"

 对于MySQL的数据是具有约束性的 , 比如说在性别这个字段里面 , 下面的属性只能写"男 / 女 / 保密"这种类型 , 而不能去写一串数字 , 这就不符合MySQL的数据定义规则了 

并且每一个字段 , 其实都有约束性要求:

比如 :字段名 , (数据 / 字段)类型  , 约束等属性

字段名:字段的名称

数据类型:字符串 , 整型 , 浮点型等等......

约束:其中有很多的约束 , 就比如说"唯一性约束" , 指出这些约束的字段一旦添加了之后 , 就不能够重复地填写了 , "比如你的学号 , 你的学号是你自己的唯一标识 , 你要是学号都重复了 , 那么学校就有两个学号和你一样的人 , 那考试作弊了我们该处分谁呢?"

2:查看数据库中的表

show tables;

此时我们的数据库也是刚刚创建出来 , 是没有表的 , 就会显示"Empty set"

那么此时我们看一下电脑内部的mysql的表有什么?

第一步:

use mysql;

此时已经调用了mysql这个数据库了

第二步:

show tables;


三:SQL分类

1:SQL的描述

简单来说 ,SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。 SQL 的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。

2:关于SQL的分类:

SQL被分为很多类别:DQL(Data Query Language数据查询语言) , DML(Data Manipulation Language 数据操作语言) , DDL(Data Definition Language 数据定义语言)  , TCL(Tool Command Language 事物控制语言) , DCL(Data Control Language 数据控制语言)

DQL(Data Query Language数据查询语言):

对于表的查询操作 , 其实对应着我们后面需要学到的select语句 , 使用

select * from 表名;

就表示了从数据库中的表中查询所有的相关信息.

DML(Data Manipulation Language 数据操作语言):

对于数据的操作语言 , 其实无非就是"增删改"

增加(insert)

删除(delete)

更改 / 更新(update)

DDL(Data Definition Language 数据定义语言) :

对于数据定义 , 就是对于数据库的数据的结构进行改变 ,

create 创建表

drop 删除表

alter 修改基本表

这些操作的作用是修改表的结构 , 而不是修改表的内部数据的修改 .

TCL(Tool Command Language 事物控制语言):

TCL是一种数据控制语言

例如: 授权(drant), 撤销权限(revoke)


四:数据的导入

1:数据的导入

source 需要导入的数据库在电脑磁盘中的位置

 

此时我们就导入了数据库 

在导入数据库的时候我们会遇到一些问题 , 那就是导入失败 , 下面是我给大家的建议:


五:表的具体操作应用

 1:查看表

show tables; 

我们可以看出

dept(department)是员工的部门表

emp(employee)是员工表

salgrade(Salar grade)工资等级表

我们如何直接去查看表中的数据呢?

select * from 表名;

2:查看表结构

desc 表名;

使用desc这个指令来查看表的结构

其实desc也就是describe的简写 , 我们要是直接使用describe来进行查看表结构也是可以的

 3:查看MySQL的版本号

我们刚才已经知道 , 想要查询 ,这个操作在MySQL中应该是(select)命令 , 所以说下面的指令将会是查看Mysql数据库的版本号的操作指令

select version(); 

4:查看当前的数据库是那个数据库

select database();

5:查看所有的数据库

show databases;

6:Mysql的指令输入要点

对于MySQL的指令其实属于"不见分号(;) , 绝不执行"的操作 , 所以我们每次执行一条指令(一条语句)的时候 , 我们在C / C++ / JAVA中常常都是以分号(;)结尾 , MySQL同样也是

7:终止MySQL的语句执行

当我们想要执行一条语句的时候,  但是此时却觉得不想这行这条语句了 , 想要把这些语句都进行删除 , 那么我们可以有两种方式:

1:直接使用backspace来进行全部删除(这样显得我很呆!!!)

 

 2:直接在语句的后面直接加上\c来结束掉这条语句


六:MySQL的语句使用

1:DQL(数据查询语言)

对于SQL语句来说 , 不区别大小写 , 所以我们要是使用了shoW DataBASEs ;  也是可以直接查询到所有数据库的

1-1查询操作:

select  字段名  from  表名;

查询一个字段:

下述的是查询一个字段的情况 , 也就是在emp这个表中查询job这一个字段

 我们可以看到JOB在表emp中的所有名称  , JOB是emp中的一个字段 , 下面的这些数据也就是表中的一些数据

查询多个字段:

在查询的过程中 , 使用逗号(,)来隔开这些字段 

select 字段1 , 字段2 from 表名; 

 查询所有字段:

 第一种方式:

select * from 表名;

第二种方式:

select 字段1 , 字段2 , 字段3  from 表名;

一旦进入到公司之后 , 我强烈建议大家使用第二种方式,因为有的同学在前期的时候 , 经常使用select * from 表名来查看表中的所有的数据 , 感觉很便捷 , 但是实际上在公司里面的话 , 大家都是公用同一个服务器 , 一个大公司里面的数据库中的数据都是巨大的,  一旦直接select * 就会调用所有的用户的数据,这将是一个庞大的数据量 , 服务器会瞬间吃爆 , 因为你自己的操作一下子把整个服务器的进程都拉到你这边 , 其他同事就会用起来很卡 , 此时你就知道select * 这个操作其实是真的"害人不利己"的事情.

 

2:对列起别名

我们经常对一个表的列(字段)进行查询的时候 , 我们有时候就觉得这个列名有点繁琐 , 我们就可以自己对他的列名起别名 

使用as来进行取别名

select 列名 as 自定义的名称  from 表名;

 如果我们不想使用上面的as来起别名的话 , 我们也可以直接在两个列名的中间加上空格 , 来进行列名的"起别名"

同时我们也记住一点 , 这样的改列名其实只能在我们显示的时候改别名 , 实际上在数据库的内部 , 这个列名是没有被修改的.

我们要是在选择多个列的时候 , 我们还想对多个列分别起别名 , 我们就可以使用下面的两种方式:

第一种方式:

select 列名1 取别名  ,  列名2 取别名  from 表名;

第二种方式:使用单引号(' ') / 双引号( " ")来将需要取别名的列名称(其实也可以叫做"字段名称")

select 原列名1  '修改后的列名1' , 原列名2 '修改后的列名2' from 表名;

使用单引号的好处其实就是 , 如果我们的起别名的名称是有空格的话 , 他就会直接取别名不会受到其他影响 , 但是如果说没有''的话 , 指令就会自动识别修改后列名后面的from , 没有找到from他就不会执行这条语句.

具体如下:

但是当我们使用了单引号 / 双引号之后 , 也就是将列名进行打包之后 , 就会成功 , 因为此时' '内部就会自动识别为一个整体 , 此时指令就会识别这个语句.

tips:所有的字符串建议只使用单引号' ' , 因为这是通用的字符串表达式 , 如果使用双引号("") , 在MySQL语句中能够识别 , 但是在oracle中就会出现语法错误 , 所以建议使用单引号(' ')

3:对列进行运算

如果我们调用员工的薪资表 , 我们只查到了一个月的 , 我们现在需要知道他12个月的薪资到底是多少 , 我们就可以进行对"字段"进行数学运算的操作 , 来实现对于需要的年薪查看的操作.

我们首先看一下月薪是多少:

select sal from emp;

此时我们再对这个列进行数学运算 , 我们可以查询他的年薪是多少 , 也就是对列进行数学运算(sal * 12) 然后再使用as对这个列起别名

 4:对列进行条件查询

使用where来进行条件查询 , 在where后面加上条件就能进行条件查询

select

字段1 , 字段2

from

表名

where

条件

下面是一些条件名:

4.1 等于 =

select 字段1 , 字段2 from 表名 where 等于条件;

4.2 不等于 <>    !=

select 字段1 , 字段2 from 表名 where 不等于条件;

但是不等于条件很特殊

1:  !=

2 <>

4.3 小于<

4.4 小于等于 <=

4.5 大于 >

4.6 大于等于 >=

 4.7 并且 and

对于and我们要注意 , 在and的两边的逻辑表达式的结果必须是同样为真时 ,才为真 , 其实sql中的and符号其实和我们C语言中的&&是比较相像的

select 字段1 , 字段2 from 表名 where 条件1 and 条件2;

 4.8 数值的区间 between and 

使用between and 其实就是对于一组数据查询其中某个区间的操作

select 字段1 , 字段2 from 表名 where 条件 between 左区间 and 右区间;

或者我们就直接使用一些数据逻辑符号来表示区间

 select 字段1 , 字段2 from 表名 where 条件1 and 条件2; 

 4.9 使用is null 来查询空数据

select 字段1 , 字段2 from 表名 where 字段 is null;

这样就能查询出表中的所有的空值

4.10 使用is not null 来查询条件不为null的数据

select 字段1 , 字段2 from 表名 where 条件 is not null; 

4.11 或者条件or

select 字段1 , 字段2 from 条件1 or 条件2;

 这个和C语言中的 ||  是一样的逻辑  ,只要在or的两旁的条件一个为真 , 就可以查找到相应的符合数据

4.12 and 和 or 出现之后的优先级问题

我们可以使用()来将每一个操作进行分隔 , 这样就会从左往右依次执行了

但是你要是非得不开窍 , 我就是想要使用and和or在一起使用 , 我还就不加括号 , 我就有点"脾气"

那也不是不行 , 在sql中其实and的优先级是要高于or的优先级的 , 所以说 , 要是真的不加()的话,  那么这个语句其实就会从左往右依次识别并调用 , 从而先把前面的条件都执行完了之后再执行后面的语句

4.13 包含(in)

select 字段1 , 字段2 from 表名 where 条件 in (属性1 , 属性2);

上述的属性其实就是表中的列 / 字段中的一些数值

其实这个包含就是多个or的结合 , 等效关系

 上下显示的表格是一致的   ,这就说明in确实就是多个or的叠加

4.14 不包含(not in)

select 字段1 , 字段2 from 表名 where 条件 not in (属性1 , 属性2);

 

5.模糊查询(like)

现在我们就来给大家解释上面的like到底是什么意思?

在SQL中我们的查询其实是可以模糊查询的

下划线(_)是一个任意字符 , %也是一个特殊的符号

比如我们想要查询上述的表中名字里面有T的

select 字段1 , 字段2 from 表名 where 字段 like "%T%";

 

此时我们就能查看到这些名称中含有T的名字.

要是想要查看这个字段里面以T开始的 

select 字段1 , 字段2 from 表名 where 字段 like "T%";

T后面的%其实就是代表T后面任意的字符  ,只要你的T是第一个字母 , 后面的都可以查询出来

那要查询以T结尾的呢?

select 字段1 , 字段2 from 表名 where 字段 like "%T";

找出第N个关键词

上述已经讲过下划线(_)就是一个代表字符的符号 ,一个_代表一个字符 , 如果进行模糊查询的时候  , 有几个_就表示代替了几个字符

如果我想要查找第二个字符是D的人 ,那么就应该这样

select ename , sal from emp where ename like "_D%";

_就表示第一个字符,  第一个字符随便 , 只要第二个字符是D就符合条件

那么想要查找第三个字母是O的 ?

select 字段1  , 字段2 from 表名 where 字段 like "__O%";

那我们要是在表中查询一个字段的对象中的名称内部含有_ , 我们该怎么查找呢?

由于下划线(_)是有特殊含义的 , 所以我们想要查找名字中有下划线的 , 我们就要加上转义字符(\_) , 就像是我们C语言使用的时候经常使用的转义字符

6:表排序

对于排序我们经常会想到两种排序 , 一种是降序 , 一种是升序

我家门口种了两棵树 , 一颗是枣树 , 另一颗还是枣树

排序一般在SQL中使用的就是order by

此时他就不是where表达式 , 此时就是另一种表达式

升序表达式(只需要默认调用 "order by"这个指令 SQL就会默认为升序操作)

select 字段1 , 字段2 from 表名 order by 字段1;

此处的order by其实就是默认升序的意思 , 但是实际上其实还可以在字段sal后面加上asc , 就是标准升序的意思 , 因为asc就是升序表达词 

 

降序操作 , 就需要在需要排序的字段的后面加上desc , 记住此时的desc可不是刚开始想要查询表结构的那个desc , 查询表结构的使用的desc的全称是describe , 是描述的意思 , 但是此时降序操作在字段后面加上desc的意思就是降序的意思

select 字段1 , 字段2 from 表名 order by 字段1 desc;

我们要是想要进行两个字段的连续排序(只能默认排序方式一致 , 要升就升 , 要降就降)

要是同时进行比较 , 前面  的字段排序的过程中要是有相同的情况 , 才会执行后面的排序

我们要是想要进行列的位置进行排序 , 也就是只看第几列 , 而不看字段名 的排序 , 我们就可以使用下面的方式来进行排列

select 字段1 ,字段2 from emp order by 某一列的下标 ; 

在开发之中不建议这么写 , 因为这么写 , 对于数据库来说是不健壮的

一旦第二列发生改变 , 改变了字段的时候 , 那么就不能有作用了.


2:数据处理函数

数据处理函数有两种形式:

第一种:单行处理函数 , 顾名思义其实就是对于一行(一条记录)进行的处理函数

 第二种: 多行处理函数

单行处理函数:

单行处理函数有下列这些:

1.lower:

通过使用lower来对字符串进行操作 , 如果说字段的内部属性都是大写的话 , 我们可以把它们转化成小写的

select lower(字段) from 表名;

但是我们要是嫌弃这个列名(字段名)发生了改变变成了lower(ename)感觉不美观 , 我们就可以使用上面我们提到过的as来进行起别名

那么我们同学就会说了 , 那你既然是单行处理函数那为啥是多行处理数据呢?

单行处理函数其实顾名思义 , 就是每一行我们都要进行处理 , 处理10条记录 , 返回10条记录 

但是多行处理函数的意思就是对于多行的数据进行处理 , 但是最后的结果都会是呈现成1行.

2.upper

使用upper函数就能够将单行的小写属性全部都变成大写属性 , 操作同上

select upper(字段1) from 表名;

在使用之前 , 我们先根据上面的操作自己创建一个表 , 内部嵌入这些字段的属性 

 

然后再使用upper单行处理函数来对name进行upper处理

 3:substr

 select substr(字段名 , 起始下标 , 末尾下标) as 字段名 from 表名;

使用substr对字符串进行切割 , 切割的字符串的下标只能是从1开始的

我们如果想要查询员工表中的起始字母为A的员工 , 我们该如何查询呢?

第一种方法:那就是使用上面使用到的like模糊查询

select ename , sal from emp where ename like "A%";

第二种方法就是直接使用substr函数来处理这个

 select 字段名 from 表名 where substr(字段名 , 初始位置 , 末尾位置) = '需要比对的字符';

那么我们如果想让整个字符串的首字母大写的话 , 该如何去做呢?

首先此时我们得想到 , 只仅仅让首字符变成大写 , 那么剩下的是不是都是小写,此时我们只需要将首字符大写其他的字符都小写 , 然后将他们串联在一起 , 此时我们就不得不介绍一个函数就叫做 , concat(字符1 , 字符2)

下面是操作:

 select concat(upper(substr(字段名 , 1 , 1)) , lower(substr(字段名, 2 , length(ename ) - 1))) as 表的别名 from 表; 

上面我相信大家会发现出现了一个length(字段名)的函数 , 不知道这是到底干啥的 , 我来给大家解释一下

4:length

就是取字段的长度的 , 也就是说取的是字段中每一个属性的属性长度 , 下面我们来演示一下

5:trim

就是用来取消字符两边的空白的 , 也就是我给了一个字符串"  bai  " , 是不是中间有空格  ,那么此时我就是想要把这个两边的空格进行删除 , 于是我想到了trim函数

select字段1 , 字段2 from 表名 where 字段名 = trim('       需要比对的字符       ');

此时我们的员工表单内部其实是有ward这个人员的 , 但是我们现在使用正常的等于(=)条件来判断是否有ward这个名字

我们发现 , 此时的ward竟然是没有的 , 但是员工表内部是有ward这个人的呀 , 看来我们' ' 之间的空白太多了 , ,我们应该去除空白 , 于是我们想到了trim函数 , 

 

 6:round

我们通常会遇到对一些数据进行四舍五入 , 于是SQL中就有这样一个函数round来使得将这些数四舍五入

我们此时先自己创建一个数据库

我们可以看出上面的price都是一些浮点型数据

于是此刻我们需要将他们进行四舍五入 , 保留1位小数 , 那我们该怎么做呢?

看操作:

select round(字段名 , 想要保留的位数) as 别名 from 表名;

那么有一个有意思的事情 , 就是如果我们想让它保留-1位小数呢?

我们来试一下:

 看来我们保留 - 1位后的数据 , 其实就是对此时的个位进行四舍五入 

7:rand

rand就是一个生成随机数的函数,  但是只能生成0 - 1之间的小数 , 所以我们要是想要进行0-100之间的数之间取随机数的话 , 那么我们就可以使用到刚才使用到的round函数

select round(rand() * 100 , 0) as 别名 from 表名;

先来生成一个随机数(0-1):

那么我们想要0-100之间的随机数 , 那就必须先得*100 , 此时还是会有小数的出现 , 那么此时round函数就派上用场了

8:ifnull

我们在数据库之间进行数据运算的时候有这样的一个规则,  不管什么数据  ,只要是和null发生运算 , 结果就都为null  ,那么结果都为null了 , 还算个啥, 如果有一个月薪和工作的月份相乘 , 结果月份为NULL , 那工作一年 , 被老板白嫖了?555555555555,看来我就是终极牛马人.

所以我们为了避免出现null这种情况 , 会导致数据运算出现问题 , 于是我们就有了ifnull这个函数的出现,

具体使用方法看操作:

我们先来查看一下整个数据库内emp员工表的数据 , 我们看到comm这个字段内部有很多的null , 那我们尝试将sal和comm乘在一起 , 看下结果

 结果:

 那么我们使用ifnull来拯救一下他们吧!  , 好像拯救之后 , 他们的工资只是从冰冷的NULL变成了浮点型数据

 要是实际业务有需求的话 ,我们可以尝试将null的数值改成你自己业务逻辑需要的数值

9: case ..when .. then ... when .. then .... else .. end

上述的语句其实就是为了我门以后对于一些数据的筛选更新做基础

就像前段时间 京东对高管降薪 10% - 20%的时候 , 那么此时就要针对性调薪了

假设我们继续使用上面的表:

select case 字段1 when 字段1属性 then 字段1操作 when 字段1属性 then 字段1操作 else 字段1  as 字段别名 end from  表名;  

多行处理函数(分组函数):

对于多行处理函数 , 我们已经在上文讲述过了 , 本质上来讲的话 , 就是输入多行 , 输出一行.

既然叫做"分组函数" , 那么肯定就得有分组 , 才能进行处理 , 要是没有分组的话 , 那么就等于只有一组 , 处理数据就没了意义

下面是一些多行处理函数:

我们先来查看一下这个表中所有的数据 , 下面将会用到:

count:

计算记录的数目(记录字段内的属性的数量):

select count(字段) as 别名 from 表名; 

sum:

 select sum(字段名) from 表名;

avg:

 select round(avg(字段名) , 保留位数 )  as 别名 from 表名; 

max:

max就是用来计算分组中多行的最大值 , 我们来尝试一下:

select max(字段名) as 别名 from 表名; 

min:

min就是用来计算分组中的最小值 , 我们可以直接对多行进行求值 ,最终得到一个最小值.

select min(字段名) from 表名;

对于上述的多行处理函数 , 我们应该注意到几点 ,

1:count会自动忽略NULL

2:sum会自动忽略NULL

3:avg也是会同样进行NULL忽略

我们来验证一下

先寻找到所有的数据 , 看那个字段有NULL

我们现在对COMM进行count和sum的操作:

select count(字段) as 别名 from 表名;

大家会发现我经常会使用as这个操作符 , 因为我喜欢美观一点的字段名

我们再去回头看看 , 其实会发现在多行处理函数count和sum和avg中 , 其实真的会自动忽略NULL的属性值.

我们再来看一看 , count(*)和count(字段)的不同区别 , 其实count(*)会将所有的记录(字段属性)全部都计算一遍 , 而count(字段)只会将非NULL的属性记录下来,就像是上面的comm的例子

 

那么有的同学就会问了 , 那我一个表的一条记录不会都是NULL吗 , 是的 , 表中的任何一条记录的字段属性都不会是NULL , 如果记录的所有属性都是NULL的话 , 那么这条记录就会失效. 所以我们使用count(*)的时候 , 就是在统计这个数据库中的这个表的所有记录数(行数).

其实对于SQL我们也能够将多个多行分组函数一起使用并且起别名 , 此时我们尝试一下:

分组查询:

对于我们的实际需求 , 我们经常需要对多个字段都进行查询 , 此时急剧需要分组 , 对这些数据进行查询,

此时就用到了 "分组查询"

对于我们分组其实是有一个规则顺序的:

1:from

2:where

3:group by

4:select

5:order by

我在给大家一个例子 , 我们想要查询一个sal > min(sal)(想要查询多个数据 , 这些数据要求大于最小的sal) , 我们如果没有学习上面的规则时 , 大家就会写这样的语句:

 怎么会出现这种问题呢?

我们再回头去看看这个规则 , 我们应该先from , 再 where , 再group by , 再select ,再order by , 

于是我们发现上述的问题了 , 我们应该先从数据表中先从数据表取出数据 , 再对数据进行where条件限制 ,  再进行分组 , 然后在选择相应的字段 , 然后再排序 , 

你没有发现 , 上面的这条记录

那我们又想到为什么下述这个就可以查询到呢?

这个多行查询函数min确实在


后续我会持续更新关于SQL的知识点 , 请大家关注我的账号 , 为大家带来最优质的内容是我的初心!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值