MySQL
概念:一种关联数据库,可以存储并且操作应用程序中的所有数据
DB(Database):数据库软件
DBMS( Database Management System ):数据库操作系统
SQL( Structured Query Language ):结构化查询语言,数据库的操作语言,包含一套标准的SQL,可以用于操作所有数据库。每个数据库都有自己的方言,只能在自己数据库使用,不能在别的数据库使用
DBA:数据库管理员,专门操作数据库软件的人员
学习方式:会用就行,不需要理解原理
版本:5.5 8.4等
端口号:3306
-u 用户名 -p 密码
基本命令
mysql软件有4个自带的数据库,不能动,库里面存的是一张张的表
表里面存的就是数据
数据查询语言:select
数据操纵语言:insert,delete,update
数据定义语言:create,drop,alter
事务控制语言:commit,rollback
数据控制语言:grant,revoke
特殊字段empno(组件),不能重复,不能为空
库操作:
show databases; 查看所有的库
create database 库名; 创建一个库
drop database 库名; 删除一个库
use 库名; 使用(选中)一个库
show tables; 查看所有的表
表操作:
操作之前要选中一个数据库
字段:每一列
记录:每一行
导入外部的sql文件:source+文件路径select*from 表名; 查询表
一、简单查询
select 字段名称 from 表名 控制的是字段数
(1)查询单个字段 select ename(字段名称) from emp(表名);
(2)查询多个字段 select ename,sal(用逗号隔开字段) from emp;
(3)所有字段 select*from emp;也可以把所有字段都写出来
(4)为字段添加别名 as 关键字 可以省略select ename(字段名) as '姓名' from emp;select ename '姓名' from emp;
二、条件查询
where关键字 位置在from之后
select*from emp where ename='SMITH'; =表示相等不是赋值
!=或<> 表示不等
区间表示:between...and... between之后的数值小于等于and之后的数值 必须做小右大
is null 某个字段的数值为null值
is not null 某个字段的数值不为null值
and 并且,等于&& 满足所有条件
select * from emp where deptno=30 and sal>2000;
or 或者,等于|| 满足一个条件
连接符存在and和or一起使用,需要添加()
in 用于条件中的一些常量的比较,可以被多个or替换
select * from emp where sal in(800,1000,1500,2000) 类似swtch
not in 多个and替换
like 模糊查询(关键字查询),条件中匹配一部分内容即可,不可是常量
例如,搜索姓张的人
_ 表示一个位置上的任意内容
% 表示任意位置上的任意内容
select*from emp where ename like 'A%';
包含查询:%A%
三、排序查询
关键字:order by 位置暂时是在where之后
升序排序:默认排序 关键字是asc,可以省略
降序排序:关键字是desc,不能省略
select*from emp where sal>2000 order by sal asc;
如果两个字段值相同,就引入下一个排序,语法:
select*from emp where sal>2000 order by sal asc,ename asc;用逗号隔开
四、聚合函数/多行处理函数
sum()求和 avg()平均数 max()最大值 min()最下值 count()计数
位置:关键字select 之后 关键字heving之后
语法:
select sum(sal) from emp; //计算字段sal的和,一般不会在使用聚合函数的时候加别的字段
count() 用来统计一张表的记录大小,不计数字段值为null的字段;
语法:select count(*) from emp; //执行效率低
或者 select count(empno) from emp;
聚合函数可以一起使用,语法:
select sum(sal) '和',avg(sal) '平均数',max(sal) '最大值',min(sal) '最小值',count(empno) '个数' from emp;
五、单行处理函数
可以出现在sql中的任意位置,但是尽量少使用,执行效率会降低
lower() 转换小写 upper()准换大写 参数是字段
substr() 取子串(输入3个参数,一个字段,一个起始下标,一个截取长度)
mysql中的索引值是从1开始的
length() 字段的长度 参数是字段,字段下面每个值都可能不一样
trim() 去空格 输入字段
str_to_date 将字符串转换成日期 data_formt 格式化日期
mysql中的时间类型,字符串类型,整数类型,浮点数类型都可以自动转换
format() 设置千分位,每三位加一个逗号,参数(字段,保留的小数数位)
round() 四舍五入,参数(字段,保留的小数位)
round(字段,0)保留整数,round(字段,-1)保留小数点前1位
rand() 生成随机数不加参数 在0到1之间 参数随机数种子rand(10)是固定的
ifnull 将一个null转换成一个具体的值,例子:统计工资,有些人员的工资为null值,需要转换为0才能统计
语法:select sal,ifnull(字段,0) from emp;
六、分组查询
关键字:group by 位置是在where之后,order by之前
原则上可以使用任何的字段进行分组
select ename,sal,deptno from emp group by deptno
注意:分组了每个组只能显示一个,也可以显示函数处理之后的数值
例如求每个组的和:
selec sum(工资),deptno from emp group by deptno;
七、having语句
必须跟随在group by之后,没有分组不能出现having语句
功能:having语句是对分组后的小组数据进行条件处理的,在where关键之后的14个条件可以直接出现在having语句,包括聚合函数
例子:以部门编号分组,排除小组中最高工资低于3千的小组
select deptno,max(sal) from emp group by deptno having max(sal)>=3000; //根据deptno字段分组,显示大于3千的分组
一般也不推荐用,执行效率低
使用where也能都代替having语句,当where语句不能完成的就用having
什么情况下考虑使用where替换 having?
当条件使用的是表中的直接数据时,可以使用where
当条件使用的是经过分组后的数据,或者聚合函数处理过的数据,只能使用having
where是针对整个表的整个字段的数据,having是对分组后的字段进行的
面试题
where和having有什么区别
都是对条件的筛选
1.where语句是对表中的数据进行条件筛选,having是对分组后的小组数据进行条件筛选的
2.where之后是不能有聚合函数的,having可以有
3.where是在分组之前执行,having是在分组之后执行
单表查询关键字顺序
select from where group by having odder by
select之后可以写(目前):字段名,*,单行处理函数(任何位置),聚合函数
from之后只能写表名
where之后可以写各种条件 and,or ,小括号连接
group by 分组字段名
having 各种条件,聚合函数
order by 排序字段名,升序asc或者desc 聚合函数分组之后只能用分组的表的字段来排序
关键字执行顺序
执行from 找到表,执行where 排除数据,再执行group by分组 ,分完组执行having排除组内的顺序,执行select 找出数据,最后order by 排序