mysql经典案例练习
发布日期:2022-02-26 14:49:38 浏览次数:47 分类:技术文章

本文共 13736 字,大约阅读时间需要 45 分钟。

  • 一入编程深似海
    - 从此妹子是路人!

create table student(

id int,
name varchar(20),
chinese float,
english float,
math float
);
insert into student(id,name,chinese,english,math) values(1,’王帅’,89,78,90);
insert into student(id,name,chinese,english,math) values(2,’潘金莲’,67,53,95);
insert into student(id,name,chinese,english,math) values(3,’凤姐’,87,78,77);
insert into student(id,name,chinese,english,math) values(4,’旺财’,88,98,92);
insert into student(id,name,chinese,english,math) values(5,’白小黑’,82,84,67);
insert into student(id,name,chinese,english,math) values(6,’白小黄’,55,85,45);
insert into student(id,name,chinese,english,math) values(7,’范蹦蹦’,75,65,30);
DESC student;


查询表中所有学生的信息。

SELECT * FROM student;
查询表中所有学生的姓名和对应的英语成绩。
SELECT name , english from student;
过滤表中重复数据。
SELECT DISTINCT * FROM student;
统计每个学生的总分。
SELECT NAME,chinese+english+math 总分 FROM student;
在所有学生总分数上加10分特长分。
SELECT NAME,chinese+english+math+10 ‘总分’ FROM student;
使用别名表示学生分数。
SELECT name, chinese ‘中文’,english “英语”,math ‘数学’ from student;
查询姓名为王帅的学生成绩
SELECT name,chinese,english,math, chinese+english+math ‘总分’ FROM student WHERE name=’王帅’ ;
查询英语成绩大于90分的同学
SELECT * from student WHERE english>90;
查询总分大于200分的所有同学
SELECT name,chinese+english+math ‘总分 ‘FROM student WHERE chinese+english+math >200;
查询英语分数在 80-90之间的同学。
SELECT name ,english ‘英语’ FROM student WHERE english<90 AND english>80;
查询数学分数为89,90,91的同学。
SELECT name ,math ‘数学’ FROM student WHERE math in (89,90,91);
查询所有姓白的学生英语成绩。
SELECT name,english ‘英语’ from student WHERE name LIKE ‘白%’;
查询数学分>80并且语文分>80的同学。
SELECT name,math ,chinese from student WHERE math>80 AND chinesee>80;
查询英语>80或者总分>200的同学
SELECT name,english ‘英语’,chinese+english+math ‘总分’ from student WHERE english >80 OR chinese+english+math >200;
对数学成绩排序后输出。
SELECT * from student ORDER BY math ASC;
SELECT * from student ORDER BY math DESC;
对总分排序后输出,然后再按从高到低的顺序输出
SELECT name,chinese,english,math,chinese+english+math ‘总分’ FROM student ORDER BY chinese+english+math DESC;
对姓李的学生成绩排序输出
SELECT name,chinese+english+math ‘总分’ from student WHERE name LIKE ‘白%’ ORDER BY chinese+english+math DESC;


CREATE TABLE orders(

id INT PRIMARY KEY AUTO_INCREMENT, – 订单id
money DOUBLE, – 订单总价
receiveraddress VARCHAR(50), – 订单收货地址
uid INT, – 用户id
CONSTRAINT FK_UID FOREIGN KEY orders(uid) REFERENCES USER(uid)
)

– 用户表

CREATE TABLE USER(
uid INT PRIMARY KEY AUTO_INCREMENT, – 用户编号
NAME VARCHAR(20) – 用户姓名
)

INSERT INTO USER VALUES(NULL,”tom”);

INSERT INTO USER VALUES(NULL,”fox”);

INSERT INTO orders VALUES(NULL,1000,”北京”,1);

INSERT INTO orders VALUES(NULL,2000,”上海”,1);
INSERT INTO orders VALUES(NULL,3000,”广州”,2);
INSERT INTO orders VALUES(NULL,4000,”深圳”,2);


部门表

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 DOUBLE, – 直属领导编号
HIREDATE DATE, – 入职时间
SAL DOUBLE, – 工资
COMM DOUBLE, – 奖金
DEPTNO INT, – 部门号
FOREIGN KEY(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-13’,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,’1982-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、查找部门30中员工的详细信息。

SELECT * FROM dept WHERE DEPTNO=30;
2、找出从事clerk工作的员工的编号、姓名、部门号。
SELECT empno,ename,deptno FROM emp WHERE job =’clerk’;
3、检索出奖金多于基本工资的员工信息。
SELECT * FROM emp WHERE comm >sal;
4、检索出奖金多于基本工资60%的员工信息。
SELECT * from emp WHERE comm>sal*0.6;
5、找出10部门的经理、20部门的职员 的员工信息。
SELECT * FROM emp WHERE mgr=NULL OR deptno = 20;
6、找出10部门的经理、20部门的职员 或者既不是经理也不是职员但是工资高于2000元的员工信息。

SELECT

*
FROM
emp
WHERE
(job = ‘manager’ AND deptno = 10)
OR (deptno = 20 AND job =’clerk’)
OR (sal > 2000 AND job != ‘manager’ AND job!= ‘clerk’);
7、找出获得奖金的员工的工作。
SELECT ename,job FROM emp WHERE comm != 0;
8、找出奖金少于100或者没有获得奖金的员工的信息。
SELECT * FROM emp WHERE COMM<100 or comm = 0;
9、找出姓名以A、B、S开始的员工信息。
SELECT * FROM emp WHERE ename like ‘A%’OR ename like ‘b%’ OR ename like ‘s%’;
10、找到名字长度为7个字符的员工信息。(所给数据中无名字达到七个字符的)
SELECT * FROM emp WHERE LENGTH(ename)=6;
11、名字中不包含R字符的员工信息。
1、mysql有很多字符串函数 find_in_set(str1,str2)函数是返回str2中str1所在的位置索引,str2必须以”,”分割开。
2、使用locate(substr,str)函数,如果包含,返回>0的数,否则返回0
SELECT * FROM emp where ename NOT LIKE ‘r%’;
12、返回员工的详细信息并按姓名排序。
SELECT * FROM emp ORDER BY ename ASC;
SELECT * FROM emp ORDER BY sal ASC, job DESC
13、返回员工的信息并按员工的工作年限降序排列。
SELECT * FROM emp ORDER BY hiredate DESC;
14、返回员工的信息并按工作降序工资升序排列。
SELECT * FROM emp ORDER BY sal ASC, job DESC
15、计算员工的日薪(按30天)。
SELECT ename,sal/30 ‘日新’ FROM emp;
16、找出姓名中包含A的员工信息。
SELECT * FROM emp WHERE ename LIKE ‘%a%’;

第二部分练习

1、返回拥有员工的部门名、部门号。(dept,emp)
SELECT
dept.DEPTNO,dept.dname
FROM
emp
JOIN
dept
ON
emp.deptno=dept.DEPTNO

2、工资水平多于smith的员工信息。

SELECT * FROM emp WHERE SAL>800;
3、返回员工和所属经理的姓名。(自连接)
SELECT
e1.ename “领导”,
e2.ename ‘员工’
FROM
emp e1
JOIN emp e2 ON e1.empno = e2.mgr
4、返回雇员的雇佣日期早于其领导雇佣日期的员工及其领导姓名。(在日期类型可以直接比较)
注意:日起进行比较时,你叫的是数字的大小,不是时间的先后
SELECT
e1.ename 领导,e2.ename 员工,e1.hiredate 领导入职时间,e2.hiredate 员工入职时间
FROM
emp e1
join
emp e2
ON
e1.empno=e2.mgr
AND e1.hiredate>e2.hiredate
5、返回员工姓名及其所在的部门名称。

SELECT

emp.ename,
dept.dname
FROM
emp
JOIN dept ON emp.deptno = dept.deptno
6、返回从事clerk工作的员工姓名和所在部门名称。

SELECT

emp.ename,
dept.dname
FROM
emp
JOIN dept ON emp.deptno = dept.deptno
WHERE
emp.job = ‘clerk’
7、返回部门号及其本部门的最低工资。
SELECT
MIN(sal),deptno
FROM
emp
GROUP BY deptno
8、返回销售部(sales)所有员工的姓名。
SELECT
emp.ename
FROM
emp
JOIN
dept
ON
emp.deptno=dept.deptno
WHERE emp.job!=’MANAGER’ AND emp.job!=’clerk’ AND dept.dname=’sales’
9、返回工资多于平均工资的员工。
SELECT
*
FROM
emp
WHERE sal>(SELECT AVG( sal) FROM emp)
10、返回与SCOTT从事相同工作的员工。
SELECT
ename
FROM
emp
WHERE job=’analyst’ AND ename!=’scott’

SELECT

e1.ename
FROM
emp e1
JOIN
emp e2
ON
e1.job=e2.job
WHERE e1.job=’analyst’ and e1.ename!=’scott’
11、返回与30部门员工工资水平相同的员工姓名与工资。
SELECT
e1.ename,e1.sal
FROM
emp e1
JOIN
emp e2
ON
e1.sal=e2.sal
WHERE e2.deptno=30
12、返回工资高于30部门所有员工工资水平的员工信息。
SELECT
*
FROM
emp
WHERE
sal>(SELECT
MAX(sal)
FROM
emp
WHERE deptno=30)
13、返回部门号、部门名、部门所在位置及其每个部门的员工总数。
SELECT
dept.deptno 部门号,dept.dname 部门名,dept.loc 位置,com 员工数
FROM
(SELECT
COUNT(deptno) com,deptno
FROM
emp
GROUP BY deptno) AS t
JOIN
dept
ON
dept.deptno=t.deptno
14、返回员工的姓名、所在部门名及其工资。
SELECT
emp.ename,dept.dname,emp.sal
FROM
emp
JOIN
dept
ON
emp.deptno=dept.deptno
15、返回员工的详细信息。(包括部门名)
SELECT
emp.*,dept.dname
FROM
emp
JOIN
dept
ON
dept.deptno=emp.deptno

16、返回员工工作及其从事此工作的最低工资。(不加min返回的sal的顺序也是每组最小得值)

1、由于子查询返回的是一列数据信息,不是一个标准单量。所以使用‘=ANY’(in)进行比较
SELECT
job,sal
FROM
emp
WHERE sal in(SELECT
MIN(sal) minsal
FROM
emp
GROUP BY job)
17、返回不同部门经理的最低工资。

SELECT

deptno,MIN(sal)
FROM
(SELECT
deptno,sal
FROM
emp
WHERE job =’manager’) AS t
GROUP BY deptno
18、计算出员工的年薪,并且以年薪排序。
SELECT
ename,sal*12 年薪
FROM
emp
ORDER BY sal*12 ASC


案例三:

表: user1

+—-+———–+————+———-+

| id | user_name | over | money |
+—-+———–+————+———-+
| 1 | 唐僧 | 旃檀功德佛 | 35000.00 |
| 2 | 猪八戒 | 净坛使者 | 15000.00 |
| 3 | 孙悟空 | 斗战神佛 | 28000.00 |
| 4 | 沙僧 | 金身罗汉 | 8000.00 |
+—-+———–+————+———-+
表:user1_skills

+—-+———+——–+————-+

| id | user_id | skill | skill_level |
+—-+———+——–+————-+
| 1 | 1 | 紧箍咒 | 5 |
| 2 | 1 | 打坐 | 4 |
| 3 | 1 | 念经 | 5 |
| 4 | 1 | 变化 | 0 |
| 5 | 2 | 变化 | 4 |
| 6 | 2 | 腾云 | 3 |
| 7 | 2 | 浮水 | 5 |
| 8 | 2 | 念经 | 0 |
| 9 | 2 | 紧箍咒 | 0 |
| 10 | 3 | 变化 | 5 |
| 11 | 3 | 腾云 | 5 |
| 12 | 3 | 浮水 | 3 |
| 13 | 3 | 念经 | 2 |
| 14 | 3 | 请神 | 5 |
| 15 | 3 | 紧箍咒 | 0 |
| 16 | 4 | 变化 | 2 |
| 17 | 4 | 腾云 | 2 |
| 18 | 4 | 浮水 | 4 |
| 19 | 4 | 念经 | 1 |
| 20 | 4 | 紧箍咒 | 0 |
+—-+———+——–+————-+

表:user_kills

+—-+———+———————+———–+

| id | user_id | timestr | kills |
+—-+———+———————+————-+
| 1 | 2 | 2013-01-10 00:00:00 | 10 |
| 2 | 2 | 2013-02-01 00:00:00 | 2 |
| 3 | 2 | 2013-02-05 00:00:00 | 12 |
| 4 | 4 | 2013-01-10 00:00:00 | 3 |
| 5 | 4 | 2013-02-11 00:00:00 | 5 |
| 6 | 4 | 2013-02-06 00:00:00 | 1 |
| 7 | 3 | 2013-01-11 00:00:00 | 20 |
| 8 | 3 | 2013-02-12 00:00:00 | 10 |
| 9 | 3 | 2013-02-07 00:00:00 | 17 |
+—-+———+———————+——-+
Create Database If Not Exists test DEFAULT Character Set UTF8;
use test;

DROP TABLE IF EXISTS user1;

DROP TABLE IF EXISTS user_kills;
DROP TABLE IF EXISTS user1_skills;
DROP TABLE IF EXISTS taxRate;

CREATE TABLE IF NOT EXISTS user1 (

id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(45) NOT NULL ,
over VARCHAR(45) NOT NULL ,
money float(10,2) NOT NULL,
PRIMARY KEY(id))
DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS user_kills (

id INT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
timestr DATETIME NOT NULL,
kills INT NOT NULL ,
PRIMARY KEY(id))
DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS user1_skills (

id INT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
skill VARCHAR(45) NOT NULL,
skill_level INT NOT NULL ,
PRIMARY KEY(id))
DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS taxRate (

low float(10,2) NOT NULL,
high float(10,2) NOT NULL,
rate float(10,2) NOT NULL)
DEFAULT CHARACTER SET = utf8;

INSERT INTO user1(user_name, over, money) VALUES (

‘唐僧’, ‘旃檀功德佛’, 35000.00
),(
‘猪八戒’, ‘净坛使者’, 15000.00
),(
‘孙悟空’, ‘斗战神佛’, 28000.00
),(
‘沙僧’, ‘金身罗汉’, 8000.00
);

INSERT INTO user_kills(timestr, kills, user_id) VALUES (

‘2013-01-10 00:00:00’, 10, 2
),(
‘2013-02-01 00:00:00’, 2, 2
),(
‘2013-02-05 00:00:00’, 12, 2
),(
‘2013-01-10 00:00:00’, 3, 4
),(
‘2013-02-11 00:00:00’, 5, 4
),(
‘2013-02-06 00:00:00’, 1, 4
),(
‘2013-01-11 00:00:00’, 20, 3
),(
‘2013-02-12 00:00:00’, 10, 3
),(
‘2013-02-07 00:00:00’, 17, 3
);

INSERT INTO user1_skills(user_id, skill, skill_level) VALUES(

1, ‘紧箍咒’, 5
),(
1, ‘打坐’, 4
),(
1, ‘念经’, 5
),(
1, ‘变化’, 0
),(
2, ‘变化’, 4
),(
2, ‘腾云’, 3
),(
2, ‘浮水’, 5
),(
2, ‘念经’, 0
),(
2, ‘紧箍咒’, 0
),(
3, ‘变化’, 5
),(
3, ‘腾云’, 5
),(
3, ‘浮水’, 3
),(
3, ‘念经’, 2
),(
3, ‘请神’, 5
),(
3, ‘紧箍咒’, 0
),(
4, ‘变化’, 2
),(
4, ‘腾云’, 2
),(
4, ‘浮水’, 4
),(
4, ‘念经’, 1
),(
4, ‘紧箍咒’, 0
);

INSERT INTO taxRate(low,high,rate) VALUES(

0.00, 1500.00, 0.03
),(
1500.00, 4500.00, 0.10
),(
4500.00, 9000.00, 0.20
),(
9000.00, 35000.00, 0.25
),(
35000.00, 55000.00, 0.30
),(
55000.00, 80000.00, 0.35
),(
80000.00, 99999999.00, 0.45
);


2-2 如何在子查询中实现多列过滤

要求:查询出每个人打怪最多的一天,并显示名字,时间,打怪数量。

方法一:

SELECT a.user_name,b.timestr,kills     FROM user1 a     JOIN user_kills b ON a.id = b.user_id    JOIN (SELECT user_id,max(kills) AS cnt FROM user_kills GROUP BY user_id) c     ON b.user_id = c.user_id AND b.kills = c.cnt;

方法二:

SELECT a.user_name,b.timestr,kills     FROM user1 a    JOIN user_kills b ON a.id = b.user_id    WHERE (b.user_id,b.kills) IN (SELECT user_id,MAX(kills) FROM user_kills GROUP BY user_id);

3-2 什么是同一属性的多值过滤

要求:查询出同时具有变化和念经这两项技能的人

SELECT a.user_name,b.skill,c.skill    FROM user1 a    JOIN user1_skills b ON a.id = b.user_id    JOIN user1_skills c ON c.user_id = b.user_id    WHERE b.skill = '念经' AND c.skill = '变化' AND b.skill_level > 0 AND c.skill_level > 0;

3-3 使用关联方式实现多属性查询(一)

要求:显示有同时具有念经,变化,腾云技能的人。

+———–+——-+——-+——-+

| user_name | skill | skill | skill |
+———–+——-+——-+——-+
| 孙悟空 | 念经 | 变化 | 腾云 |
| 沙僧 | 念经 | 变化 | 腾云 |
+———–+——-+——-+——-+

SELECT a.user_name,b.skill,c.skill,d.skill     FROM user1 a    JOIN user1_skills b ON a.id = b.user_id    JOIN user1_skills c ON c.user_id = b.user_id    JOIN user1_skills d ON d.user_id = b.user_id    WHERE b.skill='念经' AND c.skill='变化' AND d.skill='腾云' AND b.skill_level>0 AND c.skill_level>0 AND d.skill_level>0;

3-4 使用关联方式实现多属性查询(二)

要求:具有4项技能里的两项以上的人。

+———–+——-+——-+——-+——-+

| user_name | skill | skill | skill | skill |
+———–+——-+——-+——-+——-+
| 猪八戒 | NULL | 变化 | 腾云 | 浮水 |
| 孙悟空 | 念经 | 变化 | 腾云 | 浮水 |
| 沙僧 | 念经 | 变化 | 腾云 | 浮水 |
+———–+——-+——-+——-+——-+

SELECT a.user_name,b.skill,c.skill,d.skill,e.skill    FROM user1 a    LEFT JOIN user1_skills b ON a.id=b.user_id AND b.skill='念经' AND b.skill_level>0    LEFT JOIN user1_skills c ON a.id=c.user_id AND c.skill='变化' AND c.skill_level>0    LEFT JOIN user1_skills d ON a.id=d.user_id AND d.skill='腾云' AND d.skill_level>0    LEFT JOIN user1_skills e ON a.id=e.user_id AND e.skill='浮水' AND e.skill_level>0    WHERE (CASE WHEN b.skill IS NOT NULL THEN 1 ELSE 0 END)         +(CASE WHEN c.skill IS NOT NULL THEN 1 ELSE 0 END)         +(CASE WHEN d.skill IS NOT NULL THEN 1 ELSE 0 END)         +(CASE WHEN e.skill IS NOT NULL THEN 1 ELSE 0 END) >= 2;

3-5 使用Group by 实现多属性查询

要求:具有4项技能里的两项以上的人。

+———–+

| user_name |
+———–+
| 孙悟空 |
| 沙僧 |
| 猪八戒 |
+———–+

SELECT a.user_name    FROM user1 a    JOIN user1_skills b ON a.id = b.user_id    WHERE b.skill IN ('念经','变化','腾云','浮水') AND b.skill_level>0    GROUP BY a.user_name HAVING COUNT(*)>=2;

转载地址:https://blog.csdn.net/qq_31770811/article/details/82229094 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Mysql数据库操作语法总结
下一篇:Redis学习笔记(1)

发表评论

最新留言

不错!
[***.144.177.141]2024年04月16日 19时48分19秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章