MySQL基礎(四):navicat工具使用說明,高難度SQL查詢練習題

下面是小凰凰的簡介,看下吧!
💗人生態度:珍惜時間,渴望學習,熱愛音樂,把握命運,享受生活
💗學習技能:網絡 -> 雲計算運維 -> python全棧( 當前正在學習中)
💗您的點贊、收藏、關注是對博主創作的最大鼓勵,在此謝過!
有相關技能問題可以寫在下方評論區,我們一起學習,一起進步。
後期會不斷更新python全棧學習筆記,秉着質量博文爲原則,寫好每一篇博文。

1、navicat使用說明

(1)navicat連接雲上數據庫

先建立ssh連接到雲主機上:
在這裏插入圖片描述在這裏插入圖片描述

(2)navicat簡單使用

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
其他功能自己慢慢摸索吧!!

2、準備表

注意:下面表的生成,需要用到navicat工具!navicat就是一個數據庫的可視化工具。讓你不用再寫複雜的SQL語句,只是鼠標點點點,實現各種數據庫的騷操作!

導出的sql語句代碼:

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `class`
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `caption` varchar(32) NOT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `class`
-- ----------------------------
BEGIN;
INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班');
COMMIT;

-- ----------------------------
--  Table structure for `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(32) NOT NULL,
  `teacher_id` int(11) NOT NULL,
  PRIMARY KEY (`cid`),
  KEY `fk_course_teacher` (`teacher_id`),
  CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `course`
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '體育', '3'), ('4', '美術', '2');
COMMIT;

-- ----------------------------
--  Table structure for `score`
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `num` int(11) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_score_student` (`student_id`),
  KEY `fk_score_course` (`course_id`),
  CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
  CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `score`
-- ----------------------------
BEGIN;
INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'), ('10', '3', '1', '77'), ('11', '3', '2', '66'), ('12', '3', '3', '87'), ('13', '3', '4', '99'), ('14', '4', '1', '79'), ('15', '4', '2', '11'), ('16', '4', '3', '67'), ('17', '4', '4', '100'), ('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'), ('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'), ('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'), ('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'), ('44', '11', '3', '43'), ('45', '11', '4', '87'), ('46', '12', '1', '90'), ('47', '12', '2', '77'), ('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87');
COMMIT;

-- ----------------------------
--  Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `gender` char(1) NOT NULL,
  `class_id` int(11) NOT NULL,
  `sname` varchar(32) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_class` (`class_id`),
  CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `student`
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES ('1', '男', '1', '理解'), ('2', '女', '1', '鋼蛋'), ('3', '男', '1', '張三'), ('4', '男', '1', '張一'), ('5', '女', '1', '張二'), ('6', '男', '1', '張四'), ('7', '女', '2', '鐵錘'), ('8', '男', '2', '李三'), ('9', '男', '2', '李一'), ('10', '女', '2', '李二'), ('11', '男', '2', '李四'), ('12', '女', '3', '如花'), ('13', '男', '3', '劉三'), ('14', '男', '3', '劉一'), ('15', '女', '3', '劉二'), ('16', '男', '3', '劉四');
COMMIT;

-- ----------------------------
--  Table structure for `teacher`
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `tname` varchar(32) NOT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `teacher`
-- ----------------------------
BEGIN;
INSERT INTO `teacher` VALUES ('1', '張磊老師'), ('2', '李平老師'), ('3', '劉海燕老師'), ('4', '朱雲海老師'), ('5', '李傑老師');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;
拷貝上述代碼,新建一個.sql文件,保存到桌面
打開navicat新建數據庫db1,選中新建的數據庫鼠標右鍵選擇運行SQL文件
彈出文件框,選中剛剛保存到桌面的.sql文件即可

運行完上述sql文件就會生成以下幾個表:
在這裏插入圖片描述

3、模型圖

在這裏插入圖片描述

4、查詢題目

(1)查詢所有的課程的名稱以及對應的任課老師姓名
SELECT
	course.cname,
	teacher.tname 
FROM
	course
	INNER JOIN teacher ON course.teacher_id = teacher.tid
(2)查詢平均成績大於八十分的同學的姓名和平均成績
SELECT
	student.sname,
	AVG(score.num)
FROM
	student
	INNER JOIN score ON student.sid = score.student_id 
GROUP BY student.sid
HAVING AVG(score.num) > 80;
(3)查詢沒有報李平老師課的學生姓名
1. 選出李平老師所教的課程的課程號
SELECT
    course.cid
FROM
    course
INNER JOIN teacher ON course.teacher_id = teacher.tid
WHERE
    teacher.tname = '李平老師'
    
2. 根據李平老師所教的課程的課程號,找出報李平老師課的學生id
SELECT DISTINCT
    student_id
FROM
    score
WHERE
    course_id IN (
        SELECT
            course.cid
        FROM
            course
        INNER JOIN teacher ON course.teacher_id = teacher.tid
        WHERE
            teacher.tname = ‘李平老師‘
    )
    
3. 根據得到的報李平老師課的學生id,取反得到沒報李平老師課的學生id,並根據查詢其名字
SELECT
    student.sname
FROM
    student
WHERE
    sid NOT IN (
        SELECT DISTINCT
            student_id
        FROM
            score
        WHERE
            course_id IN (
                SELECT
                    course.cid
                FROM
                    course
                INNER JOIN teacher ON course.teacher_id = teacher.tid
                WHERE
                    teacher.tname = ‘李平老師‘
            )
    );
(4)查詢同時選修物理課程和體育課程的學生姓名
1. 查詢出'體育''物理'兩門課程的課程號
SELECT
    cid
FROM
    course
WHERE
    cname = '物理' OR cname = '體育'
    
2. 過濾出選修這兩門課程最少其中一門的所有人,然後按學號分組,count計數,把count計數等於2的學生號選出來
SELECT
    student_id
FROM
    score
WHERE
    course_id IN (
        SELECT
            cid
        FROM
            course
        WHERE
            cname = '物理'
        OR cname = '體育'
    )
GROUP BY
    student_id
HAVING
    COUNT(course_id) = 2
    
3. 根據學生號查詢學生姓名
SELECT
    student.sname
FROM
    student
WHERE
    sid IN (
        SELECT
            student_id
        FROM
            score
        WHERE
            course_id IN (
                SELECT
                    cid
                FROM
                    course
                WHERE
                    cname = '物理'
                OR cname = '體育'
            )
        GROUP BY
            student_id
        HAVING
            COUNT(course_id) = 2
    );
(5)查詢掛科超過兩門(包括兩門)的學生姓名和班級名

注意:caption字段裏面存的就是班級名!

# 兩次內連接
1. 先把掛科兩門及以上的學生的姓名和班級名選出來
SELECT
	student.sname,
	student.class_id 
FROM
	student INNER JOIN score ON student.sid = score.student_id 
WHERE
score.num < 60 GROUP BY score.student_id HAVING COUNT( score.student_id ) >= 2

2. 把上面得到的掛科學生姓名與班級名的表取別名爲t1,然後將class和t1進行內連接,然後取得sname和caption
SELECT
	t1.sname,
	class.caption 
FROM
	class
	INNER JOIN (
	SELECT
		student.sname,
		student.class_id 
	FROM
		student INNER JOIN score ON student.sid = score.student_id 
	WHERE
	score.num < 60 GROUP BY score.student_id HAVING COUNT( score.student_id ) >= 2 
	) AS t1 ON t1.class_id = class.cid;
# 內連接+子查詢
# 比上面簡單一點的方法
SELECT
	student.sname,
	class.caption 
FROM
	class
	INNER JOIN student ON class.cid = student.class_id 
WHERE
	student.sid IN ( SELECT student_id FROM score WHERE num < 60 GROUP BY student_id HAVING COUNT( course_id ) >= 2 );
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章