Mysql数据库(二)

启停mysql

net start 服务名称
net stop 服务名称

mysql的常用命令

导入数据库三连

#创建“bjpowernode”数据库
create database bjpowernode;
#选择数据库
use bjpowernode;
#导入数据
source F:\Typora笔记\bjpowernode.sql

查询数据库的命令

#查看mysql数据库的版本号
select version();

#查看mysql中有哪些数据库
show databases;

#查看当前使用的是哪个数据库
select database();

#查看数据库中的表
show tables;

#不看表中数据,只看表的结构
desc ${表名};
describe ${表名};

下面的sql语句以bjpowernode数据库为例
链接:https://pan.baidu.com/s/1EM9PqhJojfzv_VZohnbaLw
提取码:yyds
该数据库有三张表:

dept 部门表
emp 员工表
salgrade 薪资等级表

在这里插入图片描述
部门表
在这里插入图片描述

查询

select 后面可以跟某个表的字段名(可以等同看作变量名),也可以跟字面量/字面值(即数据)。

#查询所有字段
select a,b,c,e... from tablename; 

#给查询的列起别名 as或者空格
select 21000 as num from dept;
select deptno, dname as deptname from dept;
select deptno, dname deptname from dept;
#别名中有空格(使用英文单引号将别名括起来。标准用法----在所有数据库中,字符串统一使用单引号)
select dname 'dept name' from dept;

#字段可以使用数学表达式
select ename,sal*12 from emp;
select ename,sal*12 as yearsal from emp; #起别名
select ename,sal*12 as '年薪' from emp; #(如果别名是中文,要用单引号括起来,否则报错)

去除重复记录

关键字:distinct
注意:
1、把查询结果去除重复记录,原表数据不会被修改,只是查询结果去重;
2、distinct只能出现在所有字段的最前方,表示所有字段联合起来去除重复记录;

#查询所有工作岗位(去除重复的)?
select distinct job from emp;
select distinct job,deptno from emp;
#统计工作岗位的数量?
select count(distinct job) from emp;

条件查询

不是将表中数据都查出来,而是查询出来符合条件的

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

#等于 =   查询薪资等于800的员工姓名和编号
select empno,ename from emp where sal = 800;
#不等于 <> 或者!=    查询薪资等于800的员工姓名和编号
select empno,ename from emp where sal != 800;
select empno,ename from emp where sal <> 800; //小于号和大于号组成的不等号
#小于 <,小于等于<=,大于 >,大于等于>=
select empno,ename,sal from emp where sal < 3000;
select empno,ename,sal from emp where sal <= 3000;
select empno,ename,sal from emp where sal > 3000;
select empno,ename,sal from emp where sal >= 3000;
#查询SMITH的编号和薪资
select empno,ename,sal from emp where ename = 'SMITH'; //字符串使用单引号

#is null 为 null (is not null 不为空)
#数据库中的null代表什么都没有,不是一个值,不能用等号衡量;
# null 不等于 0;
#查询哪些员工的津贴为null;不能使用 comm = null,只能使用 is null;
select empno,ename,sal from emp where comm is null;
select empno,ename,sal from emp where comm is not null;

#and 查询工作岗位是MANAGER并且薪资大于2500的员工信息
select empno,job,sal from emp where job = 'MANAGER' and sal > 2500;
#或者 or 
#查询工作岗位是MANAGER或者SALESMAN的员工信息
select empno,job,ename from emp where job = 'MANAGER' or job = 'SALESMAN';

#and 和 or 如果同时出现--->and 优先级比 or 高
#查询工资大于2500并且部门编号是10,或者部门编号是20的群体员工
select * from emp where sal > 2500 and deptno = 10 or deptno = 20;
#查询工资大于2500,并且部门编号是10或者20部门的员工
select * from emp where sal > 2500 and (deptno = 10 or deptno = 20);


#包含 in,相当于多个or ( not in 不在这个范围内) 
#in 不是一个区间,in跟的是具体的值
#查询工作岗位是MANAGER或者SALESMAN的员工信息
select empno,job,ename from emp where job = 'MANAGER' or job = 'SALESMAN';
select empno,job,ename from emp where job in('MANAGER', 'SALESMAN');
#找出薪资是800,3000或者5000的员工
select empno,job,ename from emp where sal not in(800, 3000, 5000);

#like 模糊查询 支持%或者下划线匹配
# %匹配任意个字符,
#一个下划线只能匹配一个字符
#找出名字里含有o的
select ename from emp where ename like '%o%';
#找出名字以T结尾的
select ename from emp where ename like '%T';
#找出名字以T开始的
select ename from emp where ename like 'T%';
#找出第二个字母是A的
select ename from emp where ename like '_A%';
#找出第三个字母是R的(双下划线)
select ename from emp where ename like '__R%';
#找出名字中含有下划线“_”的(要使用转义字符“\”)
select ename from emp where ename like '%\_%'

select 字段1,字段2…from 表名 where 字段名 between value1 and value2;

注意:
1、使用between … and … 时,必须遵循左小右大;
2、between … and … 包含两端的值。

# between ... and ... 等同于 >= and <=
#查询薪资在2450和3000之间的员工信息?包括2450和3000
select empno,ename,sal from emp where sal >= 2450 and sal <= 3000;
select empno, ename,sal from emp where sal between 2450 and 3000;

排序

1、默认是升序

#查询所有员工薪资,排序---->>默认是升序
select ename, sal from emp order by sal;
#指定降序 desc
select ename, sal from emp order by sal desc;
#指定升序 asc
select ename, sal from emp order by sal asc;

#按照多个字段排序
#查询员工名字和薪资,要求按照薪资升序;如果薪资一样则按照名字升序排列
select ename,sal from emp order by sal asc, ename asc; //sal在前,起主导,只有sal相等时,才会考虑用ename排序

#根据字段的位置排序
#按照查询结果的第二列排序-->>不建议这样用,不健壮
select ename, sal from emp order by 2;

综合案例

关键字顺序
select … from … where … order by …;
内部执行顺序
1、from 2、where 3、select 4、order by

#找出工资在1250到3000之间员工的信息,要求按照薪资降序排列。
select ename,sal from emp where sal between 1250 and 3000 order by sal desc;

处理函数

数据处理函数
1、数据处理函数又被成为单行处理函数,特点是一个输入对应一个输出。
2、和单行处理函数相对的是 多行处理函数。多行处理函数的特点,一个输入对应多个输出。

单行处理函数
concat 进行字符串拼接
在这里插入图片描述
在这里插入图片描述

#lower小写 upper大写
select lower(ename) as ename from emp;
#substr取子串
select ename from emp where substr(ename,1,1)='A';
#concat字符串拼接
select concat(empno,ename) from emp; 
#length取长度
select length(ename) enamelength from emp;
#trim 去除前后空格
select * from emp where ename = trim(' KING');
#round 四舍五入 
select round(1236.567, 0) as result from emp;//保留整数
select round(1236.567, 1) as result from emp;//保留一个小数
select round(1236.567, 2) as result from emp;//保留两个小数

select round(1236.567, -1) as result from emp;//保留到十位
select round(1236.567, -2) as result from emp;//保留到百位
#rand() 生成随机数
select rand() from emp;
select round(rand()*100, 0) from emp;//100以内的随机数


#str_to_date 将字符串转换成日期
#data_format 格式化日期
#format 设置千分位

在所有数据库中,只要有NULL参与的数学运算,结果就是NULL;
ifnull 可以将null转换成一个具体值;
ifnull函数用法:ifnull(数据,被当做哪个值) —>如果数据为NULL时,把这个数据结构当做哪个值

#在所有数据库中,只要有NULL参与的数学运算,结果就是NULL;
select ename, sal + comm as salcomm from emp;
#计算年薪
select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;

case…when…then…when…then…else…end

#当员工的工作岗位是MANAGER时,工资上调10%,当工作岗位是SALESMAN时,工资上调50%
select ename, job, sal from emp;
select 
	ename,
	job, 
	sal as oldsal, 
	(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal 
from 
	emp;

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

1、多行处理函数的特点:输入多行,最终输出一行。
2、一共5个:count 计数 ; sum求和 ;avg 平均值 ; max 最大值 ;min 最小值
3、分组函数在使用的时候必须先进行分组,然后才能用;如果没有对数据进行分组,整张表默认为一组;
4、分组函数会自动忽略NULL,不需要我们提前处理
5、count(具体字段):表示统计该字段下所有部位NULL的元素总和;
6、count(*):统计表当中的总行数。(只要有一行数据count则++)
7、分组函数不能直接使用在where字句中

#找出最高工资
select max(sal) from emp;
#找出最低工资
select min(sal) from emp;
#计算平均工资
select avg(sal) from emp;

分组查询(group by)

select … from … group by 字段1,字段2…
…group by 后面可以跟多个字段
计算每个部门的工资和?
计算每个工作岗位的平均薪资?
找出每个工作岗位的最高薪资?

很重要在这里插入图片描述
重点结论:在一条select语句中,如果有group by语句的话,select后面只能跟 参加分组的字段,以及分组函数。其他的一律不能跟

#找出每个工作岗位的工资和
#执行顺序:先从emp表中查询数据-->根据job字段进行分组-->对每一组的数据进行sum(sal)
select ename, lower(job), sum(sal) from emp group by job;
#找出每个部门的最高薪资
select deptno, max(sal) from emp group by deptno;
#联合分组
#找出每个部门不同工作岗位的最高薪资
select deptno, job, max(sal) from emp group by deptno, job;

#having可以对分完组之后的数据进一步过滤,只能和group by一起使用
#找出每个部门最高薪资,要求显示最高薪资大于3000的
select deptno,max(sal) from emp group by deptno having max(sal) > 3000;  //效率低
select deptno,max(sal) from emp where sal > 3000 group by deptno; //先找出大于3000的,然后再分组

#优化策略:where和having,优先选择where,where实在完成不了,再使用having
#找出每个部门平均薪资,要求显示**平均薪资**高于2500的--->无法用where实现
select deptno, avg(sal) from emp group by deptno having avg(sal) > 2500;

单表查询总结

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的,除MANAGER岗位之外,要求按照平均薪资降序排列
select job, avg(sal) as avgsal from emp where job != 'MANAGER' group by job having avg(sal) > 1500 order by avgsal asc;

版权声明:本文为qq_42052229原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。