SQL基础之select
1.认识select
select的主要语法如下,这个很重要因为只有记住了整体的结构才能应对任何情况。从中可以看到select的强大主要就是建立在where、group by、having、order by这4个功能之上。
select [all | distinct] select_list [into new_table] [from table_source]
[where search_condition]
[group by byexpression]
[having search_condition]
[order by order_expression [asc|desc] ]
再来看这6个关键字的执行顺序,显然首先你得找到表取得最原始最庞大的数据,因此是from。接着是where用来进行过滤,然后group by和having开始执行,这样数据的过滤已经完成所以就是select了,还有一个order by就是最后了。总结起来顺序是from、where、group by、having、select、order by。如果再加上其它功能点,完整的执行顺序为from,on,join,where,group by,having,with rollup或cube,select,distinct,order by,top。关于from要注意当为表使用别名时,一旦使用将不能够再用表名,只能使用as后的别名。where中可以使用很多运算符组合过滤条件,系统过滤数据时将按照过滤条件以行为单位一条条的进行过滤。在运算符中逻辑运算符的优先级为not、and、or,而且not只能用于简单条件式,不能用于包含and和or的复杂条件式。
group by为我们带来了非常方便的分组功能,但要注意使用时select中只能是by后面的列名和聚集函数。当以by后面的列进行分组时,如果在select中包括其它的列比如columnA,那么系统将不知道显示分组后的columnA集合中的哪一条数据,这就是为什么不能select其它列的原因。另外还要注意group by后的列名必须使用完整的名字,不能出现as的别名,原因很简单就是因为执行顺序。having和where很相似,它们都可以对结果进行过滤。它们的区别则有2点:having中可以包含聚集函数,而where是不允许有聚集函数的;having中出现的列必须是select中存在的,而where则可以使用表中的任意列。
在查询中,如果要对多表进行查询可使用where或表连接来进行关联。和表连接一样,联合查询也是查询中很有效的手段,当然它和表连接有着本质的区别,使用它有3个要注意的地方。首先union联合的2个select语句,必须要有相同数量的列。在有相同列的情况下,列还必须拥有相似的数据类型,最后select语句的顺序也要相同。它的作用则是将多个select的结果集拼接在一起并一起显示在结果集上,表连接是将表进行关联连接,而联合查询只是联合了查询出来的结果集,将这些结果集放到一起显示而已。使用union会发现它除了去除重复行外,还会对结果集进行一个排序,union all既不会去除重复行也不会对结果进行排序。关于union的用法读者可自己去写sql,这里我要强调的是一个使用union常见的错误,数据表sql语句如下所示。
--创建数据库
create database testDb on
(
name=testDb_data,
filename='D:\testDb_data.mdf',
size=4,
filegrowth=10%
)
log on
(
name=testDb_log,
filename='D:\testDb_data.log',
size=2,
filegrowth=10%
) --创建student表
use testDb
create table student
(
studentId int primary key,
studentName nvarchar(16) not null,
studentAge int default(18),
studentSex nchar(1)
) create table teacher
(
teacherId int primary key,
teacherName nvarchar(16) not null,
teachClass nvarchar(16)
) --为student添加新的一列并添加主外键约束
alter table student add
teacherId int,constraint teacher_FK foreign key(teacherId) references teacher(teacherId)
select * from teacher insert into teacher values(1,'刘老师','安卓')
insert into teacher values(2,'吴老师','网站')
insert into teacher values(3,'王老师','物联网') select studentId,studentName from student
union all
select teacherId,teacherName from teacher

如果在上面sql中的union后加上order by teacherId则会出现错误,提示上说order by项必须出现在选择列表中,可是这里teacherId明明就是选择列表中的列啊。再仔细看看结果集会发现列上的名字是以第一个select中的列名为标题的,因此这里teacherId还真没有出现选择列表中。将teacerId改为studentId或studentName将会顺利执行,关于结果集读者可自行去试。
select studentId,studentName from student
union all
select teacherId,teacherName from teacher
order by teacherId

select studentId,studentName from student
union all
select teacherId,teacherName from teacher
order by studentId,studentName
在错误提示中还出现了intersect和except运算符,既然遇到了那肯定要掌握。这3个运算符一起出现说明它们有着某种紧密的联系。union如前面所说是两个数据集的并集,intersect是两个结果集的交集,except则是两个结果集的差集。以上面的表为例,如果使用intersect结果集将为空,因为这两个集合根本就没有相同的数据集。使用except则返回的是第一个select返回的结果。使用union和except的结果如下所示。
select studentId,studentName from student
union
select teacherId,teacherName from teacher
order by studentId,studentName select studentId,studentName from student
except
select teacherId,teacherName from teacher
order by studentId,studentName

2.从select into到临时表
在实际应用中开发者经常会需要去创建一个临时的表存储数据,select into正是扮演着这样的角色。使用select into要注意创建的表名必须是唯一的,当我们使用select into创建一个临时的表时会在当前数据库中建立一张新表。注意这张表已存在于当前数据库中,这样的话开发者还需要手动drop,如果忘记删除将会导致数据库中的表越来越多,而且很有可能重名。为了改进这一缺点,SQL利用了和C#里的垃圾回收一样的思想,就是由系统来删除临时表,当然我们也可以手动删除。我们只需要在设置临时表名前加上#或##,一个#表示本地临时表,两个#表示全局临时表。对于本地临时表,最重要的特点是创建后只对当前这次会话状态有效,一次会话状态指的是客户端与数据库引擎的连接,这里客户端指登入者在数据库上进行操作的一端,最终执行是需要连接数据库引擎来完成的。比如select * into #table1 from student where studentId<4,执行后在系统数据库中的tempdb可看到创建的临时表。并且它的名字很有意思,sql可能是为了防止重名吧,它还为我们创建的本地临时表又添加了后缀名。当我关掉选项卡后,这个临时表也就从tempdb中消失了,也就是说本地临时表它属于创建它的当前用户,且只在当前会话状态下可使用。全局临时表创建后,所有用户都可见,当创建者介绍这次会话时比如我关掉选项卡,会发现全局临时表和本地临时表一起被删了。那是不是说全局临时表和本地临时表一样,也是当前会话状态结束就被系统删除呢?答案是否定的,这里和GC很像,如果没有其他任务引用这个全局临时表,那它就被删除。但要注意创建着会话状态存在时,其他任务可引用它创建的全局临时表,创建着会话状态存结束时,其他任务将不能再引用这个全局临时表,但是此时如果已有任务引用这个全局临时表不会删除,直至没有任务引用它。另外临时表并不是只有select into可以创建,我们也可以直接使用create table创建。
创建临时表和非临时表相比,有哪些优点和缺点呢?首先我们最关注的肯定是性能,临时表有一个特点那就是对它的操作不会记录日志文件,而非临时表则会进行记录,因此临时表性能比非临时表更快。在临时表中,由于本地临时表只对当前用户的当前会话状态有效,那么完全不需要对本地临时表进行加锁,所以从这一点来说本地临时表比全局临时表更快。显然这些性能的提高同时伴随着某些功能将无法使用,有利也有弊。临时表与非临时表一样,也可以建立索引、约束,只是不能建立外键约束,对于临时表和非临时表我们都可以使用drop和truncate来删除表。
SQL基础之select的更多相关文章
- (大数据工程师学习路径)第四步 SQL基础课程----select详解
准备 在正式开始本内容之前,需要先从github下载相关代码,搭建好一个名为mysql_shiyan的数据库(有三张表:department,employee,project),并向其中插入数据. 具 ...
- SQL 基础:Select语句,各种join,union用法
一.基本的SELECT语句 1. “*”的注意事项:在SELECT语句中,用*来选取所有的列,这是一个应该抵制的习惯. 虽然节省了输入列名的时间,但是也意味着获得的数据比真正需要的数据多的多.相应的, ...
- SQL基础篇----select语句与排序问题
一.检索--输出所有的列 SELECT * FROM my_friends WHEREfirst_name = 'cake'; 知识点1 * 代表选择出所有的行-----(什么行呢?)就是first_ ...
- SQL基础语法select|insert|update|delete(增删改查) 简单使用
以下案列以此表举例 1.select(查询) select简单的查询分为两种 注:字段也就是表结构中的列的名称 第一种: select 字段名 from 表名 此种查询只列出你所需要查询的字段, ...
- Oracle学习(一)SQL基础
一.认识SQL SQL是什么? SQL,结构化查询语言,全称是 Structured Query Language. SQL 是一门 ANSI(American National Standards ...
- [SQL基础教程] 2-1 SELECT语句基础
[SQL基础教程] 2-1 SELECT语句基础 列的查询 Syntax SELECT<列名>,..... FROM<表名>; SELECT col_1, col_2 FROM ...
- SQL语法基础之SELECT
SQL语法基础之SELECT 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.SELECT查看帮助信息 1>.查看SELECT命令的帮助信息 mysql> ? SEL ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
随机推荐
- iOS实现自定义进度条、拖动条效果,可多个
项目用到的一个场景,需要设置一个周期内不同时间时的数值 比如要设置10秒内,每一秒的大小,通过10个拖动条来设置实现,只需拖动到想要的数值即可, 这里周期10秒和每个拖动条的最大值都是可以自己定义的. ...
- WIN 程序员的 Linux 互斥类
作者:黄山松,发表于cnblogs:http://www.cnblogs.com/tomview/ 对于一个 win 的程序员,要把在 win 下的程序移植到 linux 下,需要把一些平台相关的功能 ...
- 异或的精彩应用 FIX_BTMAP_END
源文件是arch/x86/include/asm/fixmap.henum fixed_addresses {#ifdef CONFIG_X86_32 FIX_HOLE,... _ ...
- java报表工具FineReport的公式编辑框的语法简介
FINEREPORT用到公式的地方非常多,单元格(以=开头的便被解析为公式),条件显示,数据字典,报表填报属性值定义,图表标题,轴定义,页眉页脚,甚至单元格的其他属性中的鼠标悬浮提示内容都可以写公式, ...
- 理解 OpenStack + Ceph (2):Ceph 的物理和逻辑结构 [Ceph Architecture]
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- AI (Adobe Illustrator)详细用法(三)
本文主要是介绍和色彩相关的用法. 一.路径外观设置 1.设置描边粗细 手动输入20px 下拉选择 鼠标选中数值,按向上或向下的箭头调整 在右边的描边菜单中修改 Note:按住shift键,然后上下箭头 ...
- Java设计模式之代理模式
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式: 人如其名,代理相 ...
- 移动测试会Ebay沙龙PPT
Bill Liu --如何让你的测试更敏捷ebay沈斌峰 --Mobile Automation TestingJason Woo -- Full Stack Testing http://teste ...
- POJ3255Roadblocks[次短路]
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12697 Accepted: 4491 Descr ...
- Android之监听手机软键盘弹起与关闭
背景: 在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹起 ...