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…

十、查询语句
  1. 简单查询
    查询一个字段:select 字段名 from 表名;
    给查询的列起别名:select 字段一, 字段二, 字段三 as 别名 from 表名;
    使用as关键字起别名,只是将显示的查询结果显示为别名。原表列名还是叫原来的名字。
    as关键字是可以省略的。
    注意:在所有的数据库当中,字符串统一使用单引号括起来,单引号是标准,双引号在oracle数据库中国用不了。但是在mysql中可以使用。
  2. 条件查询
    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’结尾。
  3. 排序
    查询出的结果默认是升序排列的。
    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;