sql练习题(2)

-- 11、查询没有学全所有课程的同学的信息
-- 解法一:所学课程数量 < 课程数量
SELECT s.* FROM student s
LEFT JOIN score s1 ON s.`s_id` = s1.`s_id`
GROUP BY s1.`s_id`
HAVING COUNT(s1.`c_id`) < (SELECT COUNT(1) FROM course)

-- 解法二
SELECT *
FROM student
WHERE s_id NOT IN(
SELECT s_id FROM score t1
GROUP BY s_id HAVING COUNT(*) =(SELECT COUNT(DISTINCT c_id)  FROM course)) 

-- 12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息
-- 解法一:左连接
SELECT DISTINCT s.* FROM student s
LEFT JOIN score s1 ON s.`s_id` = s1.`s_id`
WHERE s1.`s_id` <> ‘01‘ AND s1.`c_id` IN
(SELECT c_id FROM score WHERE s_id = ‘01‘)
-- 解法二:子查询
SELECT * FROM student WHERE s_id IN(
    SELECT DISTINCT a.s_id FROM score a WHERE a.c_id IN(SELECT a.c_id FROM score a WHERE a.s_id=‘01‘)
    ) AND s_id <> ‘01‘;

-- 13、查询和"01"号的同学学习的课程完全相同的其他同学的信息

-- 14、查询没学过"张三"老师讲授的任一门课程的学生姓名
-- 解法一
SELECT s_name FROM student
WHERE s_id NOT IN (
SELECT s.`s_id`
FROM student s LEFT JOIN score s1 ON s.`s_id` = s1.`s_id`
WHERE s1.`c_id` IN
(SELECT c_id
FROM teacher t LEFT JOIN course c ON t.`t_id` = c.`t_id`
WHERE t.t_name = ‘张三‘)
)
-- 解法2
SELECT a.s_name FROM student a WHERE a.s_id NOT IN (
    SELECT s_id FROM score WHERE c_id =
                (SELECT c_id FROM course WHERE t_id =(
                    SELECT t_id FROM teacher WHERE t_name = ‘张三‘)));

-- 15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
-- mark
SELECT a.s_id 学号,a.s_name 姓名,ROUND(AVG(b.s_score)) 平均成绩 FROM
    student a
    LEFT JOIN score b ON a.s_id = b.s_id
    WHERE a.s_id IN(
            SELECT s_id FROM score WHERE s_score<60 GROUP BY  s_id HAVING COUNT(1)>=2)
    GROUP BY a.s_id,a.s_name

在做了一些sql练习题,心中有一些疑问,查询资料后记录如下。

1、count(1)   \   count(*)   \   count(列名)   有什么区别?

(1)执行结果上

测试数据如下图:

SELECT COUNT(列名)的结果为 5;  SELECT COUNT(1)的结果为 10;  SELECT COUNT(*)的结果为 10, 也是count(列名)不会包括为null的字段。

那select  count(NULL) 结果是什么?

原因是当count()括号内的值为null时,mysql内部自动返回0,不进行进一步查询。

(2)执行效率上

原理有点复杂,《高性能MySQL》推荐写法是count(*)

2、怎么描述内连接和外连接的区别 ?

一、inner join(内连接、等值连接,也可以省略 INNER 使用 JOIN,效果一样):只返回两个表中联结字段相等的行。

二、外连接分为左外连接、右外连接 和 全外连接;

(1)left join(左联接):返回包括左表中的所有记录和右表中联结字段相等的记录。

(2)ight join(右联接):返回包括右表中的所有记录和左表中联结字段相等的记录。

(3)full join(全连接)

下面展示一个简单的栗子:

现在有两张表分别为student、student2,如下所示:

student表:

student2表:

SELECT * FROM student s1 INNER JOIN student2 s2 ON s1.s_id = s2.s_id

查询结果如下:

SELECT * FROM student s1 LEFT JOIN student2 s2 ON s1.s_id = s2.s_id

查询结果如下:

SELECT * FROM student s1 RIGHT JOIN student2 s2 ON s1.s_id = s2.s_id

查询结果如下:

(3)全外连接(MySQL目前不支持此种方式,可以用其他方式替代解决。)

那么问题就来了:Full Join的问题该如何解决呢?我们可以用UNION ALL操作来间接使用Full Join。

SELECT * FROM student s1 LEFT JOIN student2 s2 ON s1.s_id = s2.s_id
UNION ALL
SELECT * FROM student s1 RIGHT JOIN student2 s2 ON s1.s_id = s2.s_id

 查询结果如下:

 

如果想去掉重复的数据呢? 用union即可。

三、Cross Join

交叉连接,又称笛卡尔连接(cartesian join)或叉乘(Product),如果A和B是两个集合,它们的交叉连接就记为:A x B。

SELECT * FROM student s1 CROSS JOIN student2 s2

原文地址:https://www.cnblogs.com/Aug-20/p/12035611.html

时间: 2024-11-05 21:46:45

sql练习题(2)的相关文章

经典SQL练习题

今天在网上找了几道经典的SQL练习题做了一下,虽然都不难,但是对打基础是很有好处的,在明白的基础上可以进一步做分析,来研究一下各种解法的优劣,甚至进行简单的优化..现在将题目和答案分享一下.我使用的是MYSQL 5.0,但是绝大部分都是标准SQL.表结构:CREATE TABLE STUDENT(SNO VARCHAR(3) NOT NULL, SNAME VARCHAR(4) NOT NULL,SSEX VARCHAR(2) NOT NULL, SBIRTHDAY DATETIME,CLASS

(转)经典SQL练习题

今天在网上找了几道经典的SQL练习题做了一下,虽然都不难,但是对打基础是很有好处的,在明白的基础上可以进一步做分析,来研究一下各种解法的优劣,甚至进行简单的优化..现在将题目和答案分享一下.我使用的是MySQL 5.0,但是绝大部分都是标准SQL.表结构:CREATE TABLE STUDENT(SNO VARCHAR(3) NOT NULL, SNAME VARCHAR(4) NOT NULL,SSEX VARCHAR(2) NOT NULL, SBIRTHDAY DATETIME,CLASS

基本SQL练习题--选课经典例题

为管理岗位业务培训信息,建立3个表: S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号.学员姓名.所属单位.学员年龄 C (C#,CN ) C#,CN 分别代表课程编号.课程名称 SC ( S#,C#,G ) S#,C#,G 分别代表学号.所选修的课程编号.学习成绩 1. 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名 --实现代码: Select SN,SD FROM S Where [S#] IN( Select [S#] FROM C,SC Whe

50道SQL练习题及答案与详细分析!!!

以前在学校还没有很认真地意识到,现在到了企业才发现sql是那么的重要,看到网上有很多的sql 练习题,特地拿来练练手! 数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname

50道sql练习题和答案

最近两年的工作没有写过多少SQL,感觉水平下降十分严重,网上找了50道练习题学习和复习 原文地址:50道SQL练习题及答案与详细分析 1.0数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --3.教师表 Teacher(TId,Tname) --TId 教

接近50道经典SQL练习题,附建表SQL解题SQL

说明 本文章整理了47道常见sql联系题,包括建表语句,表结构,习题列表,解题答案都涵盖在本文章内.文末提供了所用SQL脚本下载链接.所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题欢迎留言,对我写的有问题的,欢迎指正,谢谢. 数据库:oracle11g 表结构 可使用plsql-工具-导入表,导入如下sql脚本. 表结构与数据.sql 学生表 Student(SId,Sname,Sage,Ssex)SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别

很不错的sql练习题(select)

创建表和输入数据 CREATE TABLE STUDENT (SNO VARCHAR(3) NOT NULL,    SNAME VARCHAR(4) NOT NULL,    SSEX VARCHAR(2) NOT NULL,    SBIRTHDAY DATETIME,    CLASS VARCHAR(5)) go CREATE TABLE COURSE (CNO VARCHAR(5) NOT NULL,    CNAME VARCHAR(10) NOT NULL,    TNO VARC

SQL 练习题

一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示.用SQL语句创建四个表并完成相关题目. 表1-1数据库的表结构 表(一)Student (学生表) 属性名 数据类型 可否为空 含 义 Sno Char(3) 否 学号(主码) Sname Char(8) 否 学生姓名 Ssex Char(2) 否

另一套Oracle SQL练习题

题干: 1 create table student( 2 sno varchar2(10) primary key, 3 sname varchar2(20), 4 sage number(2), 5 ssex varchar2(5) 6 ); 7 create table teacher( 8 tno varchar2(10) primary key, 9 tname varchar2(20) 10 ); 11 create table course( 12 cno varchar2(10)