数据库笔记day02

一、基本函数

1.工具的使用

  1. 找到.exe程序,双击,输入了密码,点击连接,就可以了
  2. 创建库: 右键-新建数据库-设置数据库名-选字符集utf8-确定
  3. 创建表: 右键-创建表-输入字段名字段类型字段长度字段约束-创建表-输入表名-确定
  4. 添加表里的记录,如下图
    在这里插入图片描述

2.准备数据

CREATE TABLE dept(
deptno int primary key auto_increment ,
dname VARCHAR(20),
loc VARCHAR(13)
);
INSERT INTO dept VALUES(null,'accounting','一区');
INSERT INTO dept VALUES(null,'research','二区');
INSERT INTO dept VALUES(null,'operations','二区');
CREATE TABLE emp(
empno int primary key auto_increment,
ename VARCHAR(10),
job VARCHAR(10),
mgr int,
hiredate DATE,
sal double,
comm NUMERIC(7,2),
deptno int
);
INSERT INTO emp VALUES(100,'jack','副总',NULL,'2002-05-1',90000,NULL,1);
INSERT INTO emp VALUES(200,'tony','总监',100,'2015-02-02',10000,2000,2);
INSERT INTO emp VALUES(300,'hana','经理',200,'2017-02-02',8000,1000,2);
INSERT INTO emp VALUES(400,'leo','员工',300,'2019-02-22',3000,200.12,2);
INSERT INTO emp VALUES(500,'liu','员工',300,'2019-03-19',3500,200.58,2);

3.基础函数的使用

#查询员工表的所有数据
#SELECT 列名1,列名2 FROM 表名
SELECT * from emp; #查询所有列
SELECT ename from emp; #查名字
SELECT empno,ename FROM emp;#查编号和名字
SELECT empno a FROM emp; #给列设置别名
  1. Lower——全转小写
SELECT ename,LOWER(ename) from emp
  1. Upper——全转大写
SELECT ename,UPPER(ename) from emp
  1. Length——求长度
#length求长度,根据u8,一个字母或数字长度为1,一个汉字长度为3
SELECT ename,LENGTH(ename) from emp; #查ename的长度
SELECT job,LENGTH(job) from emp; #查job的长度
  1. Substr——截取子串
#substr截取子串
#SUBSTR(a,b,c)-a是截取谁 b是从哪个字符开始 c是截取的长度
SELECT ename,SUBSTR(ename,2,2) from emp;
  1. concat——拼接字符串
#concat(a,b,...)拼串 -a是列名 b是要拼接的数据
#...是指还可以多个参数
SELECT ename,CONCAT(ename,"Hello",12) from emp;
  1. replace—— 替换
#replace(a,b,c) 替换 -a是字段名 把b换成c
SELECT ename,REPLACE(ename,'a','666') from emp;
  1. ifnull
#ifnull(a,b) -a是字段名,b是要换成的值
SELECT comm,IFNULL(comm,100) FROM emp; #如果是null就换成100

#查询每个员工的月薪
SELECT sal,comm,sal+IFNULL(comm,0) from emp;
  1. 对小数的运算
  • round 四舍五入
#round  四舍五入
SELECT comm,ROUND(comm) from emp; #取整
SELECT comm,ROUND(comm,1) from emp; #保留1位小数
  • ceil向上取整
#ceil向上取整
SELECT comm,CEIL(comm) from emp;
  • floor向下取整
#floor向下取整
SELECT comm,FLOOR(comm) from emp;
  1. 对日期的函数
#对日期数据的函数
#now & year & month & day 
SELECT NOW()  #当前时间
SELECT YEAR('1999-1-1')
SELECT YEAR(NOW())  #当前年
SELECT MONTH(NOW()),DAY(NOW()) #当前月,当前日
#hour时 minute分 second秒
SELECT HOUR(NOW()),minute(NOW()),second(NOW())
  1. 生成一个32位的随机数
#生成一个32位的随机数
SELECT UUID()
  1. 转义字符
#\表示转义字符,把'当做普通的字符在使用而不是字符串的标记
SELECT 'xi\'an';

二、条件查询

1.distinct——去重

使用distinct关键字,去除重复的记录行

#1.去重distinct
#SELECT loc from dept;#查询部门地址
SELECT DISTINCT loc from dept;#查询部门地址

2.where

注意:where中不能使用列别名!!

#2.where连接查询的条件 
#SELECT 字段名 FROM 表名 WHERE 字段名=字段值
#练习1:查询编号为1的部门信息
SELECT * from dept WHERE deptno=1;
#练习2:查询编号>1的部门信息
SELECT * from dept WHERE deptno>1;
SELECT * from dept WHERE deptno<1;
SELECT * from dept WHERE deptno!=1;
SELECT * from dept WHERE deptno<>1; #表示!=,同上
#练习3:查询名称是research的部门编号
SELECT deptno FROM dept WHERE dname='research'
#练习4:查询地址在二区编号为3的部门名称
SELECT dname from dept WHERE loc='二区' AND deptno=3
# loc='二区' AND deptno=3 并且关系
# loc='二区' OR deptno=3 或者关系
#练习5:查询部门名称是accounting/research的部门地址
SELECT loc FROM dept WHERE 
#dname='accounting' OR dname='research' #或者关系
dname in('accounting','research') #in子句in(a,b),同上
#练习6:查询编号是1 2 3的部门信息
SELECT * FROM dept WHERE deptno in(1,2,3)

3.like

通配符%代表0到n个字符,通配符下划线_代表1个字符

#3.like——模糊查询,配合%,%通配符0~n个字符,_通配符1个字符
select * from emp where ename like 'l%' --以l开头的
select * from emp where ename like '%a' --以a结束的
select * from emp where ename like '%a%' --中间包含a的
select * from emp where ename like 'l__' --l后面有两个字符的 _代表一个字符位置
select * from emp where ename like 'a_' #a后只有一个,了解

4.null

#4.NULL
#练习1:查询没有奖金的员工信息
SELECT * FROM emp WHERE comm IS NULL  
#练习2:查询有奖金的员工信息
SELECT * FROM emp WHERE comm IS NOTNULL 

5.between … and …

#5.between and 
#练习1:查询工资5000~10000的员工信息
SELECT * from emp WHERE sal BETWEEN 5000 AND 10000; #[5000,10000]
#练习2:查询2019年入职的员工姓名
SELECT ename FROM emp WHERE 
#hiredate BETWEEN '2019-1-1' AND '2019-12-31';
YEAR(hiredate)=2019

6.limit ——分页

#6.limit 分页
#练习1:展示前两页员工数据
SELECT * from emp LIMIT 2; #只取前n条
SELECT * from emp LIMIT 1,3; #从0+1的数据开始,总共展示3条
#练习2:查询岗位是员工的第一条记录
SELECT * from emp WHERE job='员工' LIMIT 1;

7.order by 排序

#7.order by 排序,默认是升序,如果是按降序,必须加desc
#练习1:按照工资排序
SELECT * from emp ORDER BY sal DESC  #降序
#练习2:按照名字排序
SELECT * from emp ORDER BY ename
#练习3:按照岗位排序
SELECT * from emp ORDER BY job
#练习4:查询15年到19年入职的员工信息只取前两条并按照工资升序排序
SELECT * from emp WHERE 
YEAR(hiredate) BETWEEN 2015 and 2019  #区间[2015,2019]
ORDER BY sal #排序,默认的升序
LIMIT 2 #分页,只取前两条,通常放最后

案例练习

统计案例

#统计案例
#练习1:统计每个员工的年薪
SELECT sal,comm,sal*16+IFNULL(comm,0)*16 from emp; 
#练习2:统计19年以前入职的员工信息
SELECT * from emp WHERE YEAR(hiredate)<2019

三、聚合函数 aggregation

基础函数:

upper lower length concat substr replace ifnull now()/date()/year()…

聚合函数:

把一个字段的值聚合起来,进行获取最大值,最小值,平均数,求和,求个数…
max() min() sum() avg() count()

#聚合函数max min sum avg count
#练习1:求员工的最高薪
SELECT MAX(sal) from emp;
#练习2:求员工的最低薪
SELECT MIN(sal) from emp;
#练习3:求员工的薪资总和
SELECT SUM(sal) from emp;
#练习4:求员工的平均薪资
SELECT AVG(sal) from emp;
#练习5:求总记录数
SELECT COUNT(*) from emp; #低效
SELECT COUNT(1) FROM emp; #高效
SELECT COUNT(sal) FROM emp; #了解,不推荐
SELECT COUNT(comm) FROM emp; #按照字段统计时不统计null
#练习6:统计名字里包含a的总记录数
SELECT COUNT(1) FROM emp WHERE ename LIKE '%a%';
#练习7:统计19年入职的员工里的最高薪
SELECT MAX(sal) FROM emp WHERE YEAR(hiredate)=2019;
#练习8:统计2号部门的平均薪资
SELECT AVG(sal) FROM emp WHERE deptno=2;
#练习9:统计2号部门一年的工资支出总数
SELECT SUM(sal)*12 FROM emp WHERE deptno=2;

四、分组 group

1. group by

#分组group
#使用group by 
#练习1:统计每个部门的平均薪资
SELECT AVG(sal),deptno FROM emp 
GROUP BY deptno; #按照部门分组

#练习2:统计每个部门的最高薪资
SELECT MAX(sal),deptno FROM emp 
#口诀1:查询结果中出现了混合列,包含着聚合列和非聚合列
GROUP BY deptno 
#口诀2:通常按照非聚合列分组

#练习3:统计每年入职的总人数
SELECT YEAR(hiredate),COUNT(1) FROM emp GROUP BY YEAR(hiredate);

#练习4:统计每个岗位的平均薪资
SELECT AVG(sal),job FROM emp GROUP BY job;

2. having

把分组后的数据还想继续过滤,使用group by的固定搭配having

#having 
#练习5:统计每个岗位的平均薪资,而且只要>=10000的
SELECT AVG(sal) a,job FROM emp 
#WHERE a>=10000 #where里不能用别名
#WHERE AVG(sal)>=10000 #where里也不能出现聚合函数
GROUP BY job  #按照非聚合列分组
HAVING a=10000 #分组后的过滤,a是别名


#练习6:统计每年入职的人数,而且只要19年的
SELECT YEAR(hiredate) a,COUNT(1) FROM emp 
GROUP BY a #分组
HAVING a=2019; #分组后的过滤
#使用where可以吗?——可以
SELECT YEAR(hiredate),COUNT(1) FROM emp 
WHERE YEAR(hiredate)=2019
GROUP BY YEAR(hiredate) #分组
#where 和having 哪个效率高
#where 比having 高效,因为执行时机要早一些
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值