学习归纳5:MySQL内置函数、聚合函数、连接、视图、函数

-- 去重,只能单独使用
SELECT DISTINCT nationality FROM tb_student;

-- 时间处理函数
-- 获取年份
SELECT YEAR(birthday) FROM tb_student;
-- 获取月份
SELECT MONTH(birthday) FROM tb_student;
-- 获取日期
SELECT DAY(birthday) FROM tb_student;

-- 数值处理函数
-- 绝对值
SELECT abs(age) FROM tb_student;
-- 向上取整
SELECT CEIL(2.8);
-- 向下取整
SELECT FLOOR(2.3);
-- 取模(求余)
SELECT MOD(5,3);
-- 产生随机数(0——1的小数,左闭右开)
SELECT RAND();
-- 产生任意范围随机数
SELECT FLOOR(RAND()*(最大值-最小值)+最小值);
SELECT CEIL(RAND()*(最大值+最小值)-最小值);
-- 四舍五入
SELECT ROUND(4.5);

-- 字符串处理函数
-- 合并字符串
SELECT CONCAT('Hello','World','!');
SELECT CONCAT(id,name) FROM tb_student;
-- 去掉左右空格
SELECT TRIM('   HelloWorld!   ');
-- 去掉左空格
SELECT LTRIM('   HelloWorld!   ');
-- 去掉右空格
SELECT RTRIM('   HelloWorld!   ');
-- 截取字符串(字符串,起始位置,截取个数)
SELECT SUBSTRING('HelloWorld!',2,2);
-- 返回字符串长度
SELECT LENGTH('   HelloWorld!   ');


-- 聚合函数
-- 计数
SELECT COUNT(*) FROM tb_student;
-- 平均
SELECT AVG(age) FROM tb_student;
-- 最大值
SELECT MAX(age) FROM tb_student;
-- 最小值
SELECT MIN(age) FROM tb_student;
-- 求和
SELECT SUM(age) FROM tb_student;
-- 排序,默认升序asc,降序desc
SELECT * FROM tb_student WHERE sex='男' ORDER BY age DESC,id ASC;
-- 分页(起始,条数),起始是0可以省略
SELECT * FROM tb_student LIMIT 0,10;
-- 分组,筛选
SELECT nationality,COUNT(*) 人数 FROM tb_student GROUP BY nationality HAVING 人数<100;-- WHERE在分组前筛选,HAVING在分组后筛选
-- 编写顺序
-- SELECT FROM WHERE GROUP BY HAVING ORDER BY LIMIT
-- 执行顺序
-- FROM JOIN ON WHERE GROUP BY AVG、SUM等聚集函数 HAVING SELECT DISTINCT ORDER BY -- LIMIT

样例

-- 1
SELECT DISTINCT position FROM job;
-- 2
SELECT DISTINCT source FROM job;
-- 3
SELECT * FROM job WHERE position='市场专员' AND sex='男' ORDER BY age LIMIT 10;
-- 4
SELECT COUNT(*) FROM job;
-- 5
SELECT source,COUNT(*) FROM job GROUP BY source;
-- 6
SELECT sex,COUNT(*) FROM job WHERE position='市场专员' GROUP BY sex;
-- 7
SELECT source FROM job WHERE position='咨询顾问' GROUP BY source ORDER BY COUNT(*) DESC LIMIT 1;
-- 8
SELECT position,COUNT(*) FROM job WHERE age BETWEEN 22 AND 28 GROUP BY position ORDER BY COUNT(*) DESC;
-- 9
SELECT source FROM job GROUP BY source HAVING COUNT(*)>20;
-- 10
SELECT COUNT(DISTINCT position) FROM job ;
-- 11
SELECT position FROM job GROUP BY position ORDER BY COUNT(*) DESC LIMIT 2;
-- 12
SELECT MONTH(recDate) 月份 FROM job GROUP BY 月份 ORDER BY COUNT(*) DESC LIMIT 2;
-- 13
SELECT position,AVG(age) FROM job WHERE sex='女' GROUP BY position;
-- 14
SELECT sex,MAX(age) FROM job WHERE position='市场专员' GROUP BY sex;
-- 二、使用employees表和department表做查询操作
-- 1
SELECT * FROM employees ORDER BY (emp_wage+emp_salary) DESC LIMIT 1;
-- 2
SELECT emp_name FROM employees WHERE com_id='c02' ORDER BY emp_salary DESC LIMIT 1;
-- 3
SELECT * FROM employees ORDER BY emp_wage DESC,emp_date DESC;
-- 4
SELECT SUM(emp_wage) 基本工资总和,AVG(emp_wage) 基本工资平均值,MAX(emp_wage) 最高工资,MIN(emp_wage) 最低工资 FROM employees;
-- 5
SELECT com_id FROM department ORDER BY com_total DESC LIMIT 1;
-- 6
SELECT COUNT(DISTINCT com_id) FROM employees;
-- 7
SELECT COUNT(DISTINCT emp_city) 来自几个城市 FROM employees WHERE emp_city IS NOT NULL;
-- 8
SELECT com_id FROM employees GROUP BY com_id ORDER BY AVG(emp_wage) LIMIT 1;
-- 9
SELECT emp_city,COUNT(*) FROM employees GROUP BY emp_city;
-- 10
SELECT emp_city,AVG(emp_wage) FROM employees GROUP BY emp_city;
-- 11
SELECT com_id,AVG(emp_wage) FROM employees WHERE emp_wage>2000 GROUP BY com_id HAVING AVG(emp_wage)>4000 ORDER BY AVG(emp_wage);
-- 12
SELECT com_id FROM employees GROUP BY com_id HAVING COUNT(*)>6;
-- 13
SELECT com_id,MAX(emp_salary) FROM employees GROUP BY com_id;
-- 14
SELECT CONCAT(YEAR(emp_date),'年') 入职年份,COUNT(*) 人数 FROM employees GROUP BY 入职年份 ORDER BY 入职年份;
-- 内连接,只返回相交数据,inner join = join = ,
-- 笛卡尔积现象,两张表相乘
SELECT * FROM tb_student INNER JOIN tb_grade;
-- 内连接,只返回相交数据
-- 隐式
SELECT * FROM tb_student,tb_grade WHERE tb_student.gradeID=tb_grade.id;
-- 显式
SELECT * FROM tb_student INNER JOIN tb_grade ON tb_student.gradeID=tb_grade.id;
-- 外连接
-- 左外连接,返回两张表交集数据以及左表剩余数据
SELECT tb_student.* FROM tb_student LEFT JOIN tb_grade ON tb_student.gradeID=tb_grade.id;
-- 右外连接,返回两张表交集数据以及右表剩余数据
SELECT tb_grade.* FROM tb_student RIGHT JOIN tb_grade ON tb_student.gradeID=tb_grade.id;
-- 全外连接
SELECT * FROM tb_student LEFT JOIN tb_grade ON tb_student.gradeID=tb_grade.id
UNION
SELECT * FROM tb_student RIGHT JOIN tb_grade ON tb_student.gradeID=tb_grade.id;
-- 多表连接,先连接两个表,然后连第三个
-- 自连接
SELECT b.* FROM tb_student a INNER JOIN tb_student b ON a.name='郑新伟' AND b.age>a.age;
-- 嵌套连接
SELECT * FROM tb_student WHERE age>(SELECT age FROM tb_student WHERE name='郑新伟');
-- 视图,把返回的结果封装成一张新的表,会占用内存空间,随时调用
-- MySQL中尽量少使用视图,数据和逻辑耦合
-- 函数,比视图更严重的耦合,明令禁止不可使用

样例

-- 1
SELECT b.name FROM job a INNER JOIN job b ON a.name='罗曼' AND b.position=a.position AND b.name<>'罗曼';
-- 2
SELECT * FROM job WHERE age>(SELECT AVG(age) FROM job);
-- 3
SELECT * FROM job WHERE position=(SELECT position FROM job GROUP BY position ORDER BY COUNT(position) desc LIMIT 1);

SELECT*FROM job HAVING position in(SELECT position FROM job GROUP BY position HAVING COUNT(*)=(SELECT MAX(total) FROM(SELECT COUNT(*) AS total FROM job GROUP BY position) AS aa))
-- 4
SELECT b.* FROM job a INNER JOIN job b ON a.name='王亮' AND b.recDate=a.recDate AND b.name!='王亮';
-- 5
SELECT position FROM job GROUP BY position HAVING COUNT(position)>(SELECT COUNT(position) FROM job WHERE position='网络推广');
-- 使用employees表、department表完成如下查询
-- 1
SELECT emp_name,com_name,(emp_wage+emp_salary) FROM employees,department WHERE emp_city='大连' AND employees.com_id=department.com_id;
-- 2
SELECT emp_name,emp_city,emp_wage,emp_salary FROM employees WHERE com_id=(SELECT com_id FROM department WHERE com_name='人事部');
-- 3
SELECT emp_name,emp_wage FROM employees WHERE emp_wage<(SELECT AVG(emp_wage) FROM employees);
-- 4
SELECT emp_name,emp_date FROM employees WHERE emp_date>(SELECT emp_date FROM employees WHERE emp_name='冰红茶');
-- 5
SELECT emp_name,emp_salary FROM employees WHERE emp_salary=(SELECT MAX(emp_salary) FROM employees);
-- 6
SELECT emp_name,employees.com_id FROM employees INNER JOIN department ON department.com_manager='王九' AND employees.com_id=department.com_id;
-- 7
SELECT emp_name FROM employees INNER JOIN department ON department.com_manager='张三' AND employees.com_id=department.com_id;
-- 8
SELECT com_name,com_manager FROM department WHERE com_id=(SELECT com_id FROM employees GROUP BY com_id HAVING SUM(emp_wage) ORDER BY SUM(emp_wage) DESC LIMIT 1);
-- 9
SELECT emp_name,com_name,com_manager,emp_wage FROM employees,department WHERE department.com_id=(SELECT com_id FROM employees ORDER BY emp_wage DESC LIMIT 1) AND employees.com_id=department.com_id AND employees.emp_name=(SELECT emp_name FROM employees ORDER BY emp_wage DESC LIMIT 1);
-- 10\\
SELECT b.com_name,COUNT(*),b.com_manager FROM employees a RIGHT JOIN department b ON a.com_id=b.com_id GROUP BY a.com_id ORDER BY COUNT(*) DESC
-- 11
SELECT emp_name FROM employees WHERE com_id=(SELECT com_id FROM department ORDER BY com_total DESC LIMIT 1);
-- 12
SELECT * FROM employees WHERE emp_city=(SELECT emp_city FROM employees GROUP BY emp_city ORDER BY COUNT(*) DESC LIMIT 1);
-- 13
SELECT com_name FROM department WHERE com_id=(SELECT com_id FROM employees GROUP BY com_id HAVING AVG(YEAR(emp_date)) ORDER BY AVG(YEAR(emp_date)) LIMIT 1);
-- 附加题:使用emp表、salary表、posMess完成如下查询
-- 1
SELECT EmployeeName,position,wage FROM emp,salary WHERE emp.employeeID=salary.EmployeeID;
-- 2
SELECT EmployeeName,wage FROM emp,salary,posmess WHERE emp.employeeID=salary.EmployeeID AND salary.position=posmess.positionID AND positionName='Teacher';
-- 3
SELECT employeeName,positionName FROM emp LEFT JOIN salary ON emp.employeeID=salary.EmployeeID LEFT JOIN posmess ON salary.position=posmess.positionID WHERE emp.employeeTel IS NULL;
-- 4
SELECT emp.employeeID,emp.employeeName,if(salary.wage is not null,posmess.positionName,'') AS 职位名称,if(salary.wage is not null,salary.wage,'' ) AS 工资数额 FROM salary LEFT JOIN emp ON emp.employeeID = salary.employeeID LEFT JOIN posmess ON salary.position = posmess.positionID;
-- 5
SELECT employeeName FROM emp RIGHT JOIN salary ON emp.employeeID=salary.EmployeeID ORDER BY wage DESC LIMIT 1;
-- 6
SELECT a.employeeID FROM emp a LEFT JOIN salary b ON a.employeeID=b.employeeID WHERE b.employeeID IS NULL;
-- 7
SELECT position,wage FROM salary LEFT JOIN emp ON emp.employeeID=salary.employeeID ORDER BY emp.employeeAge DESC LIMIT 1;
-- 【选做题:学生选课】
-- 1
CREATE TABLE student(
stuID VARCHAR(5) PRIMARY KEY,
stuName VARCHAR(10),
stuAge int 
);
INSERT INTO student VALUES
('001','王晓丽',20),
('002','李媛媛',18),
('003','张三峰',21),
('004','赵刚',19),
('005','陈丽燕',20);
-- 2
CREATE TABLE course(
courseID VARCHAR(5) PRIMARY KEY,
courseName VARCHAR(15)
);
INSERT INTO course VALUES
('01','Html'),
('02','MySQL'),
('03','Java'),
('04','php');
-- 3
CREATE TABLE choose(
cid int PRIMARY KEY,
stuID VARCHAR(5),
courseID VARCHAR(5),
FOREIGN KEY(stuID) REFERENCES student(stuID),
FOREIGN KEY(courseID) REFERENCES course(courseID)
);
INSERT INTO choose VALUES
(1,'001','01'),
(2,'001','02'),
(3,'002','01'),
(4,'003','02'),
(5,'004','03');
-- 4
SELECT student.stuID,stuName,courseName FROM student,choose,course WHERE student.stuID=choose.stuID AND course.courseID=choose.courseID;
-- 5
SELECT student.stuID,stuName,courseName FROM student LEFT JOIN choose ON student.stuID=choose.stuID LEFT JOIN course ON course.courseID=choose.courseID;
-- 6
SELECT student.stuID,stuName,course.courseID,courseName FROM course LEFT JOIN choose ON course.courseID=choose.courseID LEFT JOIN student ON student.stuID=choose.stuID;

注:MySQL不可以进行聚合函数的嵌套,Oracle可以;MySQL实现全外连接只能以左外连接和右外连接的方式,Oracle可以单独用全外连接关键字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值