SQL

MySQL语句练习

2023-02-13  本文已影响0人  阿巳交不起水电费

这里提供些测试语句方便练习上一篇 MySQL数据库建立多对多的数据表关系-学生课程表例子(附源码) 创建的表:

image.png
SELECT * FROM student;

#给表格添加列
ALTER TABLE student ADD COLUMN 列名 VARCHAR(30);

-- DML语句练习
#插入一条数据
INSERT INTO student(NAME,age,birthday) VALUES("郭靖",40,"1972-12-01");
#修改
UPDATE student SET age=41,NAME="黄蓉" WHERE id=9;
#删除
DELETE FROM student WHERE id=9;

-- DQL
SELECT NAME,age FROM student WHERE id=1;
# DISTINCT 去除重复,代表的是行数据的不同,而不是只针对某个列名
SELECT DISTINCT NAME,age FROM student;


# ------------- 学生课程表练习:------------- 
SELECT * FROM student;
SELECT * FROM course;

#练习:多表关联查询-查询学生所有信息包括选课信息
    #隐式内连接 - 便于理解
    SELECT 
    *
    FROM student t1,course t2, student_course_relation t1_t2
    WHERE t1.`student_id`=t1_t2.`student_id` AND t2.`course_id`=t1_t2.`course_id`;
    
    #显式内连接 - 效率更高
    SELECT *
    FROM student t1
    JOIN student_course_relation t1_t2 ON t1.`student_id`=t1_t2.`student_id`
    JOIN course t2 ON t2.`course_id`=t1_t2.`course_id`;

#练习:查询student表中所有数据且学生姓名不能重复 -- 这个使用group by 学生姓名实现即可


    #练习1_1: 查询学生的所有信息及其所选课程,为了方便查看并按照学号(学生id)排序

    SELECT *
    FROM 
        student t1,
        course t2, 
        student_course_relation t1_t2
    WHERE 
        t1.`student_id` = t1_t2.`student_id` AND t2.`course_id` = t1_t2.`course_id` -- 隐式内连接
        ORDER BY t1.`student_id` ASC; -- 学生id升序
        
    #练习1_2: 查询学生的所有信息及其所选课程,为了方便查看并按照学号(学生id)排序 --- 显式内连接方式

        SELECT 
        t1.`student_id`,t1.name,t1.`age`,t1.`id_no`,t1.`sex`,
        t2.`NAME` course_name
        FROM 
        student_course_relation t1_t2 
            JOIN student t1 ON t1_t2.`student_id`=t1.`student_id`
            JOIN course t2 ON t1_t2.`course_id` = t2.`course_id` -- 多个join on
            ORDER BY t1.`student_id` ASC; -- 学生id升序
        
#练习2:查询聂风选了哪些课程
     #1 隐式内连接方式
    SELECT 
        t1.*,
        t2.`NAME` 课程名称
    FROM
        student t1,
        course t2, 
        student_course_relation t1_t2
        WHERE t1.name="聂风" AND t1.`student_id`=t1_t2.`student_id` AND t2.`course_id`=t1_t2.`course_id`;

     #2 显式内连接方式
    SELECT 
        t1.*,
        t2.`NAME` 课程名称
    FROM 
        student t1
        JOIN student_course_relation t1_t2 ON t1.`student_id`=t1_t2.student_id
        JOIN course t2 ON t2.`course_id` = t1_t2.`course_id`
        WHERE t1.name="聂风";
        
    #3 - 利用子查询的方式 - 这个稍稍麻烦
    SELECT 
        t1.*,
        t2.`NAME` 课程名称
    FROM (
        SELECT 
            t1.*
        FROM 
            student t1 WHERE t1.name="聂风"
        ) t1

        JOIN student_course_relation t1_t2 ON t1.`student_id`=t1_t2.student_id
        JOIN course t2 ON t2.`course_id` = t1_t2.`course_id`;

#练习3:查询各个课程的选修人数并按照选修人数升序排序
    #1 - 隐式内连接
    SELECT 
        course.`course_id`,
        course.`NAME`,
        COUNT(t1_t2.`student_id`) 选修人数
    FROM course, student_course_relation t1_t2
    WHERE course.`course_id` = t1_t2.`course_id`
    GROUP BY course.name
    ORDER BY 选修人数 ASC,
         course.`course_id` ASC; -- 第二排序条件
         
    #2 - 显示内连接
    SELECT 
        course.`course_id`,
        course.`NAME`,
        COUNT(t1_t2.`student_id`) 选修人数
    FROM course
    JOIN student_course_relation t1_t2 ON course.`course_id`=t1_t2.`course_id`
    GROUP BY course.`NAME`
    ORDER BY 选修人数 ASC,
         course.`course_id` ASC; -- 第二排序条件

#练习3_2:查询课程选修人数>2的课程并按照选修人数升序排序
    SELECT 
        course.`course_id`,
        course.`NAME`,
        COUNT(t1_t2.`student_id`) 选修人数
    FROM course
    JOIN student_course_relation t1_t2 ON course.`course_id`=t1_t2.`course_id`
    GROUP BY course.`NAME`
    HAVING 选修人数 > 2 -- HAVING对group by分组查询后的值进行处理
    ORDER BY 选修人数 ASC,
         course.`course_id` ASC; -- 第二排序条件
         
         
#练习4:查询选修“大学计算机基础”的学生信息
    SELECT 
        t1.*,
        t2.`NAME`
    FROM student t1
    JOIN student_course_relation t1_t2 ON t1.`student_id`=t1_t2.`student_id`
    JOIN course t2 ON t2.`course_id`=t1_t2.`course_id`
    WHERE t2.name = "大学计算机基础"

若对你有帮助,请点个赞吧,谢谢支持!
本文地址:https://www.jianshu.com/p/6420fe0008bb?v=1676339797057,转载请注明出处,谢谢。

上一篇下一篇

猜你喜欢

热点阅读