Linux技術--mysql數據庫練習題及答案

# mysql 練習
#### Student表的定義

| 字段名     | 字段描述 | 數據類型    | 主鍵 | 外鍵 | 非空 | 唯一 | 自增 |
| ---------- | -------- | ----------- | ---- | ---- | ---- | ---- | ---- |
| id         | 學號     | INT(10)     | 是   | 否   | 是   | 是   | 是   |
| name       | 姓名     | VARCHAR(20) | 否   | 否   | 是   | 否   | 否   |
| sex        | 性別     | VARCHAR(4)  | 否   | 否   | 否   | 否   | 否   |
| birth      | 出生年份 | YEAR        | 否   | 否   | 否   | 否   | 否   |
| department | 院系     | VARCHAR(20) | 否   | 否   | 是   | 否   | 否   |
| address    | 家庭住址 | VARCHAR(50) | 否   | 否   | 否   | 否   | 否   |

------

#### **Score表的定義**

| 字段名 | 字段描述 | 數據類型    | 主鍵 | 外鍵 | 非空 | 唯一 | 自增 |
| ------ | -------- | ----------- | ---- | ---- | ---- | ---- | ---- |
| id     | 編號     | INT(10)     | 是   | 否   | 是   | 是   | 是   |
| stu_id | 學號     | INT(10)     | 否   | 否   | 是   | 否   | 否   |
| c_name | 課程名   | VARCHAR(20) | 否   | 否   | 否   | 否   | 否   |
| grade  | 分數     | INT(10)     | 否   | 否   | 否   | 否   | 否   |

------

#### **系統初始化了以下數據**

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

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

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

```sql
INSERT INTO score VALUES(NULL,901, '計算機',98);
INSERT INTO score VALUES(NULL,901, '英語', 80);
INSERT INTO score VALUES(NULL,902, '計算機',65);
INSERT INTO score VALUES(NULL,902, '中文',88);
INSERT INTO score VALUES(NULL,903, '中文',95);
INSERT INTO score VALUES(NULL,904, '計算機',70);
INSERT INTO score VALUES(NULL,904, '英語',92);
INSERT INTO score VALUES(NULL,905, '英語',94);
INSERT INTO score VALUES(NULL,906, '計算機',90);
INSERT INTO score VALUES(NULL,906, '英語',85);
```

**1.創建student和score表語句**

```sql
-- 創建student表
CREATE TABLE student (
id int(11) AUTO_INCREMENT PRIMARY KEY,
name varchar(255) NOT NULL,
sex varchar(255) DEFAULT NULL,
birth year(4) DEFAULT NULL,
department varchar(255) NOT NULL,
address varchar(255) DEFAULT NULL
);
-- 創建score表
CREATE TABLE score (
id int(11) AUTO_INCREMENT PRIMARY KEY,
stu_id int(11) NOT NULL,
c_name varchar(255) DEFAULT NULL,
grade int(10) DEFAULT NULL
);
```

**2.查詢student表的所有記錄**

```sql
SELECT * 
FROM student;
```

**3.查詢student表的第2條到4條記錄**

```sql
SELECT *
FROM STUDENT
LIMIT 1,3;
```

**4.從student表查詢所有學生的學號(id)、姓名(name)和院系(department)的信息**

```sql
SELECT 
id AS '學號',
name AS '姓名',
department AS '院系' 
FROM student;
```

**5.從student表中查詢計算機系和英語系的學生的信息(用 IN 關鍵字)**

```sql
SELECT *
FROM student
WHERE department IN ('計算機系','英語系');
```

**6.從student表中查詢年齡18~22歲的學生信息(用 BETWEEN AND)**

```sql
SELECT * 
FROM student 
WHERE birth BETWEEN (YEAR(NOW())-22) AND (YEAR(NOW())-18);
SELECT YEAR(NOW())   查詢當前年份
SELECT MONTH(NOW())  查詢當前月份
SELECT DAY(NOW())    查詢當前日
SELECT DATE(NOW())   查詢當前日期
SELECT DATE_FORMAT(NOW(),'%Y')  查詢當前年份
```

**7.從student表中查詢每個院系有多少人**

```sql
SELECT
department AS '院系',
COUNT(*) AS '人數'
FROM student
GROUP BY department;
```

**8.從score表中查詢每個科目的最高分**

```sql
SELECT
c_name AS '科目',
MAX(grade) AS '最高分'
FROM score
GROUP BY c_name;
```

**9.查詢李四的考試科目(c_name)和考試成績(grade)**

```sql
SELECT
st.name AS '姓名',
sc.c_name AS '考試科目',
sc.grade AS '考試成績'
FROM score sc
LEFT JOIN student st ON st.id = sc.stu_id
WHERE st.name = '李四';
```

**10.用連接的方式查詢所有學生的信息和考試信息**

```sql
SELECT *
FROM student st
LEFT JOIN score sc ON st.id = sc.stu_id;
```

**11.計算每個學生的總成績**

```sql
SELECT
st.name AS '姓名',
SUM(grade) AS '總成績'
FROM student st
LEFT JOIN score sc ON st.id = sc.stu_id
GROUP BY st.name;
```

**12.計算每個考試科目的平均成績**

```sql
SELECT
c_name AS '考試科目',
AVG(grade) AS '平均成績'
FROM score
GROUP BY c_name;
```

**13.查詢計算機成績低於95的學生信息**

```sql
-- 方法一:
SELECT st.*
FROM student st
LEFT JOIN score sc ON sc.stu_id = st.id
WHERE sc.c_name = '計算機' AND sc.grade < 95;

-- 方法二:
SELECT * 
FROM student 
WHERE id IN 
(SELECT stu_id FROM score 
WHERE c_name = '計算機' AND grade < 95);
```

**14.查詢同時參加計算機和英語考試的學生的信息**

```sql
-- 方法一:
SELECT st.*
FROM student st
LEFT JOIN score sc ON sc.stu_id = st.id
WHERE c_name = '計算機' OR c_name = '英語' 
GROUP BY stu_id 
HAVING COUNT(*) = 2;

-- 方法二:
SELECT * 
FROM student
WHERE id IN 
(SELECT stu_id 
FROM score 
WHERE c_name = '計算機' OR c_name = '英語' 
GROUP BY stu_id 
HAVING COUNT(*) = 2);

-- 方法三:
SELECT *
FROM student
WHERE id = ANY
( SELECT stu_id FROM score
WHERE stu_id IN (
SELECT stu_id 
FROM score
WHERE c_name = '計算機' )AND c_name = '英語');

-- 方法四:
SELECT a.* 
FROM student a, score b, score c
WHERE a.id = b.stu_id  AND b.c_name = '計算機'
AND a.id = c.stu_id  AND c.c_name = '英語';
```

**15.將計算機考試成績按從高到低進行排序**

```sql
SELECT
c_name AS '課程名',
grade AS '分數'
FROM score
WHERE c_name = '計算機'
ORDER BY grade DESC;
```

**16.從student表和score表中查詢出學生的學號,然後合併查詢結果**

```sql
SELECT id FROM student
UNION
SELECT stu_id FROM score;
```

**17.查詢姓張或者姓王的同學的姓名、院系和考試科目及成績**

```sql
SELECT
st.name AS '姓名',
st.department AS '院系',
sc.c_name AS '考試科目',
sc.grade AS '成績'
FROM score sc
LEFT JOIN student st ON sc.stu_id = st.id
WHERE st.name LIKE '張%' OR st.name LIKE '王%';
```

**18.查詢都是湖南的學生的姓名、年齡、院系和考試科目及成績**

```sql
SELECT 
s.name AS '姓名',
YEAR(NOW())-s.birth AS '年齡',
c.c_name AS '考試科目',
c.grade AS '成績',
s.address AS '家庭住址'
FROM score AS c 
LEFT JOIN student AS s ON c.stu_id = s.id
WHERE s.address LIKE '湖南%';
```

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章