几个SQL语句笔试题
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 t1
where 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列表中。
几个SQL语句笔试题的更多相关文章
- 【转】SQL语句面试题
1.一道SQL语句面试题,关于group by表内容:2005-05-09 胜2005-05-09 胜2005-05-09 负2005-05-09 负2005-05-10 胜2005-05-10 负2 ...
- sql语句 面试题
ql语句 面试题 自动编号 学号 姓名 课程编号 课程名称 分数 1 2005001 张三 0001 数学 69 2 2005002 李四 ...
- SQL基础&笔试题
仅以此篇博客纪念让我羞愧的一次笔试,作为对数据库基础的恶补. 一.SQL的基本概念: SQL是集数据定义语言DDL,数据操纵语言DML,数据控制语言DCL的功能于一体,可以独立完成数据库生命周期的全部 ...
- SQL Server 笔试题总结
1:编写Sql语句,查询id重复3次以上的条目,表为Pram(id,name) 先看建立的表: SQL语句: 直接使用一个子查询即可 select * from Pram where id in(se ...
- SQL语句操作数据试题
1.在SQL Server中,下列关于数据完整性的说法错误的是(). (选择一项) A:实体完整性要求表中的每一行数据都反映不同的试题,不能存在相同的数据行 B:域完整性是只给定列的输入有效性 C:在 ...
- 经典的SQL语句面试题
Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...
- 经典的SQL语句面试题(转)
Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表 问题:1. ...
- 一条SQL语句面试题:求选修所有课程的学生
前几天求职面试,有一道SQL题:给出三个表:学生.课程.成绩,求选修了所有课程的学生. 一道看似很简单的问题,把我难住了,我改了又改,涂涂画画,抓耳挠腮,因为试卷没有多少空白位置了,最后只好放弃.心情 ...
- 【转】经典的SQL语句面试题
Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表 问题: 1 ...
随机推荐
- Android 中执行定时任务 Timer + TimerTask
1. new Timer().schedule(new TimerTask() { @Override public void run() { //任务代码 } }, 0, 5000);
- VBO
#include <GL/glew.h> #include <GL/glut.h> #include <iostream> #pragma comment(lib, ...
- 站在Java的角度看LinkedList
站在Java的角度看,玩队列不就是玩对象引用对象嘛! public class LinkedList<E> implements List<E>, Deque<E> ...
- 好友与组--ESFramework 4.0 进阶(11)
大部分分布式通信系统中,都会涉及到客户端之间相互通信.以及需要将客户端进行分组的功能,或者是类似这方面的需求.ESFramework对这一常见的任务内置了强大的支持,包括从客户端到服务端.一直到Pla ...
- 经典dp 编辑距离
给定两个字符串S和T,对于T我们可以进行三种操作 (1)在任意位置增加字符 (2)删除字符 (3)替换字符 问最少多少次能把T变成S? 设f(i,j)是S的前i位和T的前j位对齐的最小花费 接下来分析 ...
- Openjudge-计算概论(A)-求分数序列和
描述: 有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,.... 求这个分数序列的前n项之和.输入输入有一行:正整数n.输出输出有一行:分数序列的和(浮点数,精确到小数点后4位) ...
- iOS应用性能调优的4个建议和技巧
任何一个能在用户手机屏幕中占有一席之地的iOS app都包含3个关键因素:想法好.设计出色.性能卓越.本文将分享一些iOS应用性能调优的4个建议和技巧. Tip #1:把图片资源压缩到最小. i ...
- java实现线程的3中方式
1.继承Thread类实现多线程继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是 ...
- Ubuntu iptalbes 保存配置
ubuntu 保存防火墙命令,iptables方式:1.iptables 配置好策略2.iptables-save > /etc/network/iptables.up.rules ,配置的策 ...
- Flask -- 消息闪现、错误处理
flash 可以在任何需要的地方添加,类似于print from flask import flash @app.route('/') def index(): flash('You are in h ...