MySQL

0.数据库基础

1.启动、停止、重启mysql服务器的命令
启动:sudo service mysql start
停止:sudo service mysql stop
重启:sudo service mysql restart
2.当字段只有两个值时,如性别、是否删除,使用哪个类型
bit
3.使用命令行连接数据库服务器的命令是什么?
mysql -u 用户名 -p
回车后写密码
4.列出数据库的命令
  • 查看所有数据库

  • 使用数据库

  • 查看当前使用的数据库

  • 创建数据库

  • 删除数据库

查看所有数据库:show databases;
使用数据库:use 数据库名;
查看当前使用的数据库:select database();
创建数据库:create database 数据库名 charset=utf8;
删除数据库:drop database 数据库名;
5.创建数据库python
create database python charset=utf8;

 

6.设计班级classes表结构为id、name、isdelete,编写创建表的语句
create table classes(
id int unsigned auto_increment primary key not null,
name varchar(10),
isdelete bit default 0
);
7.列出表的命令
  • 查看当前数据库的所有表

  • 查看指定表的结构

查看当前数据库中所有表:show tables;
查看表结构:desc 表名;
8.向班级表中插入数据python1、python2、python3
insert into classes(name) values('python1'),('python2'),('python3');
9.列出数据操作语句的语法
  • 增加

  • 修改

  • 删除

  • 基本查询

增加:insert into 表名(列...) values(值...);
修改:update 表名 set 列=值,... where ...;
删除:delete from 表名 where ...;
查询:select * from 表名;

一.单表查询

1. 简单查询(难度:**)

# 创建表语句
create table students(
id int unsigned auto_increment primary key not null,
name varchar(20) not null,
chinese tinyint not null,
english tinyint not null,
math tinyint not null
);

insert into students values('张小明',89,78,90);
insert into students values(2,'李进',67,53,95);
insert into students values(3,'王五',87,78,77);
insert into students values(4,"李一",88,98,92);
insert into students values(5,"李来财",82,84,67);
insert into students values(6,"张进宝",55,85,45);
insert into students values(7,"黄蓉",75,65,30);
1) 查询表中所有学生的信息。
select * from students;
2) 查询表中所有学生的姓名和对应的英语成绩。
select name, english from students;
3) 过滤表中重复数据。
# 过滤英语成绩中的重复数据
select distinct english from students;
4) 统计每个学生的总分。
select name,sum(chinese+english+math) as "总分" from students group by name;
5) 在所有学生总分数上加10分特长分。
select name,sum(chinese+english+math+10) from students group by name;
6) 使用别名表示学生分数。
select name,sum(chinese+english+math) as "总分" from students group by name;
7) 查询姓名为李一的学生成绩
select name,sum(chinese+english+math) from students where name="李一";
8) 查询英语成绩大于90分的同学
select * from students where english > 90;
9) 查询总分大于200分的所有同学
select * from students where (english+chinese+math) > 200;
10) 查询英语分数在 80-90之间的同学。
select * from students where english between 80 and 90;
11) 查询数学分数为89,90,91的同学。
select * from students where english in (89,90,91);
12) 查询所有姓李的学生英语成绩。
select name,english from students where name like "李%";
13) 查询数学分80并且语文分80的同学。
select name from students where math = 80 and chinese = 80;
14) 查询英语80或者总分200的同学
select * from students where english =80 or (english+chinese+math) > 200;
15) 对数学成绩排序后输出。
select name,math from students order by math desc;
16) 对总分排序后输出,然后再按从高到低的顺序输出
select name,(english+math+chinese) as a from students order by a desc;
17)对姓李的学生成绩排序输出
select name,(english+math+chinese) as a from students having name like "李%" order by a desc ;

 

2. 简单查询(二)(难度:***)

1)查询总成绩最高及最低的学生信息
# 最高成绩学生信息
select * from students where (english+math+chinese) = (select max(english+chinese+math) from students);

# 最低成绩学生信息
select * from students where (english+math+chinese) = (select max(english+chinese+math) from students);
2)查询每一个学生的平均的成绩
# 求平均值,保留两位小数
select name,round((chinese+english+math)/3, 2) from students order by name;
3)查询所有学生各科的平均成绩
select round(sum(chinese)/count(*), 2),round(sum(english)/count(*), 2),round(sum(math)/count(*), 2) from students;
4)查询数学成绩比李一同学高的学生成绩
# 先求出李一的数学成绩,再查询比较
select name,math from students where math > (select math from students where name="李一");
5)列出总成绩比学生“王五”高的所有学生姓名、总成绩
# 先求出王五的总成绩,再查找比王五总成绩高的人名及成绩
select name, (chinese+english+math) from students where (chinese + english + math) > (select sum(english+chinese+math) from students where name="王五");
6)列出总成绩高于所有学生平均成绩的学生信息
# 先求出所有学生平均成绩sum(chinese+english+math)/count(*),再求出总成绩高于平均成绩的信息
select * from students where (chinese+english+math) > (select sum(chinese + english + math)/count(*) from students);

二.员工部分表

1.部门表Dept

  • 建表语句

CREATE TABLE dept  (
DEPTNO FLOAT(2) 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');  

2.员工表EMP

  • 建表语句

CREATE TABLE emp  
(EMPNO float(4)  PRIMARY KEY,  -- 员工编号
ENAME VARCHAR(10),  -- 员工姓名
JOB VARCHAR(9),  -- 员工职位
MGR float(4),  -- 员工上级工号
HIREDATE DATE,  -- 生日
SAL float(7,2),  -- 薪水
COMM float(7,2),  -- 年终奖
DEPTNO float(2) REFERENCES dept);  -- 部门号
  • 数据

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7902, 'FORD', 'ANALYST', 7566,'1981-12-02', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);

单表基础查询

1) 查询没有上级的员工全部信息(mgr是空的)
SELECT * FROM emp WHERE ISNULL(mgr);
2) 列出30号部门所有员工的姓名、薪资
SELECT ename,sal,deptno FROM emp WHERE deptno = '30';
3)  查询姓名包含 'A'的员工姓名、部门名称
SELECT ename,dname FROM emp,dept WHERE emp.DEPTNO = dept.DEPTNO AND ename LIKE "%A%";
4) 查询员工“TURNER”的员工编号和薪资
SELECT ename,empno,sal FROM emp WHERE ename = 'TURNER';
5) -- 查询薪资最高的员工编号、姓名、薪资
SELECT empno,ename,sal FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);
6) -- 查询10号部门的平均薪资、最高薪资、最低薪资
SELECT AVG(sal),MAX(sal),MIN(sal) FROM emp WHERE deptno = '10';

 

子查询

1) 列出薪金比员工“TURNER”多的所有员工姓名(ename)、员工薪资(sal)
SELECT ename,sal FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='TURNER');
2) 列出薪金高于公司平均薪金的所有员工姓名、薪金。
SELECT ename,sal FROM emp WHERE sal > (SELECT AVG(sal) FROM emp); 
3) 列出与“SCOTT”从事相同工作的所有员工姓名、工作名称(不展示Scott的姓名、工作)
SELECT ename,job FROM emp WHERE job = (SELECT job FROM emp WHERE ename = 'scott') AND ename != 'scott'; 
4) 列出薪金高于30部门最高薪金的其他部门员工姓名、薪金、部门号。
SELECT ename,sal,deptno FROM emp WHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno = '30') AND deptno != '30';
5) -- 查询薪资最高的员工编号、姓名、薪资
SELECT empno,ename,sal FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);
6) 列出薪金高于本部门平均薪金的所有员工姓名、薪资、部门号、部门平均薪资。
SELECT emp.ename,emp.sal,emp.deptno,t.avgsal FROM emp ,(SELECT deptno,AVG(sal) avgsal FROM emp GROUP BY deptno) t WHERE emp.DEPTNO = t.deptno AND emp.sal > t.avgsal;
7) 列出所有部门的详细信息:部门名称、部门编号、部门人数。
SELECT d.dname,d.deptno,IFNULL(t.num,0) '部门人数' FROM (SELECT deptno,COUNT(*) num FROM emp GROUP BY deptno) t RIGHT JOIN dept d ON t.deptno = d.deptno;
8) -- 查询出king所在部门的工作年限最大的员工名字及入职时间
SELECT ename,HIREDATE FROM emp WHERE HIREDATE = (SELECT MIN(HIREDATE) FROM emp WHERE deptno = (SELECT deptno FROM emp WHERE ename = 'king'));
9) 查询出管理员工人数最多的人的名字和他管理的人的名字
SELECT a.ename '员工',a.empno '员工编号',b.ename '领导',b.empno '领导编号' FROM emp a,emp b WHERE a.mgr = b.empno AND b.empno IN(SELECT mgr FROM emp GROUP BY mgr HAVING COUNT(*) = (SELECT COUNT(*) num FROM emp GROUP BY mgr ORDER BY num DESC LIMIT 0,1));
10) 查询出工资成本最高的部门的部门号、部门名称、部门工资成本
SELECT emp.DEPTNO,dept.DNAME,SUM(sal + IFNULL(comm,0)) total FROM emp,dept  WHERE emp.DEPTNO = dept.DEPTNO  GROUP BY emp.DEPTNO,dept.DNAME  HAVING total = (SELECT SUM(sal + IFNULL(comm,0)) total FROM emp GROUP BY deptno ORDER BY total DESC LIMIT 0,1);

自连接

1) 列出所有员工的姓名及其直接上级的姓名。
解法1:SELECT a.ename,b.ename "上级" FROM emp a LEFT JOIN emp b ON a.mgr=b.empno;
解法2:SELECT ename '员工姓名',( SELECT ename FROM emp WHERE empno = se.mgr) '上级姓名'  FROM emp se;
2) 列出受雇日期早于其直接上级的所有员工编号、员工姓名、员工入职时间、上级姓名、上级入职时间
SELECT a.empno,a.ename,a.hiredate,b.ename,b.hiredate FROM emp a,emp b WHERE a.mgr=b.empno AND a.hiredate<b.hiredate;

左右连接

1) 查询所有的部门编号及部门下员工编号、员工姓名。
SELECT d.DEPTNO,e.EMPNO,e.ENAME FROM emp e RIGHT JOIN dept d ON e.DEPTNO = d.DEPTNO;

函数应用

1) 列出最低薪金大于1500的工作名称(job)以及最低薪金
SELECT ename,sal FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='TURNER');
SELECT job,MIN(sal) msal FROM emp GROUP BY job HAVING msal > 1500;
2) 列出在每个部门工作的员工数量、平均工资
SELECT deptno '部门号',COUNT(*) '员工数量' ,AVG(sal) '平均薪资' FROM emp GROUP BY deptno;
3) -- 查询每个部门的部门号、最高薪资
SELECT deptno,MAX(sal) maxSal FROM emp GROUP BY deptno;
4) 查询每种工作的工作名称和最低工资
SELECT job,MIN(sal) '最低薪资' FROM emp GROUP BY job;
5) 列出所有员工的员工姓名、年工资,按年薪从低到高排序。
SELECT ename,(sal*12) AS yearSal FROM emp ORDER BY yearSal asc;
6) -- 查询每个部门中薪资最高的员工姓名、薪资、部门号
SELECT e.ename,e.sal,e.deptno FROM emp e,(SELECT MAX(sal) sal,deptno FROM emp GROUP BY deptno) t WHERE e.sal = t.sal AND e.DEPTNO = t.deptno;
7) -- 查询不是领导的员工编号、员工姓名、员工职位
SELECT empno,ename,job FROM emp WHERE empno NOT IN(SELECT DISTINCT IFNULL(mgr,'') FROM emp);

 

多表查询

1) 查询岗位(job)是 'CLERK' 的员工编号、员工姓名、所在部门名称
SELECT e.EMPNO,e.ENAME,d.DNAME FROM emp e,dept d WHERE e.DEPTNO = d.DEPTNO AND e.JOB = 'CLERK';
2) 列出所有员工的姓名、部门名称和工资。
SELECT emp.ENAME,dept.DNAME,emp.SAL FROM emp,dept WHERE emp.DEPTNO = dept.DEPTNO;
3) 查询至少有一个员工的部门编号、员工数量
SELECT b.deptno,COUNT(*) num FROM emp a,dept b WHERE a.deptno = b.deptno GROUP BY b.DEPTNO,b.DNAME HAVING num >=1;
4) -- 查询出没有员工的那个部门的部门编号和部门名称
SELECT deptno,dname FROM dept WHERE deptno NOT IN(SELECT DISTINCT deptno FROM emp);
5) 查询在部门“SALES”(销售部)工作的员工的姓名、部门编号
解法1:SELECT emp.ENAME,dept.DEPTNO FROM emp,dept WHERE emp.DEPTNO = dept.DEPTNO AND dept.DNAME = 'SALES';

解法2:SELECT ename,deptno FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE dname='SALES');

 

三.教师学生表

学生表Student

  • 建表语句

CREATE TABLE student (
  	sid varchar(10) NOT NULL, #(学生编号)
  	sName varchar(20) DEFAULT NULL, #(学生姓名)
  	sAge datetime DEFAULT '1980-10-12 23:12:36', #(学生出生日期)
  	sSex varchar(10) DEFAULT NULL, #(学生性别)
  	PRIMARY KEY (sid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 数据

insert  into student(sid,sName,sAge,sSex) values ('1001','张三丰','1980-10-12 23:12:36','男'),('1002','张无极','1995-10-12 23:12:36','男'),('1003','李奎','1992-10-12 23:12:36','女'),('1004','李元宝','1980-10-12 23:12:36','女'),('1005','李世明','1981-10-12 23:12:36','男'),('1006','赵六','1986-10-12 23:12:36','男'),('1007','田七','1981-10-12 23:12:36','女');

课程表 Course

  • 建表语句

CREATE TABLE course (
  cid varchar(10) NOT NULL,  #(课程id编号)
  cName varchar(10) DEFAULT NULL, #(课程名称)
  tid int(20) DEFAULT NULL,  #(课程节数)
  PRIMARY KEY (cid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 数据

insert  into course(cid,cName,tid) values ('001','企业管理',3),('002','马克思',3),('003','UML',2),('004','数据库',1),('005','英语',1);

成绩表 SC

  • 建表语句

CREATE TABLE sc (
  sid varchar(10) DEFAULT NULL,
  cid varchar(10) DEFAULT NULL,
  score int(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 数据

insert  into sc(sid,cid,score) values ('1001','001',80),('1001','002',60),('1001','003',75),('1002','001',85),('1002','002',70),('1003','004',100),('1003','001',90),('1003','002',55),('1004','002',65),('1004','003',60);

教师表 Teacher

  • 建表语句

CREATE TABLE teacher (
tid int(10) DEFAULT NULL,
tName varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 数据

insert  into teacher(tid,tName) values (1,'李老师'),(2,'何以琛'),(3,'叶平');

 

1.单表查询

1) 查询每门课程被选修的学生数
select cid,count(sid) from sc group by cid;
2) 分别查询男生、女生的数量
select sSex,count(*) from student group by sSex;
3) 查询姓“张”的学生名单
select sname from student where sname like '张%';
4) 查询同名同姓学生名单,并统计同名人数
select sname,count(*) from student group by sname having count(*) > 1;
5) 查询1981年出生的学生名单
select sid, sname  from student  where Year(sage) = 1981;
6) 查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
select cid , avg(score)  avgs  from sc group by cid order by avgs asc, cid desc;
7) 选了课程的学生人数
select count(distinct sid) as 选课人数 from sc;
8) 查询各个课程及相应的选修人数
select cid, count(cid) from sc group by cid;
9) 查询至少选修了2门课程的学生学号
select sid from sc group by sid having count(*) > 2;
10) 统计每门课程的学生选修人数(至少有2人选修的课程才统计)。要求输出课程号和选修人数
select cid ,count(*)  
from sc
group by cid having count(*) > 1
order by count(*) desc,cid asc;
11) 删除“1002”同学的“001”课程的成绩
delete from sc where sid ='1002' and cid = '001';
12) 查找“004”课程分数小于60,按分数降序排列的同学学号
select sid, score from sc where cid = '004' and score > 60 order by score desc;

 

2.子查询

1) 查询出只选修了一门课程的全部学生的学号和姓名
select sid,sname from student where sid=(select sid from sc group by sid having count(sid)=1);

 

3.自连接

1) 查询不同课程成绩相同的学生的学号、课程号、学生成绩;
select distinct sca.sid, sca.cid,scb.score
from sc as sca ,sc as scb
where sca.score=scb.score and sca.cid <>scb.cid;

 

4.多表查询

1) 查询平均成绩大于70 的所有学生的学号、姓名和平均成绩
select s.sid,s.sname,sas.avgs
from student as s,( select sid,avg(score) avgs from sc group by sid having avgs>70) sas
where s.sid=sas.sid;
2) 查询课程名称为“数据库”,且分数低于60的学生姓名和分数
select s.sid,s.sname
from sc,student as s,course as c
where sc.sid=s.sid and c.cid=sc.cid  and c.cname='数据库' and sc.score<60;
3) 查询所有学生的选课情况
select 
s.sid,s.sname,c.cid,c.cname
from sc,student as s,course as c
where sc.sid=s.sid and c.cid=sc.cid;
4) 查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
select  s.sname,c.cname,sc.score
from sc,student s,course c
where sc.sid=s.sid and c.cid=sc.cid and sc.score>70;
5) 查询有不及格的课程的课程编号,课程名称,成绩,并按课程号从大到小排列
select
sc.cid,c.cname,sc.score
from sc ,course as c
where sc.score<60 and c.cid=sc.cid
order by sc.cid desc;
6) 查询选了课程编号为003且课程成绩在70分以上的学生的学号和姓名
select s.sid,s.sname  
from sc,student s
where sc.sid=s.sid and sc.score>70 and sc.cid="003";
7) 查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
select s.sname,c.cname, sc.score 
from student as s,sc,course as c,taache'r as t
where s.sid=sc.sid and sc.cid=c.cid and c.tid=t.tid
and t.tname ='叶平'
and sc.score=(select max(score) from sc where cid = c.cid);
8) 查询两门以上不及格课程的同学的学号及其平均成绩
select sid , avg(score), count(*)
from sc where score < 60 group by sid having count(*) > 2;

四。商品信息表

1.1. 建表语句
l 商家表

CREATE TABLE shop (

shopID varchar(10) NOT NULL COMMENT '商家ID',

shopName varchar(50) DEFAULT NULL COMMENT '商家名称',

 PRIMARY KEY (shopID)

);



l 商品表

CREATE TABLE product (

pid varchar(32) NOT NULL COMMENT '商品ID',

productName varchar(32) DEFAULT NULL COMMENT '商品名称',

productPrice float DEFAULT NULL COMMENT '商品价格',

storeNum int(11) DEFAULT NULL COMMENT '库存数量',

factory varchar(20) DEFAULT NULL COMMENT '厂家',

shopID varchar(10) DEFAULT NULL COMMENT '商家ID',

 PRIMARY KEY (pid),

 KEY shop_product (shopID),

 CONSTRAINT shop_product FOREIGN KEY (shopID) REFERENCES shop (shopID)

);



l 订单表

CREATE TABLE order_ (

oid varchar(32) NOT NULL COMMENT '订单ID',

shopID varchar(30) DEFAULT NULL COMMENT '商家ID',

orderStatus varchar(4) DEFAULT NULL COMMENT '订单状态',

orderTime datetime DEFAULT NULL COMMENT '订单时间',

 PRIMARY KEY (oid),

 KEY shop_order (shopID),

 CONSTRAINT shop_order FOREIGN KEY (shopID) REFERENCES shop (shopID)

);



l 订单商品中间表 - 订单项

CREATE TABLE order_item (

oid varchar(32) NOT NULL COMMENT '订单ID',

pid varchar(32) NOT NULL COMMENT '商品ID',

num int(11) DEFAULT NULL COMMENT '购买数量',

price float DEFAULT NULL COMMENT '小计价格',

 PRIMARY KEY (oid,pid),

 KEY it_product (pid),

 CONSTRAINT it_order FOREIGN KEY (oid) REFERENCES order_ (oid),

 CONSTRAINT it_product FOREIGN KEY (pid) REFERENCES product (pid)

);

 

1.2. 数据
insert  into shop(shopID,shopName) values ('s01','天马优品'),('s02','清华紫光'),('s03','乐购数码'),('s04','尚豪生活馆'),('s05','大鲜水果');



Insert into product(pid,productName,productPrice,storeNum,factory,shopID) values ('p1','机械师Mini20book',7000,50,'机械师','s01'),('p10','book联想',1500,30,'联想','s02'),('p2','APPLE苹果IMAC',1500,20,'苹果','s01'),('p3','笔记本k3机械师',1500,150,'机械师','s01'),('p4','APPLE Mini20',6000,50,'苹果','s02'),('p5','苹果macbook',7000,60,'苹果','s02'),('P6','联想拯救者',2000,60,'联想','s03'),('p7','联想台式机',2000,10,'联想','s03'),('p8','机械师book',3999,50,'机械师','s02'),('p9','机械师book',7299,20,'机械师','s03');



insert  into order_(oid,shopID,orderStatus,orderTime) values ('o1','s01','支付完成','2019-03-16 18:29:09'),('o2','s02','支付完成','2019-03-22 19:09:56'),('o3','s03','支付完成','2019-03-22 22:31:27'),('o4','s02','待支付','2019-03-22 08:10:22'),('o5','s03','待支付','2019-04-01 12:01:30'),('o6','s02','待支付','2019-04-25 19:12:26');



insert into order_item(oid,pid,num,price) values ('o1','p3',2,2600),('o1','p5',1,7000),('o2','p3',1,1500),('o3','p3',3,3900),('o3','p4',1,6000),('o3','p5',1,7000),('o4','p1',2,15000),('o4','p3',1,1500),('o5','p5',1,7000),('o6','p7',3,6000);

 

2. 查询要求

2.1. 商品表、商品表查询

 

1) -- 查询商品单价大于等于6000,并且商品名称包含“Mini20”的商品

答案:SELECT * FROM product WHERE productPrice >= 6000 AND productName LIKE "%Mini20%"; 
2) -- 查询商品单价大于等于2000并且小于等于7000的商品

答案:SELECT * FROM product WHERE productPrice >= 2000 AND productPrice <=7000 ;
3) -- 查询商品名称是”机械师book”的商品名称、平均价格以及最高价格。

 

答案:SELECT productName,MAX(productPrice) "最高价格",avg(productPrice)"平均价格" FROM product WHERE productName ="机械师book";
4) -- 查询商品数量大于3的商家编号、商品数量

答案:SELECT shopID,COUNT(shopID) "商品数量" FROM product GROUP BY shopID HAVING COUNT(shopID) > 3;
5) -- 查询商品单价大于2000的商品名称、商品价格,并按商品单价降序排序

答案:SELECT productName,productPrice 

FROM product

WHERE productPrice > 2000

ORDER BY productPrice DESC;

 

6) -- 查询商品价格大于等于2000并且数量大于1的厂家名称、商品总数量,并按商品总数量降序排序。

答案:SELECT factory,COUNT(*) num

FROM product

WHERE productPrice >= 2000

GROUP BY factory

HAVING num > 1

ORDER BY num DESC ;

 

双表查询
7) -- 查询商家”清华紫光”的所有商品

答案:SELECT p.*

FROM shop s,product p

WHERE s.shopID = p.shopID

AND s.shopName = "清华紫光";

 

8) -- 查询”苹果macbook”所属商家的商品数量、商品平均价格

 

答案:SELECT MAX(s.shopName),COUNT(productName) "商品数量",AVG(p.productPrice) "平均价格"

FROM shop s,product p

WHERE s.shopID = p.shopID

AND p.shopID = (SELECT shopID FROM product WHERE productName = "苹果macbook");

 

2.2. 多表查询

9) -- 查询商家"清华紫光"所有订单中的商品ID,去除重复的商品ID并展示

答案:SELECT DISTINCT pid 

FROM shop s,order_ o,order_item i

WHERE s.shopID = o.shopID AND o.oid = i.oid

AND s.shopName = "清华紫光"

 

10) -- 查询商家"清华紫光"的每个待支付状态的订单总金额

答案:

SELECT o.oid,SUM(i.price) "总金额"

FROM shop s,order_ o,order_item i

WHERE s.shopID = o.shopID AND o.oid = i.oid

AND o.orderStatus = "待支付" AND s.shopName = "清华紫光"

GROUP BY o.oid

 

五。文章评论表

1.1建表语句

l 用户表

CREATE TABLE user (

id int(10) NOT NULL AUTO_INCREMENT COMMENT '用户ID',

nick_name varchar(32) NOT NULL COMMENT '用户昵称',

gender enum('MAN','WOMAN') DEFAULT NULL COMMENT '用户性别',

 PRIMARY KEY (id),

 UNIQUE KEY nick_name (nick_name)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;



l 文章表

CREATE TABLE article (

id int(10) NOT NULL AUTO_INCREMENT COMMENT '文章ID',

title varchar(256) NOT NULL COMMENT '文章标题',

content text NOT NULL COMMENT '文章内容',

comments int(11) DEFAULT NULL COMMENT '文章被评论次数',

 status int(11) DEFAULT NULL COMMENT '审核状态,0审核通过,1审核中,-1审核未通过',

create_time datetime DEFAULT NULL COMMENT '文章创建时间',

 PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;



l 评论表

CREATE TABLE comment (

id int(10) NOT NULL AUTO_INCREMENT COMMENT '评论表ID',

user_id int(10) NOT NULL COMMENT '用户ID,用户表id',

article_id int(10) NOT NULL COMMENT '文章ID,文章表id',

content text NOT NULL COMMENT '评论内容',

create_time datetime DEFAULT NULL COMMENT '评论时间',

 PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

1.2. 数据

1、user表数据

INSERT INTO user VALUES ('1', '张美娜', 'WOMAN'), ('2', '王专德', 'MAN'), ('3', '李大强', 'MAN'), ('4', '舒小红', 'WOMAN'), ('5', '冯刚', 'MAN');



2、article表数据

INSERT INTO article VALUES ('1', '中国科技', '科技兴国,中国崛起依靠大家努力', '2', '0', '2018-01-17 16:31:45'), ('2', '我的科技', '我的科技兴国之路', '2', '0', '2019-02-20 08:22:20'), ('3', '编程高手需具备什么素质', '编程对于学生的要求是比较高的。“要求学生有较强的数学能力。同时,学生的综合能力也要比较强,比如英语水平、语文水平。拿语文水平来说,编程的题目是很难的,如果语文不好,甚至有可能连题目都读不懂。”', '3', '0', '2019-07-20 11:30:40'), ('4', '黄金欧盘必读', '周三下午欧市开盘前夕,现货黄金由涨转跌,当前在1335美元附近,较日内高点下挫10美元左右。欧洲央行副行长称不会立即改变前瞻指引,通胀仍不及预期,欧元/美元短线走低,美元指数当前上涨0.28%,打压金价。', '0', '1', '2019-06-21 10:28:12'), ('5', '数字货币继续血流成河', '1月17日比特币延续了前几日的跌势,并且数字货币血流成河的状况也在持续,跌幅基本保持着两位数。近期全球市场对比特币的监管力度都有所加大。', '1', '0', '2019-07-22 09:32:27');



3、comment表数据

INSERT INTO comment VALUES ('1', '1', '2', '非常棒,科技兴国', '2019-02-21 10:14:20'), ('2', '4', '2', '赞一个', '2019-02-21 12:14:20'), ('3', '2', '1', '中国加油', '2018-02-15 10:14:20'), ('4', '3', '5', '数字货币终结', '2019-07-23 10:14:20'), ('5', '3', '3', '编程成就梦想', '2019-07-25 12:14:20'), ('6', '4', '1', '中国棒', '2018-02-11 10:14:20'), ('7', '4', '3', '赞', '2019-07-21 10:14:20'), ('8', '1', '3', '成为编程高手', '2019-07-21 10:15:20'), ('9', '3', '5', '数字', '2019-07-23 15:51:54'), ('10', '2', '2', '棒棒哒', '2019-03-23 16:38:03');

 

2. 查询要求

2.1. 用户表、评论表查询
11) -- 查询审核通过的文章总数量

答案:SELECT COUNT(id) FROM article WHERE status=0;
12) -- 查询标题包含“科技”的文章所有信息

 

答案:SELECT * FROM article WHERE title LIKE "%科技%";
13) -- 查询发布时间在2018年1月份的文章总数量

答案:SELECT * FROM article WHERE YEAR(create_time)=2018 AND MONTH(create_time) =1;
14) -- 查询评论数量大于2的文章标题、发布时间和评论数量

答案:SELECT title, create_time, comments FROM article WHERE comments>2;

 

15) -- 查询2019年评论文章的总人数

 

答案:SELECT COUNT(DISTINCT(user_id)) FROM comment WHERE YEAR(create_time) = 2019;

 

双表查询

16) -- 查询昵称为“李大强”参与评论的所有文章id(id去重)

答案:
SELECT DISTINCT(c.article_id)from comment as c LEFT JOIN user as u ON u.id=c.user_id WHERE u.nick_name = '李大强';

 

17) -- 查询从未参与文章评论的用户id和用户昵称

答案:SELECT id, nick_name FROM user WHERE id not in(SELECT DISTINCT(user_id) FROM comment);
18) -- 查询有评论的所有文章标题和文章id(id去重),并且根据id降序排列

答案:
SELECT a.id,a.title FROM article as a RIGHT JOIN comment as c ON c.article_id = a.id GROUP BY c.article_id ORDER BY c.article_id DESC;
19) -- 查询同时评论过文章id为2和3的女性(WOMAN)用户的所有信息

答案:
SELECT * FROM user WHERE gender="WOMAN" AND id in((SELECT user_id FROM comment WHERE user_id in(SELECT user_id FROM comment WHERE article_id=3) and article_id =2));

3.2. 多表查询

20) 查询评论过标题为“中国科技” 文章的所有用户昵称、用户性别和用户id和评论内容

答案:
SELECT nick_name, gender, id from user WHERE id in(SELECT user_id from comment WHERE article_id in(SELECT id FROM article where title = "中国科技"));

 

posted @ 2020-04-08 22:37  老李~  阅读(253)  评论(0)    收藏  举报