《資料庫》基礎題一:兩表相關查詢

金凝橡炙發表於2017-10-30

題目

這裡寫圖片描述

系統初始了以下指令碼資料

向student表插入記錄的INSERT語句如下:

INSERT  INTO t_student  VALUES( 901,'張老大','男',1985,'計算機系','北京市海淀區'); 
INSERT  INTO t_student  VALUES( 902,'張老二','男',1986,'中文系','北京市昌平區'); 
INSERT  INTO t_student  VALUES( 903,'張三','女',1990,'中文系','湖南省永州市'); 
INSERT  INTO t_student  VALUES( 904,'李四','男',1990,'英語系','遼寧省阜新市'); 
INSERT  INTO t_student  VALUES( 905,'王五','女',1991,'英語系','福建省廈門市'); 
INSERT  INTO t_student  VALUES( 906,'王六','男',1988,'計算機系','湖南省衡陽市');

向score表插入記錄的INSERT語句如下:

INSERT  INTO    t-score VALUES(NULL,901,'計算機',98);
INSERT  INTO    t-score VALUES(NULL,901,'英語',80);
INSERT  INTO    t-score VALUES(NULL,902,'中文',88); 
INSERT  INTO    t-score VALUES(NULL,904,'計算機',70); 
INSERT  INTO    t-score VALUES(NULL,904,'英語',92);
INSERT  INTO    t-score VALUES(NULL,905,'英語',94); 
INSERT  INTO    t-score VALUES(NULL,906,'英語',85);

題目及相關程式碼

-- 建立student和score表語句 
DROP TABLE IF EXISTS t_student;
CREATE TABLE t_student(
    id INT(10) AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(200) NOT NULL,
    sex VARCHAR(4), 
    birth YEAR,
    department varchar(20) NOT NULL,
    address VARCHAR(50)
);

DROP TABLE IF EXISTS t_score;
CREATE TABLE t_score(
    id INT(10) AUTO_INCREMENT PRIMARY KEY,
    stu_id INT(10) NOT NULL,
    c_name VARCHAR(20),
    grade INT(10)
);

-- 向student表插入記錄的insert語句如下:
INSERT INTO t_student VALUES(901,'張老大','男',1985,'計算機系','北京市海淀區');
INSERT INTO t_student VALUES( 902,'張老二', '男',1986,'中文系', '北京市昌平區');
INSERT INTO t_student VALUES( 903,'張三', '女',1990,'中文系', '湖南省永州市');
INSERT INTO t_student VALUES( 904,'李四', '男',1990,'英語系', '遼寧省阜新市');
INSERT INTO t_student VALUES( 905,'王五', '女',1991,'英語系', '福建省廈門市');
INSERT INTO t_student VALUES( 906,'王六', '男',1988,'計算機系', '湖南省衡陽市');

-- 向score表插入記錄的INSERT語句如下:
INSERT INTO t_score VALUES(NULL,901, '計算機',98);
INSERT INTO t_score VALUES(NULL,901, '英語', 80);
INSERT INTO t_score VALUES(NULL,902, '計算機',65);
INSERT INTO t_score VALUES(NULL,902, '中文',88);
INSERT INTO t_score VALUES(NULL,903, '中文',95);
INSERT INTO t_score VALUES(NULL,904, '計算機',70);
INSERT INTO t_score VALUES(NULL,904, '英語',92);
INSERT INTO t_score VALUES(NULL,905, '英語',94);
INSERT INTO t_score VALUES(NULL,906, '計算機',90);
INSERT INTO t_score VALUES(NULL,906, '英語',85);

-- 查詢student表的所有記錄 
SELECT * FROM t_student;
-- 查詢student表的第2條到4條記錄 
SELECT * FROM t_student LIMIT 1,3;
-- 從student表查詢所有學生的學號(id)、姓名(name)和院系(department)的資訊 
SELECT id,name,department FROM t_student;
-- 從student表中查詢計算機系和英語系的學生的資訊(用 IN 關鍵字)
SELECT * FROM t_student WHERE department in ('計算機系','英語系'); 
-- 從student表中查詢年齡18~22歲的學生資訊(用 BETWEEN AND) 
SELECT * FROM t_student 
#WHERE (DATE_FORMAT(NOW(), '%Y') - birth)
WHERE (YEAR(NOW()) - birth)
BETWEEN 18 AND 42;
-- 從student表中查詢每個院系有多少人
SELECT department,COUNT(*)
FROM t_student
GROUP BY department;
-- 從score表中查詢每個科目的最高分 
SELECT s.c_name,MAX(s.grade)
FROM t_score AS s
WHERE s.c_name IS NOT NULL
GROUP BY s.c_name;
-- 查詢李四的考試科目(c_name)和考試成績(grade) 
SELECT s.`name`,e.c_name,e.grade
FROM t_score AS e
LEFT JOIN t_student AS s
ON e.stu_id = s.id
WHERE s.name = '李四';
-- 用連線的方式查詢所有學生的資訊和考試資訊 
SELECT * 
FROM t_score AS e
LEFT JOIN t_student AS s
ON e.stu_id = s.id;
-- 計算每個學生的總成績 
SELECT stu_id,SUM(grade)
FROM t_score
GROUP BY stu_id;
-- 計算每個考試科目的平均成績 
SELECT c_name,AVG(grade)
FROM t_score
WHERE c_name IS NOT NULL
GROUP BY c_name;
-- 查詢計算機成績低於95的學生資訊 
SELECT*
FROM t_score AS e
LEFT JOIN t_student AS s
ON e.stu_id = s.id
WHERE e.c_name = '計算機'
AND e.grade < 95;
#方法二 考試科目沒有唯一性約束(可能存在補考,即同一個學生補考了兩次)
SELECT * 
FROM t_student
WHERE id IN
(SELECT stu_id FROM t_score
WHERE c_name = '計算機' AND grade < 95);
-- 查詢同時參加計算機和英語考試的學生的資訊
SELECT * FROM t_student WHERE id = ANY
(
    SELECT stu_id FROM t_score 
    WHERE stu_id IN(SELECT stu_id FROM t_score WHERE c_name = '計算機') AND c_name = '英語'
); 
#方法二:
SELECT a.*
FROM t_student a,t_score b, t_score c
WHERE a.id = b.stu_id
AND b.c_name = '計算機'
AND a.id = c.stu_id
AND c.c_name = '英語';
-- 將計算機考試成績按從高到低進行排序 
SELECT s.name,e.*
FROM t_score AS e
LEFT JOIN t_student AS s
ON e.stu_id = s.id
WHERE c_name = '計算機'
ORDER BY grade DESC;
-- 從student表和score表中查詢出學生的學號,然後合併查詢結果 
SELECT s.id FROM t_student AS s
UNION 
SELECT e.stu_id FROM t_score AS e;
-- 查詢姓張或者姓王的同學的姓名、院系和考試科目及成績 
SELECT s.name,s.department,e.c_name,e.grade
FROM t_score AS e
LEFT JOIN t_student AS s
ON e.stu_id = s.id
WHERE s.name LIKE '王%' OR s.name LIKE '張%';
-- 查詢都是湖南的學生的姓名、年齡、院系和考試科目及成績
SELECT s.name,(year(NOW()) - s.birth) AS age,s.department,e.c_name,e.grade
FROM t_score AS e
LEFT JOIN t_student AS s
ON e.stu_id = s.id
WHERE s.address LIKE '%湖南%';

相關文章