MYSQL基础知识的复习3

聚合函数
  1. max():求最大值
    例:求最高工资 select max(sal) from emp;
  2. min():求最小值
    例:求最小工资 select min(sal) from emp;
  3. avg():求平均值
    例:求平均工资 select avg(sal) from emp;
  4. count():求个数
    例:求员工个数 select count(empno) from emp;
  5. sum():求和
    例:求所有员工工资和 select sum(sal) from emp;
例1

求比20号部门所有员工薪水高的员工信息:
select * from emp where sal > (select max(sal) from emp where deptno = 20);

分组查询(group by):

例子:求每个部门的最高薪水
select max(sal) from emp group by deptno;
注意:使用分组查询后select后只能跟聚合函数以及分组的字段

例2

求每个部门的最高薪水、部门号和员工名称
思路:把查询到的结果作为一张表和现存的表联表查询
MYSQL基础知识的复习3_第1张图片

分组条件(having):

例:查询每个部门中最高薪水并且显示最高薪水大于30000的
select max(sal),deptno from emp group by deptno having max(sal) > 30000;
注意:在where后不能跟聚合函数,having后可以跟聚合函数以及分组的字段
MYSQL基础知识的复习3_第2张图片

练习
create database library;
use library;
-- 创建表readers 读者信息表
create table readers(
  reader_id int(7) primary key,-- 读者id
  name varchar(8),-- 读者姓名
  sex varchar(2) default '男' check(sex in('男','女')),
  dept varchar(16),-- 读者所在部门
  status varchar(8),-- 学历
  address varchar(30)-- 地址
);
-- 图书信息表
create table books(
 book_id int(6) primary key,-- 图书编号
 type_id varchar(3),-- 类型编号
 book_name varchar(50),-- 图书名
 author varchar(50),-- 作者
 publisher varchar(50),-- 出版社
 price int(3)-- 价格
);
-- 借阅信息表
create table borrow_info(
  reader_id int(7),-- 读者id
  book_id int(6),-- 图书Id
  borrow_time date,-- 借书时间
  notes varchar(200),-- 标志
    primary key(reader_id,book_id)
);
alter table borrow_info add constraint fk_boorow_reader foreign key(reader_id) references readers(reader_id);
alter table borrow_info add constraint fk_boorow_books foreign key(book_id) references books(book_id);

-- 添加数据readers
insert into readers values('0034103','范元帅','男','艺术学院','本科生','师大南院');
insert into readers values('0034301','杨凡','男','电信学院','教师','八里台禄小区');
insert into readers values('0034429','许丹丹','女','艺术学院','本科生','师大南院');
insert into readers values('0134101','陈超','男','计算机学院','本科生','师大南院');
insert into readers values('0134102','范金良','男','计算机学院','本科生','师大南院');
insert into readers values('0134103','国皓','男','计算机学院','本科生','师大南院');
insert into readers values('0134104','贺云龙','男','计算机学院','本科生','师大南院');
insert into readers values('0134105','刘德文','男','计算机学院','本科生','师大南院');
insert into readers values('0134106','彭俊','男','计算机学院','本科生','师大南院');
insert into readers values('0134107','彭志成','男','计算机学院','本科生','师大南院');
insert into readers values('0134108','沈举','男','计算机学院','本科生','师大南院');
insert into readers values('0134109','田强','男','计算机学院','本科生','师大南院');
insert into readers values('0134110','王旭','男','计算机学院','本科生','师大南院');
insert into readers values('0134111','吴卫','男','计算机学院','本科生','师大南院');
insert into readers values('0134112','熊敏','男','计算机学院','本科生','师大南院');
insert into readers values('0134113','颜东','男','计算机学院','本科生','师大南院');
insert into readers values('0134114','殷建鹏','男','计算机学院','本科生','师大南院');
insert into readers values('0134115','周春林','男','计算机学院','本科生','师大南院');
insert into readers values('0134116','陈洁','女','计算机学院','本科生','师大南院');
insert into readers values('0134117','陈琪','女','计算机学院','研究生','师大南院');
insert into readers values('0134118','丁璐','女','计算机学院','研究生','师大南院');
insert into readers values('0134119','丁岩','女','计算机学院','本科生','师大南院');
insert into readers values('0134120','董蕾','女','计算机学院','本科生','师大南院');
insert into readers values('0134121','何芳','女','计算机学院','本科生','师大南院');
insert into readers values('0134122','蒋莎','女','计算机学院','本科生','师大南院');
insert into readers values('0134123','李颖','女','计算机学院','研究生','师大南院');
insert into readers values('0134124','李芬','女','计算机学院','研究生','师大南院');
insert into readers values('0134125','李锦萍','女','计算机学院','教授','师大南院');
insert into readers values('0134126','李小汐','女','计算机学院','本科生','师大南院');
insert into readers values('0134127','李玥玖','女','计算机学院','本科生','师大南院');
insert into readers values('0134128','郦莎','女','计算机学院','本科生','师大南院');
insert into readers values('0134129','廖英','女','计算机学院','本科生','师大南院');
insert into readers values('0134130','林琳','女','计算机学院','教师','师大南院');
insert into readers values('0134131','林敏','女','计算机学院','本科生','师大南院');

insert into books values('109101','BAS','高等数学','李方健','清华大学出版社','20');
insert into books values('109104','BAS','离散数学','孙德风','天津大学出版社','22');
insert into books values('109107','ELC','数字电路','刘国庆','高等教育出版社','13');
insert into books values('109109','CMP','C语言程序设计','谭浩强','清华大学出版社','15');
insert into books values('109110','CMP','数据结构','王志国','高等教育出版社','32');
insert into books values('109111','CMP','操作系统','王志国','高等教育出版社','25');
insert into books values('109112','CMP','计算机组成原理','张小敏','南大在学出版社','27');
insert into books values('109113','CMP','微机原理与接口技术','刘国庆','人民大学出版社','34');
insert into books values('109114','CMP','数据库原理','彭来德','高等教育出版社','16');
insert into books values('109115','CMP','计算机网络','马国露','人民大学出版社','11');
insert into books values('109116','CMP','计算机网络','谭浩强','南大在学出版社','13');
insert into books values('109117','CMP','编译原理','方刚','清华大学出版社','38');
insert into books values('209101','CMP','VB与WINDOWS程序设计','谭浩强','清华大学出版社','30');
insert into books values('209102','CMP','C++与面向对象技术','谭浩强','人民大学出版社','19');
insert into books values('209103','CMP','Java与网络程序设计','付勇','高等教育出版社','20');
insert into books values('209106','CMP','单片机原理及应用','刘国庆','人民大学出版社','22');
insert into books values('209107','CMP','PLC原理及其应用开发','刘国庆','南大在学出版社','16');
insert into books values('209111','CMP','人工智能导论','丁宝康','高等教育出版社','18');
insert into books values('209116','CMP','信息论与编码学概论','丁宝康','高等教育出版社','21');
insert into books values('209117','CMP','密码学基础','张顺志','人民大学出版社','25');
insert into books values('209123','CMP','Internet应用及网页设计','李朋','高等教育出版社','16');
insert into books values('209124','CMP','多媒体技术及应用','谭浩强','高等教育出版社','15');
insert into books values('209130','CMP','PB与数据库应用开发','张华强','清华大学出版社','42');
insert into books values('209132','CMP','计算机图形学','徐志超','人民大学出版社','27');
insert into books values('309102','CMP','计算机学科教学论','丁宝康','高等教育出版社','12');
insert into books values('309103','CMP','中学计算机教材研究与分析','徐志超','人民大学出版社','14');
insert into books values('309104','CMP','信息技术概论','付勇','天津大学出版社','24');
insert into books values('309105','CMP','数据库分析与设计','丁宝康','人民大学出版社','30');
insert into books values('309106','CMP','数据库导论','付勇','清华大学出版社','29');


insert into borrow_info values('0034103','109101','2005-6-2 00:00:00','NULL');
insert into borrow_info values('0034301','209130','2005-6-14 00:00:00','NULL');
insert into borrow_info values('0034429','109107','2005-6-1 00:00:00','NULL');
insert into borrow_info values('0134101','109109','2005-6-3 00:00:00','NULL');
insert into borrow_info values('0134102','109110','2005-6-30 00:00:00','NULL');
insert into borrow_info values('0134103','109111','2005-6-13 00:00:00','NULL');
insert into borrow_info values('0134104','109112','2005-6-1 00:00:00','NULL');
insert into borrow_info values('0134105','109113','2005-6-14 00:00:00','NULL');
insert into borrow_info values('0134106','109114','2005-6-1 00:00:00','NULL');
insert into borrow_info values('0134107','109115','2005-6-1 00:00:00','NULL');
insert into borrow_info values('0134108','109116','2005-6-12 00:00:00','NULL');
insert into borrow_info values('0134109','109117','2005-6-1 00:00:00','NULL');
insert into borrow_info values('0134110','209101','2005-6-22 00:00:00','NULL');
insert into borrow_info values('0134111','209102','2005-6-1 00:00:00','NULL');
insert into borrow_info values('0134112','209103','2005-6-16 00:00:00','NULL');
insert into borrow_info values('0134113','209106','2005-6-1 00:00:00','NULL');
insert into borrow_info values('0134114','209107','2005-6-11 00:00:00','NULL');
insert into borrow_info values('0134115','209111','2005-6-1 00:00:00','NULL');
insert into borrow_info values('0134116','209106','2005-6-14 00:00:00','NULL');
insert into borrow_info values('0034301','209132','2005-6-1 00:00:00','NULL');
insert into borrow_info values('0034301','309102','2005-6-9 00:00:00','NULL');
insert into borrow_info values('0034301','309103','2005-6-21 00:00:00','NULL');
insert into borrow_info values('0034301','309104','2005-6-14 00:00:00','NULL');
insert into borrow_info values('134101','109101','2005-6-1 00:00:00','NULL');
insert into borrow_info values('134102','109104','2005-6-8 00:00:00','NULL');
insert into borrow_info values('134104','109107','2005-6-1 00:00:00','NULL');
insert into borrow_info values('134105','109109','2005-6-1 00:00:00','NULL');



-- 1、检索读者“杨凡”所在单位
select dept from readers where name = '杨凡';
-- 2、检索所有读者的全部信息
select * from readers;
-- 3、检索图书馆中所有藏书的书名和出版单位
select book_name,publisher from books;
-- 4、检索“人民大学出版社”所有的书名和单价,结果按照单价降序排列
select book_name,price from books where publisher = '人民大学出版社' order by price desc;
-- 5、检索价格在10元至15元之间的图书的名称、作者、单价和分类号,
-- 结果按分类号和单价升序排列
select book_name,author,price,type_id from books where price between 10 and 15;
-- 6、检索“人民大学出版社”和“清华大学出版社”的所有图书的名称和作者
select book_name,author from books where publisher in ('人民大学出版社','清华大学出版社');
-- 7、检索书名以“数据库”开头的所有图书的书名和作者
select book_name,author from books where book_name like '数据库%';
-- 8、检索同时借了总编号为209116和209124两本图书的借书证号
select reader_id from borrow_info where reader_id in (
select reader_id from borrow_info where book_id = 209124 ) and book_id = 209116;
-- 9、检索所有借阅了图书的读者姓名和所在单位
select distinct name,dept from readers,borrow_info where readers.reader_id = borrow_info.reader_id;
-- 10、检索“扬凡”所借的所有图书的书名和借阅日期
select book_name,borrow_time from borrow_info b,readers r,books where b.reader_id = r.reader_id 
and books.book_id = b.book_id and name = '杨凡';
-- 11、检索价格在20元以上且已经借出的图书,结果按单价降序排列
select book_name,price from borrow_info bo,books b where bo.book_id = b.book_id and price > 20 order by price desc ;
-- 12、检索借阅了“C语言程序设计”一书的读者姓名和所在单位
select name,dept from books b,borrow_info bo,readers r where b.book_id = bo.book_id and r.reader_id = bo.reader_id 
and book_name = 'C语言程序设计';
-- 13、检索与“杨凡”在同一天借阅了图书的读者的姓名和所在单位
select distinct name,dept from readers r,borrow_info bi where bi.reader_id = r.reader_id and borrow_time in  (
select borrow_time from borrow_info bi,readers r where bi.reader_id = r.reader_id and name = '杨凡')and name!='杨凡';
-- 14、检索藏书中比“高等教育出版社”的所有图书的单价更高的图书
select book_name from books where price >(
select max(price) from books where publisher = '高等教育出版社');
   
-- 15、检索藏书中所有与“数据库导论”或“数据库原理”在同一出版社出版的图书
select book_name from books where publisher in (
select publisher from books where book_name = '数据库导论' or book_name = '数据库原理')
and book_name not in('数据库导论','数据库原理');
-- 16、求该图书馆藏书的总册数
select count(book_id) from books;
-- 17、求“高等教育出版社”的图书中最高的价格、最低的价格以及平均价格
select max(price),min(price),avg(price) from books where publisher = '高等教育出版社';
-- 18、求“计算机学院”当前借阅了图书的读者人数
select count(t.name) from readers r,(select distinct name from borrow_info bf,readers r where bf.reader_id = r.reader_id and dept = '计算机学院') t
where r.name = t.name;
-- 19、求各个出版社的最高价格、最低价格、平均价格
select max(price),min(price),avg(price),publisher from books group by publisher;
-- 20、分别求出各个单位当前借阅图书的读者人数
select count(distinct bf.reader_id) from readers r,borrow_info bf where r.reader_id = bf.reader_id group by dept;
-- 21、求各个出版单位的册书、价格总额,并按总价降序排列,
select count(book_id),sum(price),publisher from books group by publisher order by sum(price);
-- 22、检索当前至少借阅了5本图书的读者姓名和所在单位
select name,dept from readers r,borrow_info bf where r.reader_id = bf.reader_id group by bf.reader_id HAVING count(bf.reader_id) >=5;
-- 23、分别找出借书人数超过10个人的单位和人数
select dept,count(distinct bf.reader_id) from borrow_info bf,readers r where r.reader_id = bf.reader_id group by dept having count(bf.reader_id) >=10;
-- 24、检索没有借阅任何图书的读者姓名和所在单位
select name,dept from readers where reader_id not in (select reader_id from borrow_info);
MYSQL中常见的一些函数
1.算术函数
  1. ceil(字段):向上取整
  2. floor(字段):向下取整
  3. format(字段,n):保留n位小数 可以四舍五入
  4. mod():取模 mod(10,3) 10取余3

    2.字符串函数
  5. concat(string [,...]):拼接字符串
  6. instr(string,substring):查询sub在字符串str中第一次出现的位置 不存在返回0,第一个就是1,第二个就是2
  7. ucase(str):把字符串str转成大写
  8. lcase(str):把字符串str转成小写
  9. left(string2,length):查询字符串string2左数前length个字符
  10. right(string2,length):查询字符串string2右数前length个字符
  11. length(string):求字符串占用字节数 一个汉字占三个字节
  12. char_length(str):求字符串占用字符数
  13. replace(str,search_str,replace_str):替换 将str中search_str替换为replace_str
  14. substring(str,position[,length]):截取字符串 从position位置截取length个字符,如果没有length那就截取到最后
  15. lpad(str ,length , 填充字符) 在前面
  16. rpad(str ,length , 填充字符) 在后面

    3.时间日期相关函数
  17. now():表示当前日期和时间 时分秒
  18. year():获取日期的年份
  19. month():获取日期的月份
  20. last_day:获取月份的最后一天的日期
  21. datediff(date1,date2):两个日期相隔的天数 前面减后面
  22. timestampdiff(unit,datetime_expr1,datetime_expr2):unit 单位 后面减前面 可以按照单位进行时间差
    MYSQL基础知识的复习3_第3张图片

    练习
CREATE DATABASE test1;
USE test1;
-- 部门表
CREATE TABLE DEPT(
DEPTNO int PRIMARY KEY,-- 部门编号
DNAME VARCHAR(14) , -- 部门名称
LOC VARCHAR(13) -- 部门地址
) ;
INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');
-- 员工表
CREATE TABLE EMP(
EMPNO int PRIMARY KEY, --  员工编号
ENAME VARCHAR(10), --  员工姓名
JOB VARCHAR(9), --  员工工作
MGR int, --  员工直属领导编号
HIREDATE DATE, --  入职时间
SAL double, --  工资
COMM double, --  奖金
DEPTNO int --  对应dept表的外键
);
--  添加 部门 和 员工 之间的主外键关系
ALTER TABLE EMP ADD CONSTRAINT FOREIGN KEY EMP(DEPTNO) REFERENCES DEPT (DEPTNO);
INSERT INTO EMP VALUES(7369,'SMITH','CLERK',7902,"1980-12-17",800,NULL,20);
INSERT INTO EMP VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO EMP VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO EMP VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO EMP VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO EMP VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO EMP VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO EMP VALUES(7788,'SCOTT','ANALYST',7566,'1987-07-03',3000,NULL,20);
INSERT INTO EMP VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO EMP VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO EMP VALUES(7876,'ADAMS','CLERK',7788,'1987-07-13',1100,NULL,20);
INSERT INTO EMP VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO EMP VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO EMP VALUES(7934,'MILLER','CLERK',7782,'1981-01-23',1300,NULL,10);
--  工资等级表
CREATE TABLE SALGRADE(
GRADE int, --  等级
LOSAL double, --  最低工资
HISAL double ); --  最高工资
INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);


-- 1. ceil(字段):向上取整
select ceil(50.1) from dual;
-- 2. floor(字段):向下取整
select floor(10.9) from dual;
-- 3. format(字段,n):保留n位小数 可以四舍五入
select format(20.3435514,4) from dual;
-- 4. mod():取模    mod(10,3) 10取余3
select mod(100,3) from dual;
-- 1. concat(string [,...]):拼接字符串
select concat('Hello','World','!') from dual;
-- 2. instr(string,substring):查询sub在字符串str中第一次出现的位置 不存在返回0,第一个就是1,第二个就是2
select instr('wafawfafw','a') from dual;
select instr('aaaaaaa','b') from dual;
-- 3. ucase(str):把字符串str转成大写
select ucase('dwabuif') from dual;
-- 4. lcase(str):把字符串str转成小写
select lcase('FEAAFA') from dual;
-- 5. left(string2,length):查询字符串string2左数前length个字符
select left('wadnnfafaw',4) from dual;
-- 6. right(string2,length):查询字符串string2右数前length个字符
select right('aiglmwanf',4) from dual;
-- 7. length(string):求字符串占用字节数  **一个汉字占三个字节**
select length('igrsnafaf') from dual;
select length('安慰个看到你法分为') from dual;
select length('    ') from dual; 
-- 8. char_length(str):求字符串占用字符数
select char_length('nfnaw') from dual;
select char_length('王发发挖方') from dual;
select char_length('   ') from dual;
-- 9. replace(str,search_str,replace_str):替换   将str中search_str替换为replace_str
select replace('wadafa','a','啊') from dual;
-- 10. substring(str,position[,length]):截取字符串 从position位置截取length个字符,如果没有length那就截取到最后
select substring('fwafwaf',2,2) from dual;
-- 11. lpad(str ,length , 填充字符)   在前面
select lpad('adw',10,'a') from dual;
-- 12. rpad(str ,length , 填充字符)   在后面
select rpad('adw',10,'a') from dual;
-- 1. now():表示当前日期和时间 时分秒
select now() from dual;
-- 2. year():获取日期的年份
select year('2019-3-1') from dual;
-- 3. month():获取日期的月份
select month('2019-3-1') from dual;
-- 4. last_day:获取月份的最后一天的日期
select last_day('2019-2-1') from dual;
select last_day('2008-2-1') from dual;
-- 5. datediff(date1,date2):两个日期相隔的天数 前面减后面
select datediff('2019-5-13','2014-3-21') from dual;
-- 6. timestampdiff(unit,datetime_expr1,datetime_expr2):unit 单位 后面减前面 可以按照单位进行时间差
select timestampdiff(day,'2014-3-21','2019-5-13') from dual;
select timestampdiff(hour,'2014-3-21','2019-5-13') from dual;
select timestampdiff(minute,'2014-3-21','2019-5-13') from dual;



-- 1. 以首字母大写,其他字母小写的方式显示所有员工的姓名
select concat(substring(ename,1,1),lcase(substring(ename,2))) from emp;
-- 2. 将员工的职位用小写字母显示
select lcase(job) from emp;
-- 3. 显示员工姓名超过5个字符的员工名
select ename from emp where char_length(ename) > 5;
-- 4. 用#来填充员工职位job的结尾处,按10个字符长度输出。RPAD
select RPAD(job,10,'#') from emp
-- 5. 去除字符串'  hello world  '两边的空格,并将单词间的空格改为','逗号。
select REPLACE(TRIM('  hello world  '),' ',',') from dual;
-- 6. 以指定格式显示员工的奖金(格式:allen's comm is 300) 注:如果奖金为null显示为null,如smith 's comm is null。
select concat(ename,'\'s comm is ',if(comm is null,'null',comm)) from emp;
-- 7. 显示在一个月为30天的情况所有员工的日薪,忽略余数
select floor(sal/30) from emp;
-- 8. 显示员工在此公司工作了几个月
select timestampdiff(month,hiredate,now()) from emp;
-- 9. 显示所有12月份入职的员工
select ename from emp where month(hiredate) = 12;
-- 10. 显示员工的年薪。(sal+com)*12 需要上网查。
select (sal+if(comm is null,0,comm)) * 12 年薪 from emp;
-- 11. 显示所有员工的姓名、加入公司的年份和月份,并且按照年份升序排列
select ename,year(hiredate),month(hiredate) from emp order by year(hiredate);
-- 12. 求部门名称中带“S”字符的部门员工的工资合计、部门人数
select sum(sal),count(empno) from emp where instr(ename,'S') > 0;
-- 13. 查询任职日期超过30年的员工,显示时将月薪加10%后显示。
select floor(sal*1.1),ename from emp where timestampdiff(year,hiredate,now()) > 30;

转载于:https://www.cnblogs.com/wuliqqq/p/11240521.html

你可能感兴趣的:(MYSQL基础知识的复习3)