赞
踩
一:MySQL 基础指令学习
1:MySQL的登录
对于MySQL的登录 , 我们可以在电脑上win + r来打开cmd窗口 , 使用"mysql -u root -p" , 来进行MySQL服务的启动
2:数据库的退出:
我们在cmd窗口内部输入"exit" , 就可以直接退出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的知识点 , 请大家关注我的账号 , 为大家带来最优质的内容是我的初心!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。