第三章 SQL数据库开发--TSQL--select查询

2024-03-05 08:38

本文主要是介绍第三章 SQL数据库开发--TSQL--select查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第三章 SQL数据库开发--TSQL--select查询

 

3.1 select语法与逻辑处理顺序与谓词运算符优先级

3.1.1 select语法

SELECT [ ALL | DISTINCT ]  

    [TOP ( expression ) [PERCENT] [ WITH TIES ] ]  

    < select_list >  

    [ INTO new_table ]  

    [ FROM { <table_source> } [ ,...n ] ]  

    [ WHERE <search_condition> ]  

[ <GROUP BY> ]  

[ HAVING < search_condition > ] 

[ORDER BY…]

3.1.2  select逻辑处理顺序

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 WITH CUBE 或 WITH ROLLUP

7 HAVING

8 SELECT

9  DISTINCT

10 ORDER BY

 

3.1.3 select谓词运算符优先级

谓词用于 WHERE 子句和 HAVING 子句的搜索条件中

级别   运算符

0  ()

1  ~(位非)

2  *(乘)、/(除)、%(取模)

3  +(正)、-(负)、+(加)、+(串联)、-(减)、&(位与)、^(位异或)、|(位或)

4  =、>、<、>=、<=、<>、!=、!>、!<(比较运算符)

5  NOT

6  AND

7  ALL、ANY、BETWEEN、IN、LIKE、OR、SOME

8  =(赋值)

 

3.2 TOP限制结果集与DISTINCT消除重复行

3.2.1 TOP限制结果集

TOP限制10输出

SELECT top 10 mid,transoccurtime FROM L05_EXIT_TRAN where transoccurtime>'2018-05-01' order by transoccurtime desc

 

TOP限制1%输出

SELECT top 1 PERCENT mid,transoccurtime FROM L05_EXIT_TRAN where transoccurtime>'2018-05-01' order by transoccurtime desc

3.2.2 DISTINCT消除重复行

set rowcount 100

SELECT  distinct (shiftbegintime) FROM L05_EXIT_TRAN where transoccurtime>'2018-05-01' order by shiftbegintime desc

 

3.3 在选择列上使用常量,函数,别名

3.3.1 使用常量

SELECT user_name,'姓名' as 常量列 FROM A70_USERS_ZH

张春生 姓名

朱艳平 姓名

郅立强 姓名

王金华 姓名

 

3.3.2 使用函数

SELECT top 100 year(ac_when) FROM P01_TOD_INDEX;

 

3.3.3 别名

注意事项:定义了表别名以后,在语句中对该表的引用,都必须使用别名

SELECT top 20 l05.transoccurtime FROM L05_EXIT_TRAN as l05

SELECT top 20 l05.transoccurtime as 交易时间 FROM L05_EXIT_TRAN as l05

3.4 使用where筛选

3.4.1 使用谓词运算符过滤数据

交易时间大于2018-05-01,输出10行

SELECT  top 10 * FROM L05_EXIT_TRAN where transoccurtime>'2018-05-01' order by shiftbegintime desc

 

交易时间大于2018-05-01,或者mid<0 输出10行

 

SELECT  top 10 * FROM L05_EXIT_TRAN where transoccurtime>'2018-05-01' or mid<0 order by shiftbegintime

-43341886603952831      1899-12-30 00:00:00

-43341882293519868      1899-12-30 00:00:00

-43341882283112241      1899-12-30 00:00:00

 

Between ….and  中间的条件是包含。5月1日至5月10日

SELECT  top 10 mid,shiftbegintime FROM L05_EXIT_TRAN where transoccurtime between  '2018-05-01' and '2018-05-10' order by shiftbegintime desc

3.4.2 使用like进行模糊查询

通配符

含义

%

代表任意字符

_下划线

代表单个字符

[]

指定范围如[a-e]a到e [a,f]a和f

[^]

不包含字符

 

SELECT * FROM A70_USERS_ZH where user_name like '王[欢,磊]'

王磊

王欢

 

SELECT user_name FROM A70_USERS_ZH where user_name like '王[^欢,磊]'

王宇

王俊

王晨

 

SELECT * FROM A70_USERS_ZH where user_num like '1600[5-9]%'

16005001

16005002

16005003

16005004

16005005

 

3.4.3 如何使用null

当指定null条件的时候,使用is null 或者is not null

SELECT * FROM A72_ROLES_DOWN where role_com is not null

0    11   分中心稽查员    稽查帐务     2     0

0    13   9092      9092      2     0

 

3.5 子查询与嵌套查询

3.5.1 子查询与嵌套查询定义与语法

子查询是一个嵌套在它可以使一个 SELECT、SELECT...INTO 语句、INSERT语句、DELETE 语句、 UPDATE 语句或其他子查询中的查询。子查询嵌套在查询内部,且必须始终出现在圆括号内。

Select * (子查询T2) from T1 where 查询表达式 in或者 exists子查询。

                        where 查询表达式 比较运算符ANY|ALL(子查询)

嵌套查询又称子查询,是指在父查询的where条件语句中再插入一个子查询语句,连接查询都可以用子查询完成,反之不然。在SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块。将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为 嵌套查询

 

 

3.5.2 子查询与嵌套查询事例

3.5.2.1 子查询在select后

SELECT table_id,count(*) 下发数量,(SELECT count(*) FROM A37_Lane_Info) 收费节点数 FROM PARAM_SEND_LANE where version=1811040000220717 and sfrom=0 group by table_id;

 

3.5.2.2 子查询在where后

 

SELECT table_id,count(*) 下发数量,(SELECT count(*) FROM A37_Lane_Info) 收费节点数 FROM PARAM_SEND_LANE where version in (

SELECT version_id FROM A93_VERSION_STATE_ZH where table_id>150000 and state=5 and increment=0) and sfrom=0 group by table_id order by 下发数量 ;

 

 

3.5.3 EXISTS关键字与IN

 语法 EXISTS表达式 subquery子查询  如果子查询包含任何行,则返回 TRUE。

   EXISTS是可接受一个查询作为输入,如果子查询返回任意行,TRUE,否则为FALSE。

 

IN 确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表值和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

EXISTS 指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。

 

in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。

 In 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。

 

 

 

SELECT TOP 1000 * FROM L05_EXIT_TRAN where transoccurtime>'2017-11-01'  and transoccurtime<'2017-11-28' and operatorid in (SELECT user_id FROM A70_USERS_ZH where user_num= 15001924 )耗时11

 

 

SELECT TOP 1000 * FROM L05_EXIT_TRAN l05 where l05.transoccurtime>'2017-11-01'  and l05.transoccurtime<'2017-11-28' and EXISTS (SELECT a70.user_id FROM A70_USERS_ZH a70 where a70.user_num=15001924 and a70.user_id=l05.operatorID )

耗时2分钟

 

3.5.4 对于ALL,SOME,ANY的理解

运算符

含义

ALL

如果一组的比较都为 TRUE,那么就为 TRUE

SOME

如果在一组比较中,有些为 TRUE,那么就为 TRUE

ANY

如果一组的比较中任何一个为 TRUE,那么就为 TRUE

  

  ALL 比较标量值和单列集中的值

    语法 scalar_expression表达式 { = | <> | != | > | >= | !> | < | <= | !< } ALL ( subquery子查询 )

     SOME | ANY (Transact-SQL) 比较标量值和单列集中的值。 SOME ANY 是等效的。

    语法 scalar_expression 表达式{ = | < > | ! = | > | > = | ! > | < | < = | ! < }

     { SOME | ANY } ( subquery子查询  )

 

SELECT * FROM A70_USERS_ZH where user_id  > all (select user_id  from A74_USER_ROLE where role_id>3)  USER_id大于最大值

TI 表有ID1,2,3,4

以下查询返回 TRUE,因为 3 小于表中的某些值。

复制

IF 3 < SOME (SELECT ID FROM T1)

PRINT 'TRUE'

ELSE

PRINT 'FALSE' ;

以下查询返回 FALSE,因为 3 并不小于表中的所有值。

复制

IF 3 < ALL (SELECT ID FROM T1)

PRINT 'TRUE'

ELSE

PRINT 'FALSE' ;

 

 

 

3.6 order by对结果排序

对于null排序处理,是无穷小。Order by默认升序ASC不用写,如果使用降序使用DESC。

单列排序

SELECT  attach_id,user_name FROM A70_USERS_ZH order by attach_id

多列排序

SELECT  attach_id,user_num,user_name FROM A70_USERS_ZH order by attach_id desc,user_num

1001136      7001003       郑彤染

1001136      7001004       杨学培

1001136      7001007       张天杰

1001136      7001008       何敏

1001136      7001009       黄丽强

1001136      7001012       郑健

3.7 使用GROUP BY 子句和聚集函数进行分组

3.7.1 GROUP BY使用基础

聚集函数

AVG() 返回某列的平均值

COUNT()返回某列的行数

MAX() 返回某列的最大值

MIN() 返回某列的最小值

SUM()返回某列值之和

 

查询7月以后,出口广场的车流量

SELECT a36.organ_name as 广场,count(*) as 车流量 FROM L05_EXIT_TRAN as l05,A36_ORGAN as a36 where l05.transoccurtime>'2018-07-01' and  l05.plaza_id=a36.organ_id group by a36.organ_name order by 车流量 desc

 

西红门主站进京出      3751926

榆垡南出京出           1660982

金华寺站出京出           667890

庞各庄站出京出           625676

西红门南桥进京出2        579101

海子角站进京出           546598

天宫院站出京出           531863

3.7.2 HAVING子句筛选分组后的数据

Having与where子句功能相同,都是对数据进行筛选,不同的是,where是对分组之前的数据筛选,having是对分组后的数据筛选,having可以使用聚合函数或者其他表达式,where 子句不能。进行先使用where子句,where子句性能好

查询7月以后,出口广场的车流量大于6万的广场

SELECT a36.organ_name as 广场,count(*) as 车流量 FROM L05_EXIT_TRAN as l05,A36_ORGAN as a36 where l05.transoccurtime>'2018-07-01' and  l05.plaza_id=a36.organ_id group by a36.organ_name having count(*)>600000 order by 车流量 desc

西红门主站进京出  3751926

榆垡南出京出   1660982

金华寺站出京出      667890

庞各庄站出京出      625676

 

 

3.7.3 Where 和having比较

Where 筛选good

SELECT  a36.organ_name as 广场,count(*) as 车流量 FROM L05_EXIT_TRAN as l05,A36_ORGAN as a36 where l05.transoccurtime>'2018-07-01' and l05.plaza_id>100100 and l05.plaza_id=a36.organ_id group by a36.organ_name order by 车流量 desc

Having 筛选bad

SELECT  l05.plaza_id as 广场,count(*) as 车流量 FROM L05_EXIT_TRAN as l05,A36_ORGAN as a36 where l05.transoccurtime>'2018-07-01' and   l05.plaza_id=a36.organ_id group by l05.plaza_id having l05.plaza_id>100100 order by 车流量 desc

Where 子句过滤后,然后对更少的数据分组,第二个是分组后,过滤。当然是where子句性能好。

 

3.7.4 NO-GROUP BY ROLLUPCUBE  没有弄明白

 

3.8 COMPUTE (Transact-SQL) 以后会舍弃不用

生成合计作为附加的汇总列出现在结果集的最后。当与 BY 一起使用时,COMPUTE 子句在结果集内生成控制中断和小计。可在同一查询内指定 COMPUTE BY COMPUTE

语法

[ COMPUTE

    { { AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM }

    ( expression ) } [ ,...n ]

    [ BY expression [ ,...n ] ]

]

行聚合函数

结果

AVG

数值表达式中所有值的平均值

COUNT

选定的行数

MAX

表达式中的最高值

MIN

表达式中的最低值

STDEV

表达式中所有值的标准偏差

STDEVP

表达式中所有值的总体标准偏差

SUM

数值表达式中所有值的和

VAR

表达式中所有值的方差

VARP

表达式中所有值的总体方差

 

 

SELECT * FROM A70_USERS_ZH order by attach_id compute  min(user_id);;

 

SELECT * FROM A70_USERS_ZH order by attach_id compute  min(user_id) by attach_id;

 

3.10  SQL性能优化

3.10.1  尽量使用正逻辑而不是非逻辑,非逻辑操作(no between 、 not in 和not null)可能会降低查询速度,因为它要检索数据表中的所有行;

 

3.10.2 如果能够使用一个更确定的查询,就尽量避免使用关键字LIKE,使用LIKE查询,数据查询速度可能会降低;

 

3.10.3 只要有可能,尽量在搜索条件中使用精确的比较或值的域;

 

3.10.4使用Order by 子句可能会降低数据查询速度,

 

这篇关于第三章 SQL数据库开发--TSQL--select查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/775906

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof