SQL中一些小巧但常用的关键字小结

前言

前面的几篇文章中,我们大体上介绍了 SQL 中基本的创建、查询语句,甚至也学习了相对复杂的连接查询和子查询,这些基本功相信你也一定掌握的不错,那么本篇则着重介绍几个技巧方面的关键字,能够让你更快更有效率的写出一些 SQL。

下面话不多说了,来一起看看详细的介绍吧

起别名

在实际的项目中,有时候我们的表名、字段名过于复杂以致于我们的 SQL 写出来过长、过于复杂,这时候我们往往会通过起别名的方式将一些名字较长、较为复杂的字段或是表名简化。

我们可以使用别名(Alias)来对数据表或者列进行临时命名,既然是别名,也就是说并不会修改原表或列的原始名称,仅仅用于当前查询的简介化显示。

给表起别名:

select * from person as p
where p.id = 1;

一旦为表执行了别名,那么本次查询的子查询语句中都可以直接引用别名替代原表的引用。

给列起别名:

select name as n,age as a from perosn;

除了使用关键字 as 来给表或是列起别名外,还可以直接使用空格字符达到同样的效果,但是个人认为要么全部使用 as 进行别名,要么全部使用空格进行别名,不要交叉使用使得你的 SQL 复杂又难以看懂。

消除重复记录

有时候,我们的数据库中会存在两条完全一样的数据,我们也叫做冗余数据,当然不希望在查询数据的时候查出来这么些冗余的重复数据,我们要把它们过滤掉。

LeetCode 上的一道简单题:

有一个courses 表 ,有: student (学生) 和 class (课程)。

请列出所有超过或等于5名学生的课。

例如,表:

+---------+------------+
| student | class  |
+---------+------------+
| A  | Math  |
| B  | English |
| C  | Math  |
| D  | Biology |
| E  | Math  |
| F  | Computer |
| G  | Math  |
| H  | Math  |
| I  | Math  |
+---------+------------+

应该输出:

+---------+
| class   |
+---------+
| Math    |
+---------+

你可以花个一分钟思考一下,运用我们之前的基本功,应该是不难的。

显然是需要用到分组的,想要统计每门课有多少人选,就得按照学科进行分组,每个分组内就是该门学科选修的学生记录。

那么 SQL 语句也就信手拈来了:

select class from courses
group by class
having count(student) >=5 

但是你提交后在海量测试用例下,会返回给你解答错误的提示,不信你试试,问题出在哪?

问题就出现在冗余数据这个边界条件没有被考虑,如果 A 选了两次 Math,当我们对 Math 这个分组进行计数时就会多算一次选 Math 的人数,实际上这是不符合逻辑的,我们需要过滤掉那些重复选择的数据记录。

解决方案如下:

select class from courses
group by class
having count(distinct student) >=5 

有些人可能看出来了,我们在 count 函数的列参数前添加了一个 distinct 关键字,它表示如果 student 列的值重复出现的话只计数一次。

当然,distinct 除了可以在聚合函数中使用外,也可以直接用在查询语句的列筛选阶段,例如:

//取出所有的学生,不允许重复名字的学生同时出现
select distinct name from students

连接结果集

UNION 运算符可以将一个或多个 SELECT 语句的结果连接组合成一个结果集,但要求两个或多个结果具有相同数量的列,列的数据类型相同,举个例子:

构建一个学生表:

+----+------+----------+-------+
| id | name | uNo  | fees |
+----+------+----------+-------+
| 1 | 张三 | 15263501 | 18000 |
| 2 | 李四 | 15263506 | 15960 |
| 3 | 王二 | 15263512 | 2500 |
+----+------+----------+-------+

学生表主要有学生的姓名,学号和学费。

构建一个教师表:

+----+--------+------+--------+
| id | name | tNo | salary |
+----+--------+------+--------+
| 1 | 李老师 | 1001 | 10000 |
| 2 | 杨老师 | 1002 | 15000 |
| 3 | 曹老师 | 1030 | 5000 |
+----+--------+------+--------+

现在有一个需求,需要拿到全校所有人的姓名和编号,包括学生和老师。一般来说,我们两次 select 查询就好了,但是没法合并在一个结果集中显示,这是一个问题。

于是我们可以使用 union 来连接两个结果并在一张表中显示出来:

select name,uNo from students
union
select name,tNo from teacher

查询结果:

+--------+----------+
| name   | uNo      |
+--------+----------+
| 张三   | 15263501 |
| 李四   | 15263506 |
| 王二   | 15263512 |
| 李老师 | 1001     |
| 杨老师 | 1002     |
| 曹老师 | 1030     |
+--------+----------+

看起来是不是直观了很多,除此之外的是,如果两个结果集中存在完全重复的数据记录,合并后的结果集中不会重复出现该数据记录。

当然了,如果你不需要在合并结果集的时候删除掉重复的数据行,你可以转而使用关键字 UNION ALL 替代 UNION。

TOP

TOP 子句用于从一张数据表中取回前 N 个或者 X% 的记录,但是需要注意的是,没有一个数据库实现是支持 TOP 的,各自有各自的关键字作为替代,例如 MySQL 和 SQLserver 使用 LIMIT 关键字,Oracle 使用 ROWNUM 关键字。

例如:

select * from students limit 2;

MySQL 数据库取出前两条数据,等效的 Oracle 数据库写法:

select * from students
rownum <= 2

以上的一些关键字虽然逐个看起来很简单,但有时候可能会帮上你大忙的,不要忘记使用它们!。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • sql中的left join及on、where条件关键字的区别详解

    LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN. 创建两张表并插入一些

  • SQL语句的各个关键字的解析过程详细总结

    由于最近需要做一些sql query性能提升的研究,因此研究了一下sql语句的解决过程.在园子里看了下,大家写了很多相关的文章,大家的侧重点各有不同.本文是我在看了各种资料后手机总结的,会详细的,一步一步的讲述一个sql语句的各个关键字的解析过程,欢迎大家互相学习. SQL语句的解析顺序 简单的说一个sql语句是按照如下的顺序解析的: 1. FROM FROM后面的表标识了这条语句要查询的数据源.和一些子句如,(1-J1)笛卡尔积,(1-J2)ON过滤,(1-J3)添加外部列,所要应用的对象.F

  • MySQL 5.7中的关键字与保留字详解

    前言 MySQL和Oracle的关键字还是不尽相同的,在Oracle数据库中,我们的数据表中定义了大量的code字段用来表示主键,但是在MySQL中code是关键字,使用以前的处理方法就有些"水土不服". 下面我们来了解一下MySQL中的关键字和保留字. 什么是关键字和保留字 关键字是指在SQL中有意义的字. 某些关键字(例如SELECT,DELETE或BIGINT)是保留的,需要特殊处理才能用作表和列名称等标识符. 这一点对于内置函数的名称也适用. 如何使用关键字和保留字 非保留关键

  • sql server关键字详解大全(图文)

    下面把sqlserver中cross apply和outer apply关键字具体介绍展示如下: 1.CROSS APPLY 和OUTER APPLY MSDN解释如下(个人理解不是很清晰): 使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数.表值函数作为右输入,外部表表达式作为左输入. 通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出. APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表. APPLY 有两种形

  • MySQL单表多关键字模糊查询的实现方法

    在最近的一个项目需要实现在MySQL单表多关键字模糊查询,但这数个关键字并不一定都存在于某个字段.例如现有table表,其中有title,tag,description三个字段,分别记录一条资料的标题,标签和介绍.然后根据用户输入的查询请求,将输入的字串通过空格分割为多个关键字,再在这三个字段中查询包含这些关键字的记录. 可目前遇到的问题是,这些关键字是可能存在于三个字段中的任意一个或者多个,但又要求三个字段必须包含所有的关键词.如果分别对每个字段进行模糊匹配,是没法实现所需的要求,由此想到两种

  • Mysql带And关键字的多条件查询语句

    MySQL带AND关键字的多条件查询,MySQL中,使用AND关键字,可以连接两个或者多个查询条件,只有满足所有条件的记录,才会被返回. SELECT * | {字段名1,字段名2,--} FROM 表名 WHERE 条件表达式1 AND 条件表达式2 [-- AND 条件表达式n]; 查询student表中,id字段值小于16,并且,gender字段值为nv的学生姓名 可以看出,查询条件必须都满足,才会返回 查询student表中,id字段值在12.13.14.15之中,name字段值以字符串

  • sql连接查询中,where关键字的位置讲解

    由于笔者天生笨拙,且思维不严谨,也实在不擅长写sql语句,高手请勿见笑,就请直接跳过本文吧. 背景就不多介绍了,先建表,插入测试数据吧.字段那些都有注释 复制代码 代码如下: --医生表CREATE TABLE doctor    (      id INT IDENTITY(1, 1) , --ID 自增长      docNumber NVARCHAR(50) NOT NULL , --医生编码      NAME NVARCHAR(50) NOT NULL   --医生姓名    )go

  • SQL中一些小巧但常用的关键字小结

    前言 前面的几篇文章中,我们大体上介绍了 SQL 中基本的创建.查询语句,甚至也学习了相对复杂的连接查询和子查询,这些基本功相信你也一定掌握的不错,那么本篇则着重介绍几个技巧方面的关键字,能够让你更快更有效率的写出一些 SQL. 下面话不多说了,来一起看看详细的介绍吧 起别名 在实际的项目中,有时候我们的表名.字段名过于复杂以致于我们的 SQL 写出来过长.过于复杂,这时候我们往往会通过起别名的方式将一些名字较长.较为复杂的字段或是表名简化. 我们可以使用别名(Alias)来对数据表或者列进行临

  • iOS应用开发中AFNetworking库的常用HTTP操作方法小结

    准备 首先,你需要将AFNetworking 框架包含到工程中.如果你还没有AFNetworking的话,在这里下载最新的版本: https://github.com/AFNetworking/AFNetworking 当你解压出下载的文件后,你将看到其中有一个AFNetworking子文件夹,里面全是.h 和 .m 文件, 如下高亮显示的: 将AFNetworking拖拽到Xcode工程中. 当出现了添加文件的选项时,确保勾选上Copy items into destination group

  • 深入分析C++中几个最不常用的关键字

    mutable关键字关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化!如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.这个时候就需要用到mutable关键字了例如: 复制代码 代码如下: class Demo{public:    Demo(

  • 详谈PHP面向对象中常用的关键字和魔术方法

    PHP面向对象中常用的关键字   final 1.final不能修饰成员属性(类中常量不是用这个关键字) 2.final只能修饰类和方法 作用: 使用final修饰的类不能被子类继承 使用final修饰的方法不能被子类覆盖 用来限制类不被继承,方法不被覆盖就使用final <?php //final修饰的类不能被继承 final class Person{ var $name; var $age; var $sex; function __construct($name,$age,$sex){

  • sql中的常用的字符串处理函数大全

    具体内容如下所示: 一.常用函数 1.ASCII() 返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用''括起来,但含其它字符的字符串必须用''括起来使用,否则会出错. 2.CHAR() 将ASCII 码转换为字符.如果没有输入0 ~ 255 之间的ASCII 码值,CHAR() 返回NULL . 3.LOWER()和UPPER() LOWER()将字符串全部转为小写:UPPER()将字符串全部转为大写. 4.STR() 把数值型数据转换为字符型数据. S

  • SQL中EXPLAIN命令的使用方法

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看.所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用. explain显示了mysql如何使用索引来处理select语句以及连接表.可

  • JAVA与SQL 中的null与NULL解析

    目录 一.前言 看下面我做的一个简单的测试: 二.Java中的null 引发这个异常的情况有: 2.1 大小写 2.2 默认的初值 2.3 类型 2.4 对null的检查 == 与 != instanceof equals 2.5 静态方法 2.6 参数传递 2.7 用途 三.SQL的NULL NULL值具有以下三个规则: 注意空值与NULL之间的差异: 三.Java与SQL 一.前言 null与NULL不都是表示空值吗?这有什么值得深入讨论的的?首先你在编写Java代码时使用过NULL吗?大概

  • 深入浅析SQL中的group by 和 having 用法

    一.sql中的group by 用法解析: Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)". 作用:通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理. 注意:group by 是先排序后分组! 举例说明:如果要用到group by 一般用到的就是"每"这个字, 例如现在有一个这样的需求:查询每个部门有多少人.就要用到分组的技术 select DepartmentID as '部门名称',

  • C#中的Internal关键字小结

    首先,理清几个概念:项目(project).解决方案(solution).程序集(assembly).命名空间(namespace). 项目(project)  就是我们开发的一个软件..NET下,项目有多种类型,如控制台.Windows应用程序.类库.Web应用程序等等.经过编译后,会生成.exe文件和.dll文件. .exe文件有统一的主程序入口,可以被执行,而类库只是提供一些功能给其他项目调用. 解决方案(solution)  当我们在VS中新建任何一种类型的项目时,这个项目还属于一个解决

随机推荐