博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
几个SQL语句笔试题
阅读量:6047 次
发布时间:2019-06-20

本文共 2486 字,大约阅读时间需要 8 分钟。

1.表test1和表test2具有完全相同的结构,查出表test1中有但表test2中没有的数据:

drop table if exists test1;create table test1(username varchar(20) not null default '',password varchar(20) not null default '');drop table if exists test2;create table test2(username varchar(20) not null default '',password varchar(20) not null default '');insert into test1 values ('zhangsan','san'),('lisi','si'),('wangwu','wu');insert into test2 values ('zhangsan','san'),('lisi','si');

低级写法:

select * from test1 where (username, password) not in (select * from test2);

高级写法:

select * from test1 t1where not exists (    select 1 from test2 t2 where t1.username = t2.username and t1.password = t2.password)

exists与in的效率要分情况,当in后面跟的子查询的结果集很大时,效率没有exits高,否则的话,效率差不多。

但是,not exists的效率一定比not in要高。

2.在下表中查询出male、female人数都相同的班级:

create table school(class int primary key,male int,female int);insert into school values (1,12,13),(2,13,14),(3,14,15),(4,15,16),(5,12,13),(6,12,14),(7,13,14);

SQL语句:

select male,female from school;select male,female from school group by male,female;--分组可以用来去重,group by字段重复的只显示一次select male,female from school group by male,female having COUNT(*)=1;--COUNT(*)=1,看哪些是不重复的select male,female from school group by male,female having COUNT(*)>1;--COUNT(*)>1,看哪些是重复的select * from school where (male,female) in (select male,female from school group by male,female having COUNT(*)>1);select * from school where (male,female) in (select male,female from school group by male,female having COUNT(*)>1) order by male;

以上步骤是思路过程

千万要注意,长的、复杂的查询语句不要怕,都是从短的、简单的语句慢慢扩展而来的,所以可先写简单的语句看看结果,然后往目标方法扩展就好了。长语句很可能不能一步写到位,一步步扩展,一步步接近,最终能满足写出来。

值得注意的是,如果想去重的话,可以用分组,这样group by字段重复的记录就会只显示一次了,而且group by字段可以有多个的。

按道理来讲,用group by分组之后,查询出来的记录每一行都是一组,除分组字段外,其他字段的值只是每组中在数据表的第一条记录对应字段的值,没有什么意义,所以一般不建议查,mysql查这些非分组字段不会报错,在sqlserver中会报错的。

select class,male,female from school group by male,female;--分组可以用来去重,group by字段重复的只显示一次select class,male,female from school group by male,female having COUNT(1)=1;--COUNT(*)=1,看哪些是不重复的select class,male,female from school group by male,female having COUNT(1)>1;--COUNT(*)>1,看哪些是重复的

这三条sql语句,在mysql中不会报错,但是在sqlserver中会报错误:选择列表中的列 'school.class' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。group by子句是不能加class字段了,那么聚合函数中怎么加这个字段呢?

尝试select class,male,female from school group by male,female having COUNT(class)>=1;还是报错,突然想到在select列表中不是直接查非分组字段,而是用聚合函数包裹,如:

select count(class),male,female from school group by male,female;

现在没有问题了。

总结:非分组字段要么不查询,要么用聚合函数包裹再写在select列表中。

 

转载于:https://www.cnblogs.com/koushr/p/5873433.html

你可能感兴趣的文章
Integer.valueof() Integer.parseInt()
查看>>
全文检索引擎Solr系列——Solr核心概念、配置文件
查看>>
多校第五场 归并排序+暴力矩阵乘+模拟+java大数&记忆化递归
查看>>
关于RGB转换YUV的探讨与实现
查看>>
安装Yeoman
查看>>
servlet的url-pattern匹配规则详细描述
查看>>
【架构之路之WCF全析(一)】--服务协定及消息模式
查看>>
C#调用小票打印机
查看>>
Centos安装后,没有ifconfig工具
查看>>
python数字图像处理(15):霍夫线变换
查看>>
Codeforces 482B Interesting Array(线段树)
查看>>
form不提交问题
查看>>
web desktop在线演示
查看>>
Node.js刷新session过期时间
查看>>
SQL语句 - 数据操作
查看>>
【转】jenkins持续集成配置
查看>>
session.setAttribute和session.getAttribute
查看>>
UVA 489-- Hangman Judge(暴力串处理)
查看>>
《Android第一行代码》笔记
查看>>
java虚拟机能并发的启动多少个线程
查看>>