数据库第二次上机distinct用法

本文探讨了SQL中distinct关键字的功能与应用,包括如何使用distinct去除重复记录、distinct的作用范围、以及如何在不同场景下有效利用distinct。通过具体例子展示了distinct在查询不同字段时的特性,并提供了一个解决实际问题的SQL查询方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。

下面先来看看例子:

table表

字段1     字段2
   id        name
            a
            b
            c
            c
            b

库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

select distinct name from table
得到的结果是:

  

----------  

name
   a
   b
   c

好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:

select distinct name, id from table

结果会是:

----------  

id name
   1 a
   2 b
   3 c
   4 c
   5 b

distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

我们再改改查询语句:

select id, distinct name from table

很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。

------------------------------------------------------------------------------------------------------------

下面方法可行:

select *, count(distinct name) from table group by name

结果:

   id name count(distinct name)
   1 a 1
   2 b 1
   3 c 1

最后一项是多余的,不用管就行了,目的达到。。。。。

group by 必须放在 order by 和 limit之前,不然会报错

************************************

找出至少选修了学号为“200900130417”的学生所选修的一门课的学生的学号、姓名。

create table test2_02 as
     select sid,name//应该使用distinct去掉重复的
     from pub.student//属性来自多个关系
     where some course in(//some any all的用法还不熟悉,一般用于比较
       select course//要加前面的相等student_course.sid=student.sid,不然结果不正确
       from pub.student_course
       where sid='200900130417');
drop table test2_02//上面的SQL执行不成功,所以不用drop掉下面是正确的SQL
create table test2_02 as
     select distinct student.sid,name
     from pub.student,pub.student_course
     where student_course.sid=student.sid and student_course.cid in(
       select cid
       from pub.student_course
       where sid='200900130417');

在sqlplus环境中,以HR用户(模式)使用数据库,在此用户下回 答下列问题(手写所有问题的答案并上交): 1. 在未知HR用户 密码的情况下,如何以HR用户的身份登录到数据库中? 2. 以HR 用户登录到数据库后,如何列出HR用户(模式)拥有那些数据表? 3. 如何查看EMPLOYEES数据表的结构? 4. 如果要求在sqlplus 中以下列要求显示数据列,该如何实现,写出相应格式化命令。 a)EMPLOYEE_ID列相对于列宽右对齐显示列名“员工编”,并 在显示时以4位数 字显示,当不足4位数字时,前端以添加0 补齐。 b)SALARY列要求所有值均显示两位小数(如果是整数也 显示两位小数00),并在头位 数字前显示本地货币符“¥” 5. 设置sqlplus页宽为200字符,页高为100行,应使用什么 sqlplus命令实现? 6. 如何查看当前用户是什么数据库用户? 7. 如何将第4、5题中的格式操作命令保留下来,并在今后每次使 用sqlplus登录数据库后都 自动执行进行设置?写出操作过程 8. 编写脚本QueryJobHisByDept.sql,此脚本的执行结果是显示由用 户指定某部门中进行职位 变动的次数为用户指定次数的职员姓名 等相关信息。脚本的运行步骤要求如下(请注意,在 最后还有对 结果显示的额外要求,请自行确定在何处使用何种命令实现相应 要求): 1.清除所有column指令设置的格式设置 2. 取消对于替 换变量进行验证显示的选项(提示:verify环境变量)3. 设置 employee_id 列的显示列名“员工编” 4. 设置employee_name 列的显示列名为“员工姓名” 5. 设置JobName列的显示列名为“ 现任职位” 6. 设置Salary列的显示列名为“薪金”,并设置在数 字前显示字符“$”符 7. 设置Department列的显示列名为“工 作部门” 8. 设置Country_Name列的显示列名为“所在国家” 9. 设置页宽为200,页高为150 10. 显示“请输入部门名称:”,并 接受用户的输入 11. 显示“需要参数已设置,请按<Enter>键继 续” 12. 等待用户按Enter键,待用户按下Enter键后继续下面的 操作 13. 查询由用户指定的部门中的员工信息,包括职员编( 列名为employee_id,来源于 Employees表)、职员姓名(列名为 employee_name,来源于Employees表,由First_name 和 Last_name拼接形成,First_Name和Last_Name之间使用“,”符 分隔)、员工的 职位(列名为JobName,来源于Jobs表)、员工 的薪金(列名为Salary,来源于Employees 表)、员工所在部门 名称(列名为department,来源于Departments表的 Department_name 列),员工所在国家(列名为Country_name, 来源于countries表的Country_name列), 要求按照员工姓名升 序排列。 额外要求: 1. 对于具有相同的职员姓名的临近多个数据行,只 显示第一个数据行的职员姓名 2. 最终在脚本中形成的查询语句 以及查询结果保存到“c:\queryResult.txt”文件中。注意,只 保存查询语句及其查询结果及不可避免的截屏结束语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值