从中文语法上来说,应该先写FROM语句比较好理解

基础查询语句

SELECT [DISTINCT] target-list
FROM tables
WHERE qualification
GROUP BY grouping-list
HAVING group-qualification
  • DISTINCT:要求结果没有重复元组

查询过程(不优化,好理解)

  1. 将tables做笛卡尔乘积(FROM)
  2. 根据qualification删除元组(WHERE)
  3. 根据target-list删除的属性(SELECT)
  4. 根据是否DISTINCT删除重复元组
  5. 根据group-list分组(GROUP BY)
  6. 根据group-qu alification删除组(HAVING)

注意:select语句和having语句里的属性只能是group by里属性的子集。例如:group by sex,那么select和having里不能有sname。

定义列别名

SELECT SNAME AS '学生姓名'

范围条件BETWEEN AND

SELECT SNAME FROM S WHERE BIRTHDADY NOT BETWEEN '1996-07-01' AND '1998-06-30'

属于集合条件 IN

SELECT SNAME FROM S WHERE SID IN (SELECT SID FROM S WHERE xxx)

字符匹配

SELECT * FROM S WHERE SNO LIKE 'S_%0'

'-'为通配符,匹配任意一个字符

'%'匹配任意个字符

聚合函数

COUNT(*)
COUNT([DISTINCT] A)
SUM([DISTINCT] A)
AVG([DISTINCT] A)
MAX(A)
MIN(A)

一般group by要和聚合函数一起使用。

CAST表达式

CAST (Expression AS Data type)

例子:

Students (name, school)
Soldiers (name, service) CREATE VIEW PROSPECTS(name, school, service) AS
SELECT name, school, CAST(NULL AS Varchar(20))
UNION
SELECT name, CAST(NULL AS Varchar(20)), service
FROM Soldiers;

有点类似C++里的强制类型转换。

CASE表达式

例子:

Officers (name, status, rank, title)
SELECT name, CASE status
WHEN 1 THEN 'Active Duty'
WHEN 2 THEN 'Reserve'
WHEN 3 THEN 'Special Assignment'
WHEN 4 THEN 'Retired'
ELSE 'Unknown'
END AS tatus
FROM Officers;

给status重命名以便于阅读。

例子:

Machines (id, type, ohurs_used, accidents)
'找到“chain saw”故障时间所占比例'
SELECT sum(CASE
WHEN type='chain saw' THEN accidents
ELSE 0e0
END) / sum(accidents)
FROM Machines;

子查询(嵌套查询)

  • 结果是一个值

    '工作在纽约的部门和这个部门最高工资'
    SELECT d.deptno, d.deptname, (SELECT MAX(salary)
    FROM emp
    WHERE deptno = d.deptno) AS maxpay
    FROM dept AS d
    WHERE d.location = 'New York';
  • 结果是表

    '查询每年新入职员工的平均pay'
    SELECT startyear, avg(pay)
    FROM (SELECT name salary+bonus AS pay,
    year(startdate) AS startyear
    FROM emp) AS emp2
    GROUP BY startyear;
  • 公共表表达式(临时视图)

    防止payroll运算两次。

    '查找总收入最高的部门'
    WITH payroll (depno, totalpay) AS
    (SELECT deptno, sum(salary) + sum(bonus)
    FROM emp
    GROUP BY deptno)
    SELECT deptno
    FROM payroll
    WHERE totalpay = (SELECT max(totalpay)
    FROM payroll)

    实现外连接

    WITH
    '自然连接'
    innerjoin(name, rank, subject, enrollment) AS
    (SELECT t,name, t.rank, c.subject, c.rnrollment
    FROM teachers AS t, course AS c
    WHERE t.name=c.teacher AND c.quarter='FALL 96'),
    '左外连接'
    teacher-only(name, rank) AS
    (SELECT name, rank
    FROM teachers
    EXCEPT ALL
    SELECT name, rank
    FROM innerjoin),
    '右外连接'
    course-only(subject, enrollment) AS
    (SELECT subject, enrollment
    FROM courses
    EXCEPT ALL
    SELECT subject, enrollment
    FROM innerjoin) SELECT name, rank, subject, enrollment
    FROM innerjoin
    UNION ALL
    SELECT name, rank,
    CAST (NULL AS Varchar(20)) AS subject
    CAST (NULL AS Integer) AS enrollment
    FROM teacher-only
    UNION ALL
    SELECT CAST (NULL AS Varchar(20)) AS name,
    CAST (NULL AS Varchar(20)) AS rank,
    subject, enrollment
    FROM course-only;

SQL之QL的更多相关文章

  1. Spark SQL慕课网日志分析(1)--系列软件(单机)安装配置使用

    来源: 慕课网 Spark SQL慕课网日志分析_大数据实战 目标: spark系列软件的伪分布式的安装.配置.编译 spark的使用 系统: mac 10.13.3 /ubuntu 16.06,两个 ...

  2. 《开源大数据分析引擎Impala实战》目录

    当当网图书信息: http://product.dangdang.com/23648533.html <开源大数据分析引擎Impala实战>目录 第1章  Impala概述.安装与配置.. ...

  3. Oracle 单行函数

    一.什么是函数 任何东西,只要它能接收输入,对输入进行加工并产生输出,它就可以被称为函数. 二.单行函数简介 单行函数只对表中的一行数据进行操作,并且对每一行数据只产生一个输出结果.单行函数可以接受一 ...

  4. 《Java程序设计》终极不改版

     半年前的作品,上传只为纪念~ 成绩: ____0.1______ Java程序设计  课程设计 题 目:大学生信息管理系统 学 院:  计算机与软件学院 专 业:     网络工程_____­ .  ...

  5. Spark源码系列:DataFrame repartition、coalesce 对比

    在Spark开发中,有时为了更好的效率,特别是涉及到关联操作的时候,对数据进行重新分区操作可以提高程序运行效率(很多时候效率的提升远远高于重新分区的消耗,所以进行重新分区还是很有价值的).在Spark ...

  6. 20145229吴姗珊《网络对抗》WEB基础实践

    20145229吴姗珊<网络对抗>WEB基础实践 基础与实践 基础问题 1.什么是表单 表单是可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 一部分是HTML源代码用于 ...

  7. Hive入门指南

    转自:http://blog.csdn.net/zhoudaxia/article/details/8842576 1.安装与配置 Hive是建立在Hadoop上的数据仓库软件,用于查询和管理存放在分 ...

  8. 日志管理-rsyslog日志服务器及loganalyzer

    一,日志基础 日志:记录时间,地点,任务,事件 格式:日期时间 主机 进程[pid]: 事件内容 rsyslog 特性: 多线程,UDP, TCP, SSL, TLS, RELP,MySQL, PGS ...

  9. 1.windows-oracle实战第一课

    一.oracle是目前最流行的数据库之一,功能强大.性能卓越.学习要有信心.oracle也做软件,不仅仅是数据库.比如ERP(企业资源计划,用友.金蝶) 二.目前的数据库   相对而言:       ...

  10. python编程训练

    1. 反转字符串: 1 #encoding=utf-8 2 #import string 3 from collections import deque 4 5 def reverse1(string ...

随机推荐

  1. Vulkan学习苦旅01:最初的相遇(学习路线、参考资料与环境配置)

    提示:博主本人也在努力学习Vulkan中,文中可能有写错的地方,敬请大家批评指正. 这个世界只有两种人:会Vulkan的和不会Vulkan的,大概不存在"只会一点"的中间状态.学习 ...

  2. .NET 大数据实时计算--学习笔记

    摘要 纯 .Net 自研大数据实时计算平台,在中通快递服务数百亿包裹,处理数据万亿计!将分享大数据如何落地以及设计思路,技术重难点. 目录 背景介绍 计算平台架构 项目实战 背景介绍 计算平台架构 分 ...

  3. Linux-sshpass(shell脚本使用ssh远程执行命令通过密码的方式登录)

    1. sshpass简介 sshpass 是一个在非交互式 ssh 会话中自动输入密码的工具.它可以直接在命令行中指定密码,因此可以用于 Shell 脚本等自动化场景.在 Red Hat 系统中,可以 ...

  4. Python枚举类型enum

    为什么需要枚举 枚举(Enum)是一种数据类型,也是一种特别的类,是绑定到唯一值的符号表示,可以使用它来创建用于变量和属性的常量集枚举类可以看成是一个下拉菜单,给出特定的选项且这些选项不可修改,更贴近 ...

  5. 深入 Nginx 之架构篇[转]

    前言 最近在读 Nginx 相关的书籍,做一下读书笔记. Nginx 作为业界知名的高性能服务器,被广泛的应用.它的高性能正是由于其优秀的架构设计,其架构主要包括这几点:模块化设计.事件驱动架构.请求 ...

  6. 编译安装c2工具sliver以及python 客户端sdk

    背景: 项目需要安装sliver服务端和客户端还有sliver的python sdk: git clone https://github.com/BishopFox/sliver.git cd sli ...

  7. win32 - 创建带有标准阴影的无边框窗口

    这个框框好像删不掉,就先放这边吧...   #define WIN32_LEAN_AND_MEAN #include <unknwn.h> #include <windows.h&g ...

  8. Java的SPI机制实践

    Java SPI机制概述 先给出结论:"Java的SPI是一种服务发现机制,用于约定接口和动态发现实现类,体现了分层解耦的思想". Java的SPI机制常用于框架扩展或组件替换,最 ...

  9. Aop @AfterReturning因返回类型不一致导致无法执行切面代码

    要做返回异常之后,所有操作回滚的操作,本来想着泛型用 Object 就表示所有返回类型是 CommonResult 并且加指定注解的都走这个通知的代码,但是如下配置,无论如何也不生效 进入源码里发现, ...

  10. toml格式配置文件介绍

    toml官方wik toml官方文档 此次文档是以v1.0.0为例,进行说明的.如果使用到的版本不同,直接去官方文档中找对应的版本即可. 谈到配置文件,大家都能说出来好几种,比如常见的ini.xml. ...