我是從別的博主抄來的題,算不上面試題,但是基本上涵蓋了查詢所需要的方法。包括多表查詢等
原博地址:http://blog.sina.com.cn/s/blog_767d65530101861c.html
雖然比較老,但是知識是不變的。
下面貼出我的答案,與原博的不一樣,但是也能實(shí)現(xiàn)結(jié)果。(題目需要查看原博,從最基本的SQL語句建表開始)
//創(chuàng)建學(xué)生表
create table student (
id int(10) not null PRIMARY key ,
name varchar(50) not null ,
age int(10) not null ,
sex varchar(4),
BirthDay YEAR ,
Deptment VARCHAR(20) not NULL,
Address varchar(50)
)
//創(chuàng)建score成績表
create table Sorce(
id int(10) not NULL UNIQUE PRIMARY KEY auto_increment,
Stu_id INT(10) NOT NULL ,
C_name VARCHAR(20),
Grade INT(10)
)
插入數(shù)據(jù)
#插入數(shù)據(jù)項(xiàng)數(shù)據(jù)庫
INSERT INTO student VALUES( 901,'張老大', 20,'男',1985,'計(jì)算機(jī)系', '北京市海淀區(qū)');
INSERT INTO student VALUES( 902,'張老二', 21,'男',1986,'中文系', '北京市昌平區(qū)');
INSERT INTO student VALUES( 903,'張三',22, '女',1990,'中文系', '湖南省永州市');
INSERT INTO student VALUES( 904,'李四',23, '男',1990,'英語系', '遼寧省阜新市');
INSERT INTO student VALUES( 905,'王五',21, '女',1991,'英語系', '福建省廈門市');
INSERT INTO student VALUES( 906,'王六', 22,'男',1988,'計(jì)算機(jī)系', '湖南省衡陽市');
#項(xiàng)source表中填入數(shù)據(jù)
INSERT INTO score VALUES(NULL,901, '計(jì)算機(jī)',98);
INSERT INTO score VALUES(NULL,901, '英語', 80);
INSERT INTO score VALUES(NULL,902, '計(jì)算機(jī)',65);
INSERT INTO score VALUES(NULL,902, '中文',88);
INSERT INTO score VALUES(NULL,903, '中文',95);
INSERT INTO score VALUES(NULL,904, '計(jì)算機(jī)',70);
INSERT INTO score VALUES(NULL,904, '英語',92);
INSERT INTO score VALUES(NULL,905, '英語',94);
INSERT INTO score VALUES(NULL,906, '計(jì)算機(jī)',90);
INSERT INTO score VALUES(NULL,906, '英語',85);
答案如下:
#查詢student表的所有記錄
select * from student
#查詢score表的所有記錄
SELECT * from score
#查詢student表的第2條到4條記錄
SELECT * from student LIMIT 1,3
#查詢score表的第2條到4條記錄
SELECT * from score LIMIT 4,2
#查詢score表的第6條到8條記錄
SELECT * from score LIMIT 5,3
#從student表查詢所有學(xué)生的學(xué)號(id)、姓名(name)和院系(department)的信息\
SELECT id,name,Deptment from student
#從student表中查詢計(jì)算機(jī)系和英語系的學(xué)生的信息
錯誤的:SELECT * from student where Deptment='計(jì)算機(jī)系' and Deptment='英語系'
select * from student where Deptment in('計(jì)算機(jī)系','英語系')
#從student表中查詢年齡18~22歲的學(xué)生信息(havaing 語句的使用表示的是先分組再進(jìn)行篩選 往往和 GROUP BY 聯(lián)合使用)
SELECT * from student GROUP BY age HAVING 18<age<22
SELECT id,name,2013-BirthDay as age ,Deptment,Address from student where 2013-BirthDay BETWEEN 18 AND 22
#從student表中查詢每個院系有多少人
SELECT Deptment ,count(id) from student GROUP BY Deptment
#從score表中查詢每個科目的最高分
SELECT C_name,MAX(Grade) from score GROUP BY C_name
下面的比較復(fù)雜也是本篇的核心,讀者可以對比原博客的寫法進(jìn)行學(xué)習(xí)。
#.查詢李四的考試科目(c_name)和考試成績(grade)
SELECT c_name,grade FROM score INNER JOIN (SELECT * FROM student WHERE name='李四')a ON a.id=score.Stu_id
SELECT id from student where name='李四'
SELECT c_name,grade FROM score where Stu_id(SELECT id from student where name='李四')
#$用連接的方式查詢所有學(xué)生的信息和考試信息
SELECT name,sex,BirthDay,Deptment,Address ,C_name ,Grade from student,score where student.id=score.Stu_id
#12.計(jì)算每個學(xué)生的總成績
SELECT student.id,name,SUM(Grade) from student,score WHERE student.id=score.Stu_id GROUP BY id
#13.計(jì)算每個考試科目的平均成績
SELECT C_name,AVG(Grade) FROM score GROUP BY C_name
#14.查詢計(jì)算機(jī)成績低于95的學(xué)生信息
SELECT * from student where Deptment ='計(jì)算機(jī)系' INNER JOIN
(SELECT * from score where C_name='計(jì)算機(jī)' and Grade < 95)a on student.id = a.Stu_id
正確:
select * from student where id in (SELECT Stu_id from score where C_name="計(jì)算機(jī)" and grade<95)
#15.查詢同時參加計(jì)算機(jī)和英語考試的學(xué)生的信息
SELECT * from student where
(SELECT Stu_id FROM score where C_name="計(jì)算機(jī)" AND C_name="英語")
SELECT Stu_id FROM score where C_name="計(jì)算機(jī)" AND C_name="英語"
SELECT * from student INNER JOIN
(SELECT Stu_id FROM score where C_name="英語" )a INNER JOIN ON student.id=a.Stu_id
(SELECT Stu_id FROM score where C_name="計(jì)算機(jī)")b ON student.id=a.Stu_id=b.Stu_id
SELECT Stu_id from score where C_name="計(jì)算機(jī)"
###############上面的是錯誤的
#第一步:
SELECT * from score where Stu_id in (SELECT Stu_id from score where C_name="計(jì)算機(jī)") AND C_name="英語"
#(重疊式的,先滿足一個條件,再將這個條件嵌套在另外一個條件中充當(dāng)元素)
#第二步:
SELECT student.id,name,sex,BirthDay,Deptment,Address from student INNER JOIN (SELECT * from score where Stu_id in
(SELECT Stu_id from score where C_name="計(jì)算機(jī)") AND C_name="英語")a ON student.id=a.Stu_id
#16.將計(jì)算機(jī)考試成績,按從高到低進(jìn)行排序
SELECT Stu_id,Grade from score where C_name="計(jì)算機(jī)" ORDER BY Grade DESC
#17.從student表和score表中查詢出學(xué)生的學(xué)號,然后合并查詢結(jié)果(考察union 聯(lián)合查詢合并重復(fù))
SELECT id from student
union
SELECT Stu_id from score
#18.查詢姓張或者姓王的同學(xué)的姓名、院系和考試科目及成績
#正確:
SELECT student.id,name,Deptment,C_name,Grade from student,score where (name like '王%' OR name like '張%') AND student.id=score.Stu_id
select student.id,name,Deptment,C_name,Grade from student,score where (name like '王%' OR name like '張%') and student.id= score.Stu_id
#19.查詢都是湖南的學(xué)生的姓名、年齡、院系和考試科目及成績
select a.name ,a.age,a.Deptment,C_name,Grade from score INNER JOIN
(SELECT * from student where Address LIKE '%湖南%' )a on a.id=score.Stu_id
半吊子初學(xué)并稍微學(xué)有所成,誠心招各位學(xué)友學(xué)習(xí)一起走向架構(gòu)師。
飛向架構(gòu)師交流群:264698630