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 基础知识梳理( ...
随机推荐
- Tomcat:bio nio 的设计
BIO 由Acceptor接收Socket,将其转交给Worker来处理. NIO 由Acceptor接收Socket,将其转交给Poller来轮询处理.Poller再将可处理的Socket交给Wo ...
- 十五天精通WCF——第十二天 说说wcf中的那几种序列化
我们都知道wcf是由信道栈组成的,在我们传输的参数走到传输信道层之前,先需要经过序列化的过程,也就是将参数序列化为message,这篇 我们就来说说这里的序列化,蛮有意思的,可能初学者也明白,在wcf ...
- SQLServer中ISNULL、NULLIF和CONVERT函数
create view sss as(select ISNULL(operate_time, CONVERT(VARCHAR(20),create_time,120)) time from s_pro ...
- 检测PC端和移动端的方法之一
window.mobileCheck = function() { var check = false; (function(a){if(/(android|bb\d+|meego).+mobile| ...
- hibernate 实现分页查询语句、单条查询语句、多条查询语句、修改、删除语句
package com.hanqi.test; import java.util.Date; import java.util.List; import org.hibernate.Query; im ...
- wc
$wc [-lwc] filename统计的文件的信息,缺省参数会按照lwc的顺序输出全部三种信息 -l统计文件的行数 -w统计文件的字数,字以空格和换行符分隔 -c统计文件的字符数,包括换行等 例子 ...
- SVN Unable to connect to a repository at UR
背景: 1. SVN服务器:VisualSVN-Server-2.5.5: 2. SVN客户端:TortoiseSVN-1.7.6.22632-x64-svn-1.7. ...
- bg激活后台运行的服务
按redis重启来做案例 ./redis-server Ctrl+z让执行的命令在后台暂停 [1]+ Stopped ./redis-server 这个时候他是把这个服务放到后台了,可是ctrl+z是 ...
- C++浅析——继承类中构造和析构顺序
先看测试代码,CTEST 继承自CBase,并包含一个CMember成员对象: static int nIndex = 1; class CMember { public: CMember() { p ...
- SpringMVC从入门到精通之第三章
上一章节中首先讲解前端控制器DispatcherServlet的配置包括加载springmvc文件.拦截什么样的请求等还有两个组件:分别是适配器和映射器(另外再补充一组) 非注解的处理器映射器 处理器 ...