MySQL学习笔记
一、什么是数据库? 什么是数据库管理系统? 什么是SQL? 他们之间的关系是什么?
数据库:DataBase,简称DB。按照一定格式去存储数据的一些文件的组合。
顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。
数据库管理系统:DataBaseManagement,简称DBMS。
数据库管理系统是专门用来管理数据库中的数据的,数据库管理系统可以对数据库中的数据进行增删改查。
常见的数据库管理系统:MySQL,Oracle,MS,SqlServer,DB2,sybase等
SQL:结构化查询语言。
程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查。
SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在MySQL中可以使用,同时在其他的数据库中也是可以使用的。
三者之间的关系:DBMS==>执行==>SQL==>操作==>DB
二、MySQL安装,此处省略
三、MySQL完全卸载
第一步:双击安装包进行卸载删除。
第二步:删除目录
把C:\ProgramData下面的MySQL目录删除
把C:\Program Files (x86)下面的MySQL目录删除
这样卸载就结束了。
四、查看MySQL服务
在计算机中打开服务,找到MySQL服务。
MySQL的服务,默认是“启动”的状态,只有启动了mysql才能够使用。
默认情况下“自动”启动,自动启动表示下一次重启操作系统的时候自动启动该服务。
五、在windows操作系统中,使用命令来启动和关闭mysql服务
net stop 服务名称;
net start 服务名称;
其他服务的启停都可以采用以上的命令。
六、使用客户端登录mysql数据库
使用bin目录下的mysql.exe命令来连接mysql数据库服务器。
本地登录:mysql -u root -p 密码
七、MySQL常用命令
登录命令:mysql -u root -p 密码
退出命令:exit
查看mysql中有哪些数据库:show databases;
选择使用某个数据库:use 数据库名;
创建数据库:create database 数据库名;
查询表中的内容:select * from 表名;
查看表结构:desc 表名;
删除表:drop table 表名;
查看数据库版本:select version();
查看当前使用的数据库:select database();
终止命令的输入:\c
八、数据库当中最基本的单元是表:table
什么是表?为什么用表来存储数据呢?
数据库当中是以表格的形式表示数据的。
因为表比较直观。
任何一张表都有行和列:
行(row):被称为数据/记录。
列(column):被称为字段。
了解一下:
每个字段都有:字段名、数据类型、约束等属性。
字段名可以理解,是一个普通的名字,见名知意就行。
数据类型:字符串,数字,日期等。
约束:约束也有很多,其中有一个叫做唯一性的约束,这种约束约束添加之后,该字段中的数据不能重复。
九、关于SQL语句的分类
SQL语句有很多,最好进行分门别类,这样更容易记忆。
分为:
DQL:数据查询语言(凡是带有select关键字的都是查询语句)
DML:数据操作语言(凡是对表当中的数据进行增删改的都是DML)
insert delete update
DDL:数据定义语言(凡是带有create、drop、alter的都是DDL)
DDL主要操作的是表的结构。不是表中的数据。
TCL:事务控制语言
包括:
事务提交:commit
事务回滚:rollback
DCL:数据库控制语言
例如:授权grant、撤销权限revoke…
十、查询语句
- 简单查询
查询一个字段:select 字段名 from 表名;
给查询的列起别名:select 字段一, 字段二, 字段三 as 别名 from 表名;
使用as关键字起别名,只是将显示的查询结果显示为别名。原表列名还是叫原来的名字。
as关键字是可以省略的。
注意:在所有的数据库当中,字符串统一使用单引号括起来,单引号是标准,双引号在oracle数据库中国用不了。但是在mysql中可以使用。 - 条件查询
1)什么是条件查询?
不是将表中所有数据都查询出来,而是查询表中符合条件的。
语法格式:
select 字段名 from 表名 where 条件;
2)常见的查询条件
= 等于
例如:select emp, ename from emp where sal = 8000;
<>或!= 不等于
例如:select emp, ename from emp where sal != 8000;
select emp, ename from where sal <> 8000;
< 小于 > 大于
<= 小于等于 >= 大于等于
between … and … 两个值之间,等同于 >= and <=
包括两个临界值
注意:使用between and的时候必须要保证两边的值是左小右大。
is (not) null 为 null?
select * from where sal is null;
注意:这个地方使用“=”是不行的,因为数据库中的null代表什么都没有,它不是一个值,所以不能使用等号来衡量。
and 并且 or 或者
and 和 or 同时出现的时候有优先级,and 的优先级比 or 高,当两个在一起的时候,会先执行 and 的条件。这个时候应该加括号来控制优先级。
in 包含,相当于多个or (not in 不在这个范围内)
例如:select * from emp where job = ‘MANAGER’ or job = ‘SALESMAN’;
等价于:select * from emp where job in (‘MANAGER’, ‘SALESMAN’);
注意:in 不是一个区间。in 后面是一个具体的值。
like表示模糊查询
支持 % 或者 下划线 匹配
% 匹配任意多个字符,下划线,一个下划线只匹配一个字符。
例如:select ename from emp where ename like ‘%o%’; 查找名字中含有‘o’的名字。
select ename from emp where like ‘%T’; 查找名字中以‘T’结尾。 - 排序
查询出的结果默认是升序排列的。
select ename, sal from emp order by sal;
指定降序:
select ename, sal from emp order by sal desc;
指定升序:
select ename, sal from emp order by sal asc;
十一、数据处理函数
数据处理函数又被称为单行处理函数
单行处理函数的特点:一个输入对应一个输出。
相对的是多行处理函数:多个输入对应一个输出。
常见的单行处理函数:
lower 转换小写
upper 转换大写
substr 取子串(substr(被截取的字符串,起始下标,截取的长度))
length 取长度
concat 进行字符串的拼接
trim 去除传过来的数据的前后空格(空白)
str_to_data 将字符串转化为日期
date_format 格式化日期
format 设置千分位
round 四舍五入
rand() 生成随机数
ifnull 可以将null转换成一个具体值
在数据库中,只要有NULL参与的数学运算,最终结果就是NULL。
十二、分组函数(多行处理函数)
常用的多行处理函数:
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注意:在没有分组的时候必须先进行分组,然后才能用。如果没有对数据进行分组的话,整张表会默认为一组。
分组函数在使用的时候的注意事项。
第一点:分组函数会自动忽略NULL,不需要对NULL进行处理。
第二点:分组函数中,count()和count(某个字段)区别
count(某个字段):表示统计该字段下所有不为NULL的元素的总数
count():统计表当中的总行数
因为每一行记录不可能都为NULL。一行数据中有一列不为NULL,则这行数据就是有效的。
第三点:分组函数不能直接使用在where子句中。
例如:select ename, sal from emp where sal > min(sal);
第四点:所有的分组函数可以组合起来使用。
select min(sal), max(sal), avg(sal) from emp;
十三、分组查询
什么是分组查询?
在实际的应用中,可能会有这样的需求,需要先进行分组,然后对每一组的数据进行操作,这个时候我们需要使用分组查询。
select … from … group by …
以上关键字执行的顺序是一定的,不能够颠倒:
1.from
2.where
3.group by
4.select
5.order by
为什么分组函数不能直接在where后面使用?
因为分组函数在使用的时候必须要先分组,而where执行的时候,还没有分组,所以where后面不能出现分组函数。
小案例:
1.按照工作岗位分组,然后对工资求和。
select job, sum(sal) from emp group by job;
注意:在一条select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数。其他的一律不能跟。
2.找出“每个部门,不同工作岗位”的最高薪资。
select deptno, job, max(sal) from emp group by deptno, job;
3.找出每个部门最高薪资,要求显示最高薪资大于3000的。
补充:使用having可以对分完组之后的数据进一步过滤。但是having不能够单独使用,不能代替where,having必须和group by联合使用。
第一步:查出每个部门中最高工资
select deptno, max(sal) from emp group by deptno;
第二步:要求显示最高薪资大于3000
select deptno, max(sal) from emp group by deptno having max(sal) > 3000;(先分组再筛选)
问题来了,以上的SQL语句执行效率是不是低?
比较低,实际上可以这样考虑:先将大于3000的都找出来,然后分组。
select deptno, max(sal) from emp where sal > 3000 group by deptno;(先筛选再分组)
优化策略:where和having,优先选择where, where实在完成不了了,再选择having。
十四、去除重复记录
把查询结果去重,只是查询结果去重,原表的数据不会被修改。
去重需要使用一个关键字:distinct
案例:
select distinct job from emp;
这样的写法是错误的。
distinct只能出现在所有字段的最前方。
select distinct job, deptno from emp;
这样写是是对的,但是去重的依据是联合job和deptno这两个字段来去重的。
统计工作岗位的数量:
select count(distinct job) from emp;
大总结(单表查询)
select … from … where … group by … having … order by …
以上关键字只能按照这个顺序来,不能够颠倒。
排序顺序?
1.from
2.where
3.group by
4.having
5.select
6.order by
从某张表中查询数据。
先经过where条件筛选出有价值的数据。
对这些有价值的数据进行分组。
分组之后可以使用having继续筛选。
select查询出来。
最后排序输出。综合案例:
找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除了MANAHER岗位外,要求按照平均薪资降序排列输出。
select
job, avg(sal) as avgsal
from
emp
where
job <> ‘MANAGER’
group by
job
having
avg(sal) > 1500
order by
avgsal desc;