SQL语句优化系列三(关于select查询)

关于select查询

  1. 输出表中的所有列   select  *  from 表名
  2. 输出表中的部分列   select  字段名表 from 表名
  3. 为结果集内的列指定列名  select  {字段名1 [ as 列的别名]  [,…n]}  from 表名
  4. 消除取值重复的行,在select 后面紧跟 distinct
  5. 限制返回的行数    select  top 行数 列名表 from 表名
  6. 查询满足条件的元组  select  *  from 表名 where 查询条件
  1. 比较:列表达式1 比较运算符 [列]表达式2
  2. 确定范围:列表达式 [NOT] Between 起始值 And 终止值

select *

from 学生

where 出生日期 between ‘1980-05-01‘ and ‘1982-12-31‘

  1. 确定集合:列表达式 [NOT] IN (列值1,列值2,……)

select *

from 班级

where 系部代码 in(‘01‘,‘02‘)

  1. 字符匹配:列表达式 [NOT] Like ‘匹配串’  [escape<’换码字符’>] 

匹配串中可以有:%、_、[…]、[^…]

select *

from 课程

where 课程名 like ‘Delphi/_6.0‘ escape‘/‘

  1. 涉及空值的查询:列表达式 IS  [NOT] NULL

6)  多重条件查询:使用AND、OR、NOT连接多个查询条件

7.  对查询的结果排序:select * from 表名 [where 查询条件]  ORDER BY <列名 [ASC|DESC]> [,…n]

select 学号,成绩

from 课程注册

where 课程号=‘0001‘

order by 成绩 asc

  1. 对数据进行统计
  1. 使用集合函数:可以前带DISTINCT或ALL

统计记录个数            COUNT(*)

统计一列中值的个数      COUNT(列名)

计算一列中值的总和      SUM(列名)

计算一列中值的平均值    AVG(列名)

计算一列中值的最大值    MAX(列名)

计算一列中值的最小值    MIN(列名)

  1. 对结果进行分组操作:select * from 表名 [where 查询条件] GROUP BY 列名 [HAVING  筛选条件表达式]

select 课程号,COUNT(*) AS 选课人数

from 课程注册

GROUP BY 课程号

HAVING COUNT(*)>=3

  1. 使用COMPUTE子句:可以对查询结果集中的所有记录进行汇总统计,并显示所有参加汇总记录的详细信息。select * from 表名 [where 查询条件] ORDER  BY 列名 COMPUTE 集和函数 [BY 列名]

select *

from 课程注册

ORDER BY 学号

COMPUTE SUM(成绩) BY 学号

  1. 用查询结果生成新表:select *  into 新表名  from 表名 [where 查询条件]
  2. 合并结果集:相当于集合的并操作

select 语句

{union   select 语句}

[,…n]

  1. 连接查询(在一个查询中涉及多个表)

1)  交叉连接查询

交叉连接:又称非限制连接(广义笛卡尔积),它是将两个表不加约束地连接在一起,连接产生的结果集的纪录为两个表中记录的交叉乘积,结果集的列为两个表属性列的和。交叉连接产生的结果集一般没有什么实际应用的意义,实际使用很少。

语法格式:SELECT <列名表> FROM 表名1  CROSS JOIN 表名2

<列名表>中罗列的列名是结果集中出现的列名(取自表名1和表名2中的部分或全部)

  1. 等值与非等值连接查询

连接查询中用来连接两个表的条件称为连接条件,连接条件的一般格式为;

[<表名1>.]<列名>  <比较运算符>  [<表名2>.]<列名>

<比较运算符>主要有:=,>,<,>=,<=,!=。

当比较运算符主要为=时,成为等值连接,其语法格式为:

SELECT <列名表> FROM 表名1  [INNER] JOIN 表名2 ON [<表名1>.]<列名>=[<表名2>.]<列名>

使用其它运算符的连接为非等值连接。(还可以有其他条件符号)

SELECT *

FROM 产品 INNER JOIN 产品销售 ON 产品.产品编号=产品销售.产品编号

ALTER TABLE 产品

ADD  产量 INT

UPDATE 产品

SET 产量=28

WHERE 产品编号=‘0001‘

UPDATE 产品

SET 产量=30

WHERE 产品编号=‘0002‘

UPDATE 产品

SET 产量=40

WHERE 产品编号=‘0003‘

UPDATE 产品

SET 产量=40

WHERE 产品编号=‘0004‘

SELECT *

FROM 产品

SELECT *

FROM 产品销售

SELECT *

FROM 产品 INNER JOIN 产品销售 ON 产品.产量>产品销售.销量

SELECT *

FROM 产品 INNER JOIN 产品销售 ON 产品.产量>产品销售.销量 AND 产品.产品编号=产品销售.产品编号

SELECT *

FROM 产品 , 产品销售

where 产品.产量>产品销售.销量 AND 产品.产品编号=产品销售.产品编号

  1. 自身连接查询(目的是为了在一个表中查找具有相同列值的行)

一个表与其自身进行的连接(也可以理解为一个表的两个副本之间的连接)。

在进行自身连接查询时,必须为表指定两个别名,且对所有列的引用均要用别名限定。

例:查找不同课程成绩相同的学生的学号、课程号和成绩

select a.学号,a.课程号

from 课程注册 as a join 课程注册 as b

on a.学号=b.学号 and a.课程号!=b.课程号

  1. 外连接查询

不仅将满足条件的记录列出,而且还可以将不满足条件的记录的基本信息列出。外连接分为:

左外连接:将左表作为主表,主表中所有记录分别与右表的每一条记录进行连接组合,结果集中除了满足条件的记录外,还有主表中不满足连接条件的记录并在右表的相应列上填充NULL值。语法如下,

SELECT 列名表

FROM 表名1 LEFT [OUTER] JOIN 表名2

ON 表名1.列名=表名2.列名

例:将“产品”表左外连接“产品销售”表

SELECT *

FROM 产品 LEFT OUTER JOIN 产品销售

ON 产品.产品编号=产品销售.产品编号

右外连接:将右表作为主表,主表中所有记录分别与左表的每一条记录进行连接组合,结果集中除了满足条件的记录外,还有主表中不满足连接条件的记录并在左表的相应列上填充NULL值。语法如下,

SELECT 列名表

FROM 表名1 RIGHT [OUTER] JOIN 表名2

ON 表名1.列名=表名2.列名

例:将“产品”表右外连接“产品销售”表

SELECT *

FROM 产品 RIGHT OUTER JOIN 产品销售

ON 产品.产品编号=产品销售.产品编号

全连接:讲左表所有记录分别与右表的每一条记录进行连接组合,结果集中除了满足连接条件的记录外,还有左、右表中不满足连接条件的记录并在左、右表的相应列上填充NULL值。语法如下,

SELECT 列名表

FROM 表名1 FULL [OUTER] JOIN 表名2

ON 表名1.列名=表名2.列名

例:用全连接的方法连接“产品”表与“产品销售”表

SELECT *

FROM 产品 FULL OUTER JOIN 产品销售

ON 产品.产品编号=产品销售.产品编号

  1. 复合连接条件查询

在ON连接表达式中可以有多个连接条件。

例如:查询成绩在75分以上的学生的学号、姓名,选修课的课程号、课程名、专业代码、成绩,任课教师的教师编号、姓名。

SELECT B.课程号,D.课程名,C.教师编号,C.姓名,A.学号,A.姓名,B.专业代码,B.专业学级,B.学期,B.成绩

FROM 学生 AS A JOIN 课程注册 AS B

ON A.学号=B.学号 AND B.成绩>75

JOIN 教师 AS C

ON B.教师编号=C.教师编号

JOIN 课程 AS D

ON B.课程号=D.课程号

SELECT 课程注册.课程号,课程.课程名,教师.教师编号,教师.姓名,学生.学号,学生.姓名,

课程注册.专业代码,课程注册.专业学级,课程注册.学期,课程注册.成绩

FROM 学生, 课程注册,教师,课程

WHERE 学生.学号=课程注册.学号 AND 课程注册.成绩>75 AND 课程注册.教师编号=教师.教师编号 AND 课程注册.课程号=课程.课程号

  1. 子查询

SELECT 语句可以嵌套在其他许多语句中,这些嵌套的SELECT语句就称为子查询,子查询的SELECT查询总是使用圆括号括起来,且不能包括COMPUTE或FOR BROWSE子句。

SQL Server对嵌套查询的求解方法是由里向外处理,即每个子查询在上一级查询处理之前求解,子查询的结果用于建立父查询的查询条件。嵌套查询可以用多个简单的查询构造复杂的查询,但嵌套不能超过32层。

1) 带有IN运算符的子查询

子查询的结果是一个结果集,父查询通过IN运算符将父查询中的一个表达式与子查询结果集中的每一个值进行比较,如果表达式的值与子查询结果集中的任何一个值相等,父查询中的“表达式 IN (子查询)”条件表达式返回TRUE,否则返回FALSE。NOT IN运算符与IN运算符结果相反。

SELECT  列名表

FROM 表名

WHERE 表达式 IN

父查询

(

SELECT 列名

FROM 表名

[WHERE 条件式]

子查询

例如:查询有产品销售记录的产品信息。

查询选修了课程名为“大学语文”的学生学号和姓名。

SELECT 学号,姓名

FROM 学生

WHERE 学号 IN

(SELECT 学号

FROM 课程注册

WHERE 课程号 IN

(SELECT 课程号

FROM 课程

WHERE 课程名=‘大学语文‘

)

)

    1. 带有比较运算符的子查询

父查询通过比较运算符将父查询中的一个表达式与子查询结果(单值)进行比较,如果比较运算的结果是TRUE,父查询中的“表达式  比较运算符(子查询)”条件表达式返回TRUE,否则返回FALSE。

例如:列出高于平均分的学生的信息。

SELECT *

FROM 学生

WHERE 学号 IN

(SELECT 学号

FROM 课程注册

WHERE 成绩>

(SELECT AVG(成绩)

FROM 课程注册 )

)

    1. 带有ANY或ALL运算符的子查询

子查询中返回单值是可以用比较运算符,当返回的是一个结果集时,可以使用ANY或ALL运算符(必须同时使用比较运算符)。

ANY或ALL与比较运算符一起使用的语义


运 算 符

语    义

>ANY

大于子查询结果中的某个值

>ALL

大于子查询结果中的所有值

<ANY

小于子查询结果中的某个值

<ALL

小于子查询结果中的所有值

>=ANY

大于等于子查询结果中的某个值

>=ALL

大于等于子查询结果中的所有值

<=ANY

小于等于子查询结果中的某个值

<=ALL

小于等于子查询结果中的所有值

=ANY

等于子查询结果中的某个值

=ALL

等于子查询结果中的所有值

例如:查询比“010101001”班中某一学生年龄大的其他班的学生学号与姓名。

SELECT 学号,姓名

FROM 学生

WHERE 出生日期 <ANY

(SELECT 出生日期

FROM   学生

WHERE  班级代码=‘010101001‘)

AND 班级代码<>‘010101001‘

查询比“010101001”班中所有学生年龄都小的其他班的学生学号与姓名。

SELECT 学号,姓名

FROM 学生

WHERE 出生日期 >ALL

(SELECT 出生日期

FROM   学生

WHERE  班级代码=‘010101001‘)

AND 班级代码<>‘010101001‘

Sql语句资料

  1. 查询表内所有内容

Select * from 表名

2.命令建库

Create database 库名 on(name = 库名_dat,filename = “ 路径\库名.mdf ” size = ?mb)

3.命令插入数据

Use 库名

Insert into 表名 values( 数据 )

备注:字符型加单引号,数据时间用逗号分开

4.命令建表

Create table 库名.dbo.表名(not null 非空 null为空 primary key 主键 中间用逗号分开)

5.命令更新数据

Update 表名 set 列名 = 新数据 where 条件

6.命令查询排序

Select * from 表名 order by 列名

备注:一般情况配列顺序为正序排列 由小到大 倒序排列:由大到小 加关键字 desc

7.求平均数 arg

Select ‘年龄合计’ = sum(字段名) from 表名

8.显示相同数据的总数 count

Select count(*) from 表名 where 条件

9.查询一个字段的最大值 max

Select max(字段名) from 表名

10.同一数据库中表数据插入新表

Insert  into 表名(字段名)select 字段名 from 表名 where 条件

11.命令修改数据类型

Alter table表名 alter column 字段名 新数据类型

12.别名查询

Select a.性命,b.电话 from java a,java.b

Where a.ID = b.ID

From 后面定义表的别名

Where 条件

Select 字段名 from 表名

Union

Select 字段名 from 表名

15.补充主键

Alter table 表名 add primary key 字段名

16.查看表信息

Exce sp_help 表名

17.命令建立索引 非簇索引

Create index 索引名 on 表名 字段名

18.删除索引

Drop index 表名 字段名

19.建立备份设备

Exce sp_add umpdevice ‘disk’,’备份的文件名’,’备份地址’

备注:disk 为 备份设备的类型

20.删除备份设备

Exce sp_dropdevice ‘备份文件名’

21.备份数据库

Backup database 库名 to 备份的文件名

22.恢复数据库

Restore database 库名 to 备份的文件名

23.建立视图 单表视图

Create view 视图名(字段名,字段名)

As

Select 字段名.字段名 from 数据来源表

24.多表视图别名建立

Create ciew 视图名(字段名,字段名)

As

Select a.字段,a.字段,b.字段,b.字段

From 表名a,表名 b

Where 条件

25.创建触发器

Insert 事件

Create trigger 触发器名

On 表名

For insert

As

Insert into 表名 select name,age from inserted

update 事件

Insert 事件

Create trigger 触发器名

On 表名

For insert

As

Declare @变量名 数据类型(长度)

Select @变量名 = 字段 from deleted

Select @变量名 = 字段 from inserted

Update 表名 set 字段 =@变量

26.创建单一查询的存储过程

Create procedure 名称 @变量名称 数据类型(长度)

As

Select * from 表名 where 条件字段名 like @变量名称

执行exce 存储名称

27.增加约束(默认约束)

Alter table add constraint 约束名 default 默认值

For 字段名

28.检查约束

Alter table add constraint 约束名 check 检查条件

时间: 2024-08-04 17:29:50

SQL语句优化系列三(关于select查询)的相关文章

SQL语句优化系列一

SQL语句优化 1.SELECT 子句中避免使用'* ' 2.使用表的别名 (Alias) 当在 SQL 语句中连接多个表时 , 请使用表的别名并把别名前缀于每个 Column 上.这样一来,就可以减少解析的时间并减少那些由 Column 歧义引起的语法错误. 3.用 >= 替代 > 高效 : SELECT * FROM  EMP  WHERE  DEPTNO >=4 低效 : SELECT * FROM EMP WHERE DEPTNO >3 两者的区别在于,前者 DBMS 将直

SQL语句优化系列四(Oracle数据库日期格式转换)

Oracle数据库日期格式转换 select sysdate from dual select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') as mydate from dual select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as mydate from dual select to_number(to_char(sysdate,'yyyymmddhh24miss')) as mydate from dual

SQL系列 - SQL语句优化个人总结

关于SQL语句优化方法 有些是通用的(如避免Select *): 有些不同的数据库管理系统有所区别(如Where子句顺序): 然后必须根据实际环境进行调优,因为即使是相同的数据库和表,在数据量或其他环境变化之后,SQL效率可能是不同的.所以,优化不是一蹴而就的. 一些总结 下面是我在工作中,主要是Oracle环境下一些常用的SQL语句优化方法,仅供参考.当然,后续可以再深入研究下SQL执行计划.索引等. 指明需要的列 Selcet中每少提取一个字段,数据的提取速度就会有相应的提升.提升的速度还要

Oracle SQL性能优化系列

1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行an

SQL语句优化技术分析

摘自  http://www.cnblogs.com/wxj1020/archive/2008/04/27/1173638.html 最近几周一直在进行数据库培训,老师精湛的技术和生动的讲解使我受益匪浅.为了让更多的新手受益,我抽空把SQL语句优化部分进行了整理,希望大家一起进步. 一.操作符优化 1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以

sql语句优化SQL Server

MS   SQL   Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)          2.I/O吞吐量小,形成了瓶颈效应.          3.没有创建计算列导致查询不优化.          4.内存不足          5.网络速度慢          6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)          7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)   

Oracle SQL语句优化34条

非常好用的SQL语句优化34条 1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基 础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACL

常用sql语句总结(一)(查询)

常用sql语句总结(一)(查询) 数据操作语句:DML 数据定义语句:DDL 数据控制语句:DCL (执行顺序------序号) 一.基本查询: 1. SELECT * ----- 2 FROM 数据来源,- ----- 1; ---数据来源可以是多个表或者其他范围 或者 SELECT 字段,字段- -----可以列出想要查询的字段名 FROM 数据来源,--; 2.去重复查询(DISTINCT): SELECT DISTINCT 字段,字段-.. FROM 数据来源,-; 3.查询取别名: S

sql语句优化方案

怎么加快查询速度,优化查询效率,主要原则就是应尽量避免全表扫描,应该考虑在where及order by 涉及的列上建立索引. 建立索引不是建的越多越好,原则是: 第一:一个表的索引不是越多越好,也没有一个具体的数字,根据以往的经验,一个表的索引最多不能超过6个,因为索引越多,对update和insert操作也会有性能的影响,涉及到索引的新建和重建操作. 第二:建立索引的方法论为: 1.多数查询经常使用的列:2.很少进行修改操作的列:3.索引需要建立在数据差异化大的列上 利用以上的基础我们讨论一下