思路:
1、根据提问或者需求分析想要的结果是什么
Select XXXXX
2、确定想要得到XXXXX的话需要涉及到哪些表
Select XXX from YYYY
3、分析是否需要条件 where > ,< ,= ,<> , >=, <=,in,between,and,or
Select XXX from YYY where ZZZZ
4、是否需要函数
时间函数,数学函数
5、分组
看到(“每个??”)一般情况下都需要group by.
6、如果想要的结果不能一步到位
需要多个步骤的,那么此时我们使用的就是子查询,子查询我们可以按照单个步骤进行查询,然后把多个步骤组装起来
7、表连接,关联查询,联合查询。
明显特征:结果集中的列涉及到多张表。表连接去除笛卡尔积中的错误数据
1.需求2.表格3.条件4.函数5.分组6.步骤7.关联
问题:
1.创建student和score表
2.为student表和score表增加记录
3.查询student表的所有记录
4.查询student表的第2条到4条记录
5.从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息
6.从student表中查询计算机系和英语系的学生的信息
7.从student表中查询年龄18~35岁的学生信息
8.查询每个院系有多少人
9.查询每个科目的最高分
10.查询李四的考试科目(c_name)和考试成绩(grade)
11.所有学生的信息和考试信息
12.计算每个学生的总成绩
13.计算每个考试科目的平均成绩
14.查询计算机成绩低于95的学生信息
15.查询同时参加计算机和英语考试的学生的信息
16.将计算机考试成绩按从高到低进行排序
17.查询姓张或者姓王的同学的姓名、院系和考试科目及成绩
18.查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩
Mysql练习 (select)
------学生资料与成绩查询
1.创建student和score表
DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL, `sex` char(20) DEFAULT NULL, `birth` year(4) DEFAULT NULL, `department` char(10) DEFAULT NULL, `address` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
创建score表。SQL代码如下:
DROP TABLE IF EXISTS `score`; CREATE TABLE `score` ( `id` int(10) NOT NULL AUTO_INCREMENT, `stu_id` int(10) NOT NULL, `c_name` char(20) DEFAULT NULL, `grade` int(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `score_ibfk_1` (`stu_id`), CONSTRAINT `score_ibfk_1` FOREIGN KEY (`stu_id`) REFERENCES `student` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
2.为student表和score表增加记录
向student表插入记录的INSERT语句如下:
insert into `student`(`id`,`name`,`sex`,`birth`,`department`,`address`) values (1,'张老大','男',1985,'计算机系','北京市海淀区'); insert into `student`(`id`,`name`,`sex`,`birth`,`department`,`address`) values (2,'张老二','男',1986,'中文系','北京市昌平区'); insert into `student`(`id`,`name`,`sex`,`birth`,`department`,`address`) values (3,'张三','女',1990,'中文系','湖南省永州市'); insert into `student`(`id`,`name`,`sex`,`birth`,`department`,`address`) values (4,'李四','男',1990,'英语系','辽宁省阜新市'); insert into `student`(`id`,`name`,`sex`,`birth`,`department`,`address`) values (5,'王五','女',1991,'英语系','福建省厦门市'); insert into `student`(`id`,`name`,`sex`,`birth`,`department`,`address`) values (6,'王六','男',1988,'计算机系','湖南省衡阳市');
向score表插入记录的INSERT语句如下:
insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (1,1,'计算机',98); insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (2,1,'英语',80); insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (3,2,'计算机',65); insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (4,2,'中文',88); insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (5,3,'中文',95); insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (6,3,'计算机',70); insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (7,4,'计算机',70); insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (8,4,'英语',92); insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (9,5,'英语',94); insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (10,5,'计算机',90); insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (11,6,'计算机',90); insert into `score`(`id`,`stu_id`,`c_name`,`grade`) values (12,6,'英语',85);
3.查询student表的所有记录
SELECT * FROM student;
4.查询student表的第2条到4条记录
SELECT * FROM student LIMIT 1,3;
5.从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息
SELECT id,NAME,department FROM student;
6.从student表中查询计算机系和英语系的学生的信息
SELECT * FROM student WHERE department IN('计算机系','英语系');
7.从student表中查询年龄在18~35岁的学生信息
SELECT * FROM student WHERE YEAR(NOW())-birth BETWEEN 18 AND 35;
8.查询每个院系有多少人
SELECT department,COUNT(department) counts FROM student GROUP BY department;
9.查询每个科目的最高分
SELECT c_name,MAX(grade) maxgrade FROM score GROUP BY c_name;
10.查询李四的考试科目(c_name)和考试成绩(grade)
SELECT c_name,grade FROM score WHERE stu_id =(SELECT id FROM student WHERE NAME='李四');
11.所有学生的信息和考试信息
SELECT * FROM student s,score sc WHERE s.`id`=sc.`stu_id`; SELECT s.`id`,NAME,sex,birth,department,address,grade FROM student s,score sc WHERE s.`id`=sc.`s
12.计算每个学生的总成绩
SELECT NAME,SUM(grade) FROM student s,score sc WHERE s.`id`=sc.`stu_id` GROUP BY NAME;
13.计算每个考试科目的平均成绩
计算每个学生的平均成绩???
SELECT c_name,AVG(grade) FROM score GROUP BY c_name;
14.查询计算机成绩低于95的学生信息
SELECT * FROM student WHERE id IN(SELECT stu_id FROM score WHERE c_name='计算机' AND grade<
15.查询每个学科的平均成绩
SELECT c_name,AVG(grade) FROM score GROUP BY c_name;
16.将计算机考试成绩降序排列
SELECT c_name,grade FROM score WHERE c_name='计算机' ORDER BY grade DESC;
17.查询姓张或者姓王的同学的姓名、院系和考试科目及成绩
SELECT NAME,department,c_name,grade FROM student s,score sc WHERE s.`id`=sc.stu_id AND N
18.查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩
SELECT NAME,address,YEAR(NOW())-birth,department,c_name,grade FROM student INNER JOIN sc
19.查询出每门课程都大于80分的学生姓名
类似于这个题目:查询所有成绩都及格的学生
SELECT st.`name`,MIN(s.grade) mi FROM student st LEFT JOIN score s ON s.`stu_id`=st.`id` GROUP BY st.`name` HAVING mi>80;
20.查询平均分最高的科目名字
SELECT c_name,MAX(avgs.av) FROM (SELECT AVG(grade) AS av,c_name FROM score GROUP BY c_name) AS avgs
21.查询语文成绩比张三高的学生的信息
提示:
先查询张三的语文成绩;
再查询语文成绩成绩大于a的学生信息;
SELECT * FROM student st LEFT JOIN score s ON s.`stu_id`=st.`id` WHERE s.c_name="中文" AND s.grade > (SELECT s.grade FROM student st LEFT JOIN score s ON s.`stu_id`=st.`id` WHERE s.c_name="中文" AND st.name="张三")
22.查询同时参加计算机和英语考试的学生的信息
SELECT * FROM student WHERE id IN ( SELECT stu_id FROM score WHERE c_name='计算机' AND stu_id IN ( SELECT stu_id FROM score WHERE c_name ='英语' ))
23.有如下三个表:
DROP TABLE IF EXISTS `project`; CREATE TABLE `project` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `contract`; CREATE TABLE `contract` ( `id` int(11) NOT NULL AUTO_INCREMENT, `project_id` int(5) DEFAULT NULL, `money` int(5) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `pay`; CREATE TABLE `pay` ( `id` int(5) NOT NULL AUTO_INCREMENT, `contract_id` int(5) DEFAULT NULL, `money` int(5) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
插入数据:
insert into `project`(`id`,`name`) values (1,'Java'),(2,'C语言'); insert into `contract`(`id`,`project_id`,`money`) values (1,1,10),(2,1,10),(3,2,10),(4,2,10); insert into `pay`(`id`,`contract_id`,`money`) values (1,1,10),(2,1,10),(3,2,10),(4,2,10),(5,3,10),(6,3,10),(7,4,10),(8,4,10);
一个项目有多个合同,每个合同会分几次付款;
1.查询各个项目的合同总金额
SELECT p.name,SUM(c.money) FROM project p LEFT JOIN contract c ON p.id =c.project_id GROUP BY p.name
2.查询id为1的项目所有已经付款的记录
SELECT c.id contract_id,p.id pay_id,p.money FROM contract c, pay p WHERE c.id = p.contract_id AND c.project_id =1
或者:
SELECT p.id project_id,c.id contract_id,py.id pay_id,py.money FROM project p LEFT JOIN contract c LEFT JOIN pay py ON c.id=py.contract_id ON p.id =c.project_id WHERE p.id=1
3.查询所有已经有付款记录的合同及对应的项目
SELECT * FROM project p, contract c WHERE c.project_id = p.id AND c.id IN (SELECT contract_id FROM pay)