简单sql语句(共11篇)
简单sql语句 篇1
SQL查询语句
第一次:查询(显示)、条件、排序、空记录
第二次:通配符、生成表、文件(记事本)、数组、临时表,数学函数、分组、嵌套查询
第三次:插入记录、删除记录、更新记录 第四次:超连接、新建(打开)数据库、表的建立、表的删除、第五次 表结构的修改,添加记录 显示同张芳同一天出生的学生的信息 格式:
1、查询(显示)记录
显示所有男学生的学号,姓名,性别 区分:字段、条件、表名
Select 字段名列表(*)from 表名; where 条件表达式;
into table(dbf)文件名;
into cursor 临时表名;
into array 数组名;
to file 文件名;
order by 字段名列表(asc desc);
group by 字段名 having 条件;
显示所有大于平均分的学生的学号、姓名 显示同E4挣同样工资的职工信息
Select * from 职工 where 工资=(select 工资 from 职工 where 职工号=”E4”)职工(仓库号C(10),职工号 C(10),工资 N(10,2))
显示所有工资大于1500的员工的仓库号、职工号及所在的城市
2、插入记录
Insert into 表名(字段名列表)values(记录值)
3、删除记录
Delete from 表名 where 条件
4、更新记录
Update 表名 set 字段名=记录值; Where 条件
5、表的删除
drop table 表名
6、表的建立
create table 表名(字段名 数据类型(宽度))
7、表结构的修改select * from 职工where 职工号!=“E4” AND 工资=(select 工资 from 职工 where 职工号=“E4”)
alter table 表名
1)增加字段
alter table student add 身份证号 c(10)
2)删除字段
alter table student drop colum 身份证号
3)修改字段名
alter table student rename colum 出生日期 to 出生年月
4)增加字段有效性规则
alter table student alter 成绩 set check 成绩>=0 and 成绩<=100;
error “成绩输入错误,成绩应该在0-100之间”
5)删除字段有效性规则
alter table student alter 成绩 drop check 注意:
以上题目中用到的 SQL语句粘贴到计事本文件XY.TXT中(每行一条语句)。对两个表操作的方法:
1)同时打开两个表
select 仓库.仓库号,城市,职工号,工资 from 仓库,职工;
where 职工.仓库号=仓库.仓库号 and 工资=1250
2)超连接(内连接、左连接、右连接、全连
接)
内连接:只显示符合条件的记录
左连接:显示符合条件的记录及第一个表中不符合条件的记录
右连接:显示符合条件的记录及第二个表中不符合条件的记录
全连接:显示符合条件的记录及第一、二个表中不符合条件的记录
成绩表(score)
学号姓名课程名成绩 2001张三计算机10 2003张四英语20 2001张三语言30 2005张三数据40 2003张四计算机50
Select sum(成绩)from score group by 学号
Select sum(成绩)from score group by 课程名
select 字段名列表(*)from 表名;where 条件;
order by 字段名列表 asc|desc;
into table(dbf)表名;
into array 数组名;
to file 文件名;
into cursor 临时表名
题目练习
实现以下功能:在考生文件夹下,打开“陶的数据库”的数据库,并利用SQL语句在该数据库中新建一个表:gongzi(职工号 c(4),实发工资 n(7,0)),将zhigong表中基本工资大于1330(含1330)的记录存储在gongzi表中,其中实发工资为:基本工资+加班费(白天20,晚上30),最后将所有的SQL语句保存到考生目录下的sqlanswer.txt文件中(自行建立,一行一条语句)
open database 陶的数据库
create table gongzi(职工号 c(4),基本工资 n(7,2))
select 职工号,基本工资+白班*20+晚班*30 from zhigong;where 基本工资>1350 into array xy
insert into gongzi from array xy
简单sql语句 篇2
关键词:SQL,优化策略,数据库性能,谓词
0 引言
查询是数据库中最基本、最常用、最复杂的操作。在数据库的管理信息系统中,查询操作是所有数据库操作中所占据比重最大的操作。当数据库系统积累到一定程度,若查询时采用单条顺序扫描,那么扫描一遍所有的记录可能就得花上几十分钟,甚至几小时,这样的系统就失去了现实的使用价值。采取什么样的查询策略,使查询时间降为几分钟或者几秒钟,就是这里需要研究的查询优化问题。
1 优化原理[1]
查询优化力图找出给定表达式等价,但执行效率更高的一个表达式,一个查询往往会有许多实现方法,关键是如何找出一个与之等价的且操作时间又少的表达式,查询优化关注的问题是怎样省时、省空间以及效率高。优化的核心问题是尽可能减少查询中各表的参与加工的数据量,从而达到优化时间和空间的目的。
2 SQL优化的方法
2.1 模糊匹配的避免
LIKE关键字支持通配符匹配,技术上称为正则表达式。但这种匹配特别耗费时间,尽量避免使用模糊匹配。例:
即使在rx score字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。
可改写为:
这样,在执行查询时就会利用索引来查询,显然会大大提高速度。
2.2 逻辑表达式的等价变换
由于执行引擎对各种谓词的处理方法不同,因此把逻辑表达式重写成等价的且效率较高的表达式是提高查询效率的有效方法,同时也是切实可行的[2]。通过查阅大量的文献资料以及大量的实验,分析了RDBMS执行引擎对各种谓词执行效率的不同,总结出以下几种逻辑表达式转换规则:
2.2.1 将多个OR连接的表达式转化为ANY表达式
当条件表达式中同层次上出现由连接词OR连接的表达式,并且OR所连接的表达式的左表达式相同且谓词符号也相同时,那么可以将这些表达式合并为一个右表达式用ANY来描述的表达式。例:
可改写为:
2.2.2 将ANY或ALL转化为简单的比较表达式
当谓词的右表达式为ANY或ALL的形式,并且ANY(ALL)包含的各表达式均有固定值,并且可以比较大小,则可根据谓词符号(仅限于比较大小的操作符)将ANY(ALL)重写为简单的比较表达式。例:
x>ANY(100,200,300) 可改写为:x>100;
x>ALL(100,200,300) 可改写为:x>300
2.2.3 将BETWEEN…AND转化为AND连接的表达式
可以把由BETWEEN expr1 AND expr2的形式重写为用AND连接的两个表达式,效率往往有一定的提高。例:
可改写为:
2.2.4 将IN谓词表达式转换为OR连接的谓词表达式
例:年龄IN(20,30,40)
可写为:年龄=20 OR年龄=30 OR年龄=40
以上提到的4类谓词重写规则均有其特定的条件,在条件满足的情况下才可以使用。对于简单谓词的重写,每条规则提高的效率可能不太明显,但如果查询语句的WHERE条件同时使用多条规则进行重写时,效率的提高将非常可观。
2.3 子查询合并
子查询合并是将某些特定的子查询重写为等价的多个表的连接操作。子查询合并的作用在于能使查询语句的层次尽可能地减少,从而可提高查询的效率。子查询合并的一般规则为:
(1)如果外层查询的结果没有重复,即SELECT子句中包含主码,则可以合并其子查询,并且合并后的SELECT子句前应加上DISTINCT标志;
(2)如果外层查询的SELECT子句中有DISTINCT标志,那么可以直接进行子查询合并;
(3)如果内部子查询结果没有重复元组,则可以合并。
例:查询选修002号课程的学生基本信息。
用子查询的方法如下所示,例:
可改写为:
2.4 用集合运算来代替逻辑运算
0R在嵌套查询中,表的顺序存取对查询效率可能产生致命的影响,避免这种情况的方法就是对连接的列进行索引。例如两个表:student(sno,sname,age)和sc(sno,cno,score)。如果两个表要做连接,就要在“sno”这个连接字段上建立索引。还可以使用并集来避免顺序存取,尽管在所有检查列上都有索引,但某些形式的WHERE子句强迫优化器使用顺序存取。下面的查询将强迫对student表执行顺序操作:
OR xb=′计算机系′
虽然在sno和系别名上都建有索引,但是在上面的语句中优化器还是使用顺序存取的方法扫描整个表因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:
UNION SELECT*FROM student WHERE xb=′计算机系′
2.5 多表连接优化
最能体现查询复杂性的就是多表连接,多表连接操作往往要耗费大量的CPU时间和内存,因此多表连接查询性能优化往往是SQL优化的重点与难点[3]。
2.5.1 充分利用连接条件
在某种情况下,两个表之间可能不只一个的连接条件,这时在WHERE子句中将连接条件完整的写上,有可能大大提高查询速度。例:
这里,第二句将比第一句执行快得多。
2.5.2 先筛选后连接
当查询多个数据表时,要先过滤后再连接。例:
它们的执行效率相差很大。第一个查询语句首先将两个数据表按照用户ID进行连接,然后再将符合条件的记录筛选。由于两个数据表进行连接时记录有些是以后还要筛选掉的,这显然会占用更多的时间,且多个数据表连接是笛卡儿积运算,消耗的时间会随着记录个数的增加很快地增长。第二个查询语句克服了这个缺点,首先筛选出符合条件的记录,减少了进行连接的记录个数,然后再执行连接查询,大大提高了查询效率。
3 结语
查询优化要抓住关键问题,对于数据库应用程序,重点在于如何提高SQL的执行效率。在数据库的开发和维护过程中,查询的优化设计可以提高系统性能,对于数据量大的数据库系统尤为重要。以上介绍的几种优化策略使查询在时间和空间上提高了系统的性能,在一定程度上提高了查询效率。
参考文献
[1]王珊,萨师煊.数据库系统概论[M].4版.北京:高等教育出版社,2006.
[2]丁宝康,董健全.数据库实用教程[M].2版.北京:清华大学出版社,2003.
[3]范剑波,张晓云.网络数据库技术与应用[M].西安:西安电子科技大学出版社,2004.
[4]刘志成,彭勇.数据库系统原理与应用[M].北京:机械工业出版社,2007.
[5]罗运模.SQL Server数据库系统基础[M].北京:高等教育出版社,2006.
[6]宋瀚涛,李新社.数据库编程与应用[M].北京:电子工业出版社,1998.
[7]史嘉权.数据库系统概论[M].北京:清华大学出版社,2006.
[8]马李明,王守桃,徐艳蕾.SQL语句的优化在提高数据查询中的应用[J].电脑知识与技术,2008(20):200,223.
简单sql语句 篇3
关键词:T-SQL语句;数据库;数据表
SQL,即Structured Query Language,结构化查询语句,是关系型数据库的标准。Oracle使用的SQL被称为PL-SQL,而SQL Server使用的则被称为T-SQ(Transact-SQL)。T-SQL语言包括数据定义语言、数据控制语言和数据操纵语言等三种类型。
一、T-SQL语言简介
1.数据定义语言
数据定义语言(Data Definition Language,DDL)用于创建数据库和数据库对象,为数据库操作提供对象。常用的数据定义语言有:
(1)CREATE TABLE,用于建立数据表;
(2)DROP TABLE,用于删除数据表;
(3)ALTER TABLE,用于修改数据表。
例如,使用T-SQL语言,在StuSelDB数据库中创建名为CourseType的表,该表包含CourseTypeID、CourseTypeName两列,可以利用以下命令实现:
USE StuSelDB
CREATE TABLE CourseType
(CourseTypeID int NOT NULL,
CourseTypeName varchar(10) NOT NULL)
GO
2.数据控制语言
数据控制语言(Data Control Language ,DCL)用来执行有关安全管理的操作,包括对表和视图的访问权限及对数据库操作事务的控制。
GRANT:将指定的安全对象的权限授予相应的主体。
DENY:拒绝授予主体权限,并且防止主体通过组或角色成品继承权限。
REVOKE:删除授予的权限。
例如,将CourseType表的查询权限授予public角色,可以利用以下命令实现:
GRANT SELECT ON CourseType TO public
GO
3.数据操纵语言
数据操纵语言(Data Manipulation Language,DML)用于操纵表和视图中的数据。其中,
SELECT命令,用于查询;
INSERT命令,用于插入;
DELETE命令,用于删除;
UPDATE命令,用于更新。
例如,查询CourseType表中CourseTypeID和CourseTypeName两列数据,编辑两行数据,可以利用以下命令实现:
SELECT CourseTypeID,CourseTypeName
FROM CourseType
二、使用T-SQL操作数据库
1.创建数据库
命令格式为:
CREATE DATABASE database_name
[
ON[PRIMARY]
[(NAME=logical_name,FILENAME=path
[,SIZE=database_size]
[,MAXSIZE=database_maxsize]
[,FILEGROWTH=growth_increment])
[,FILEGROUP filegroup_name
[(NAME=datafile_name FILENAME=path
[,SIZE=datafile_size]
[,MAXSIZE=datafile_maxsize]
[,FILEGROWTH=growth_increment])]]
]
[LOGON
[(NAME=logfile_name FILENAME=path
[,SIZE=datafile_size]
[,MAXSIZE=database_maxsize]
[,FILEGROWTH=growth_increment])]
]
例如,创建名为StuSelDBXL的数据库,该数据库包含主数据文件、辅助数据文件和日志文件各一个,均放在“D:\DATA”目录下。
CREATE DATABASE StuSelDBXL
ON PRIMARY
(NAME=StuSelDBXL,
FILENAME='D:\DATA\StuSelDBXL.mdf',
SIZE=5MB,
MAXSIZE=200MB,
FILEGROWTH=1MB),
(NAME=StuSelDBXL1,
FILENAME='D:\DATA\StuSelDBXL1.ndf',
SIZE=3MB,
MAXSIZE=UNLIMITED,
FILEGROWTH=1MB )
LOG ON
(NAME=StuSelDBXL_log,
FILENAME='D:\DATA\StuSelDBXL_log.ldf',
SIZE=1MB,
MAXSIZE=20MB,
FILEGROWTH=10% )
GO
2.修改数据库
命令格式为:
ALTER DATABASE databasename
{ADD FILE…
REMOVE FILE…
MODIFY FILE…
MODIFY NAME=…
ADD FILEGROUP…
REMOVE FILEGROUP…
MODIFY FILEGROUP…
…
}
例如,修改刚才创建的数据库,将主数据文件的MAXSIZE改为UNLIMITED,删除辅助数据文件StuSelDBXL1.ndf。
ALTER DATABASE StuSelDBXL
MODIFY FILE
(NAME=StuSelDBXL,
MAXSIZE=UNLIMITED)
GO
ALTER DATABASE StuSelDBXL
REMOVE FILE StuSelDBXL1
GO
3.使用T-SQL创建表
命令格式为:
Createtable [database_name.[ower].|owner.]table_name
({
|column_nameascomputed_column_expression}[,…n])
[on{filegroup|DEFAULT}]
[TEXTIMAGE_ON{filegroup|DEFAULT}]
[[DEFAULT constant_expression]|[INDENTITY[(seed,increment)]]]
[
例如,在StuSelDB数据库中,创建一个院系信息表DepInfo。
USE StuSelDB
CREATE TABLE DepInfo
(DepInfoID int PRIMARY KEY IDENTITY(1,1),
DepInfoCode char(3) NOT NULL,
DepInfoName varchar(50) NOT NULL,
DepInfoPreOfTech int DEFAULT 0,
DepInfoAssTech int DEFAULT 0
)
GO
4.使用T-SQL修改表
命令格式为:
ALTER TABLE table_name
{ALTER COLUM column_name
…
ADD…
DROP…
}
例如,向表中添加列。向ClassInfo表中添加名为Ctest的列,数据类型为int,不为空。
ALTER TABLE ClassInfo
ADD Ctest int NOT NULL
GO
SQL版本也经历了SQL-89、SQL-92、SQL-99、SQL-2003及SQL-2006。T-SQL具有编程结构简单、直观简洁、易学易用等特点,因而受到用户的喜爱。
参考文献:
[1]李锡辉.SQL Server2008数据库案例教程[M].北京:清华大学出版社,2011.
[2]张素青.SQL Server2008数据库应用技术[M].北京:人民邮电出版社,2013.
[3]韩永印.SQL Server2008 数据库项目教程[M].北京:人民邮电出版社,2013.
[4]王德永.数据库原理与应用SQL Server版项目式[M].北京:人民邮电出版社,2011.
[5]徐守祥.数据库应用技术—SQL Server2005篇(第2版)[M].北京:人民邮电出版社,2008.
实验六SQL语句 篇4
一、实验目的(1)进一步掌握查询的概念和方法。
(2)熟练掌握单表查询的select语句。
(3)熟练掌握聚合函数的使用。
(4)熟练掌握连接查询方法
(5)熟练掌握嵌套查询方法
(6)掌握创建和管理视图的方法。
二、实验内容
1、查询时改变列标题的显示:
检索全体学生的学号、姓名、籍贯信息,并分别加上“学号”、“姓名”、“籍贯”的别名信息。SQL语句:
2、条件查询
(1)查询选修了课程号为“002”,且成绩大于80的学生的学号。
SQL语句:
(2)某些学生选修某门课程后没有参加考试,所以有选课记录,但没有考试成绩,查询缺少成绩的学生的学号和相应的课程号。
SQL语句:
3、基于IN子句的数据查询
从课程表中查询出“高数”、“C语言程序设计”的所有信息。
SQL语句:
4、基于Like子句的查询
从学生表中分别检索出姓张的所有同学的资料;检索名字的第二个字是“红”或“虹”的所有同学的资料。
SQL语句:
5、查询经过计算的值。
查询全体学生的姓名及其出生年份,需为计算值取别名“出生年份”。
SQL语句:
6、使用ORDER BY语句对查询的结果进行排序
显示所有学生的基本信息,并按学生的年龄的降序排列。
SQL语句:
7、使用Group子句进行查询
汇总总分大于是150分的学生的学号及总成绩。
8、使用聚合函数
计算“002”号课程的学生平均成绩、最高分、最低分。
SQL语句:
9、查询与“张虹”在同一个班级的学生学号、姓名、所属系。
(嵌套查询)SQL语句:
连接查询T-SQL语句:
10、创建一个名为stuview的视图,能检索出每位选课学生的学号、姓名、课程名、总成绩。SQL语句为:
11、创建一个名为stuview1的视图,从数据库XSGL的student表中查询出性别为“男”的所有学生的资料。并在创建视图时使用with check option。(注:该子句用于强制视图上执行的所有修改语句必须符合由Select语句where中的条件。)
SQL语句为:
13、管理视图中的数据
1)从视图stuview1查询出籍贯为“内蒙”的学生资料。
SQL语句:
思考:是否student表中所有籍贯为内蒙的同学都被查询出来了?
2)向视图stuview1中插入一行数据。学号:1006,姓名:赵青,籍贯:内蒙,性别:男,年龄:22。
SQL语句:
原student表中的内容有何变化?
思考:如向视图stuview1中插入一行数据。学号:1007,姓名:赵静,籍贯:内蒙,性别:女,年龄:22。
会出现什么样的结果?
原student表中的内容有何变化?
3)修改视图stuview1中的数据。
将stuview1中、姓名为“赵青”同学的年龄改为20岁。
SQL语句:
原student表中的内容有何变化?
4)从视图中stuview1将籍贯为内蒙、姓名为“赵青”同学删除。
简单sql语句 篇5
1、实验目的:
(1)了解SQL Server数据库的逻辑结构和物理结构;
(2)掌握使用SQL语句修改数据库的方法;
2、实验准备:
(1)要明确能够修改数据库的用户必须是系统管理员,或者是被授权使用CREATE DATABASE语句的用户;
(2)修改数据库必须要明确:除存储位置,即物理文件名不能修改外,其它项均可以修改,包括数据库名、数据库大小和增长量等数据;
(3)了解使用SQL语句修改数据库的方法。
3、实验内容:
(1)删除实验三中创建的数据库;
(2)用自己名字创建一个数据库,包含一个主数据文件data1和一个日志文件log1,最大值都是5M;增长量分别为10%和1M;存储在自己的文件夹下;
(3)添加一个数据文件data2,最大值为3M;
(4)添加一个日志文件log2,最大值为4M;
(5)添加一个文件组group1;
(6)添加一个次数据文件data3放在文件组group1中;
(7)修改数据文件data2,将最大值改为5M;
(8)删除日志文件log1;
(9)删除次数据文件data3、data2;
(10)修改文件组,将group1改名为group2;
(11)删除文件组group2;
(12)将log2的增长量改为1M。
(13)缩小该数据库的大小,保留自由空间1M,保留释放的文件空间。
(14)将数据库的日志文件log2缩小到3M。
数据库SQL语句十题 篇6
1.查询所有学生的基本信息,并按学号降序排列
SELECT * FROM STUDENT
ORDER BY sno DESC;
2.查询系别代码为“02”的女同学信息
SELECT * FROM STUDENT
WHERE ssex=’女’ and sdept=‘02’;
3.查询学生的总人数
SELECT COUNT(*)AS 学生总人数
FROM STUDENT;
4.所有选修课学生的姓名,课程名及成绩
SELECT sname,cname,grade
FROM STUDENT,COURSE,SC
WHERE STUDENT.sno=SC.sno and COURSE.cno=SC.cno;
5.不及格学生姓名(合并重复项)
SELECT distinct sname
FROM SC,STUDENT
WHERE grade<=60 and STUDENT.sno=SC.sno;
6.查询学号为“011110”的学生的哪些课程的成绩比他数据库的成绩要高 SELECT cno
FROM COURSE
WHERE sno=’011110’ and grade>(SELECT grade FROM COURSE,SC
WHERE cname=’数据库’ and sno=‘011110’ and
COURSE.cno=SC.cno);
7.查询选修课在3门以上(包括3门)的学生学号及选课门数 SELECT sno,COUNT(*)AS 选修门数
FROM SC
GROUP BY sno HAVING COUNT(*)>=3;
8.查询学号为“011110”的学生的平均成绩,并以平均成绩命名 SELECT AVG(grade)AS average grade
FROM SC
WHERE sno=’011110’;
9.查询计算机系或英语系的所有学生的个人信息
SELECT*FROM STUDENT
WHERE sdeptIN(SELECT sdept FROM DEPT
WHERE sdname=’计算机系’OR sdname=’英语系’);
10.查询与“罗宇波”同一个系的学生情况
SELECT * FROM STUDENT
WHERE sdept=(SELECT sdept FROM STUDENT
简单sql语句 篇7
1 SQL语句处理流程
1.1 打开游标
从上图可以看出处理SQL语句的第一步就是要打开一个游标, 事实上, 一个完整的SQL处理过程就是一个游标的生命周期。
1.2 共享SQL
O r a c l e内存中有一个区叫S H A-RED_POOL, 这个区的主要作用就是将SQL语句存放在这个区内, 当客户发出一个新的SQL语句, 数据库引擎首先会到这个区查找是否有相同的SQL, 如果有, 则避免了解析、分析索引、制定执行计划等一系列的动作。如果没有则需要进行hard parse。
1.3 绑定变量
如果在SQL中指定了绑定变量, 需要在这个阶段给SQL附上绑定变量的值。
1.4 并行处理
如果SQL需要进行并行处理, 在这一阶段需要把整个SQL分割成多个并行的部分。
1.5 执行查询
Oracle按照执行计划指定的方式执行SQL, 执行UPDATE和DELETE语句时, 必须将行锁定, 以免其他用户修改。Oracle先从数据库缓冲区中寻找是否存在所要的数据块, 如果存在, 就直接读或修改, 否则从物理文件中读到数据库缓冲区中。
1.6 返回结果
对SELECT语句需要返回结果的语句, 首先看是否需要排序, 需要, 则排序后返回给用户, 然后根据内存的大小不同, 可以一次取出一行数据, 也可以一次取一组数据。这时, 可能要用到数据结构中的外部排序, 并归排序等算法, 所以如内存允许的话, 会在很大程度上提高性能。
2 影响SQL性能的原因
影响SQL性能的因素很多, 如初始化参数设置不合理、导入了不准确的系统及模式统计数据从而影响优化程序 (CBO) 的正确判断等, 这些往往和DBA密切相关。纯粹从SQL语句出发, 笔者认为影响SQL性能不外乎以下四个重要原因。
(1) 在大记录集上进行高成本操作, 如使用了引起排序的谓词等。
(2) 过多的I/O操作 (含物理I/O与逻辑I/O) , 最典型的就是未建立恰当的索引, 导致对查询表进行全表扫描。
(3) 处理了太多的无用记录, 如在多表连接时过滤条件位置不当导致中间结果集包含了太多的无用记录。
(4) 未充分利用数据库提供的功能, 如查询的并行化处理等。
3 SQL优化解决方案
通常, 一个关系数据库服务器上的SQL进程要使用该服务器60%~90%的资源。一般来说, 数据库应用上60%的性能问题是因为运行着效率很低的SQL语句, 而其中30%SQL语句的性能是可以被显著改进提升的。
3.1 避免使用<>和!=
<>和!=都是不等于的意思, 但在SQL开发过程中尽量不要使用, 因为这个关键字会造成索引失效, 降低查询效率。下面是使用表client_info (客户信息表) 进行测试的情况, 其中在cl_no (客户编号) 列上建立了索引。
3.2 避免隐式转换
隐式转换是最容易被开发人员忽视的一点, 因为它并不影响查询结果, 但它却影响了查询效率, 在查询过程中, 由于数据类型的不符合, 造成隐式的调用to_char或to_number函数。下面采用USER_INFO (用户信息表) 来测试这一过程, 如表1所示。
◆查询用户名称为101的客户信息, 下面是没有隐式转换的查询:
从测试结果很容易看出:第二个查询中索引失效了, 这是因为ORACLE数据库在解析过程中后台进行了隐式转换user_name=to_char (101) 造成的。
3.3 选择最有效率的表名顺序
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名, 因此FROM子句中写在最后的表 (基础表) 将被最先处理, 在FROM子句中包含多个表的情况下, 必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接首先, 扫描第一张表 (FROM子句中最后的那个表) 并对记录进行排序, 然后扫描第二张表 (FROM子句中最后第二个表) , 最后将所有从第二张表中检索出的记录与第一个表中合适记录进行合并。下面是对这一理论的验证, 其中用户信息表user_info有999条数据, 合同信息表cont_info有32000条数据。
这一结果表明, 合理的表的连接顺序对数据库性能的提高是很有帮助的。
4 结语
简单sql语句 篇8
关键词:SQL;Oracle;优化
中图分类号:TP311 文献标识码:A文章编号:1007-9599 (2011) 08-0000-02
SQL Optimization&Analyze in Oracle Database
Wang Yue
(CNOOC Gas&Power Group,Beijing100027,China)
Abstract:Executing each SQL statement,Oracle have to implement many steps.Each stepmay be physically retrieve data from the database row or rows of data in some way prepared.The statement where the Oracle used to execute those statements of combination of these steps is called an execution plan.execution plan is the most complex and most critical part in optimization of SQL,only know how Oracleinternally execute SQL statement,we can confirm that the execution plan where the optimizationr selected as suitable or not.
Keywords:SQL;Oracle;Optimization
一、引言
执行每个SQL语句,Oracle需要实现很多步骤。Oracle用来执行语句的这些步骤的组合被称之为执行计划。执行计划是SQL优化中最为复杂也是最为关键的部分,只有知道了Oracle在内部到底是如何执行该SQL语句后,我们才能知道优化器选择的执行计划是否为最优的。如何分析执行计划,从而找出影响性能的主要问题。下面先从分析SQL语句执行步骤开始介绍,再介绍如何分析执行计划。优化器有时也被称为查询优化器,这是因为查询是影响数据库性能最主要的部分,优化器是所有关系数据库引擎中的最神秘、最富挑战性的部件之一,从性能的角度看也是最重要的部分,它性能的高低直接关系到数据库性能的好坏。
二、Oracle的优化规则
(一)什么是优化
优化是选择最有效的执行计划来执行SQL语句的过程,这是在处理任何数据的语句(SELECT,INSERT,UPDATE或DELETE)中的一个重要步骤。对Oracle来说,执行这样的语句有许多不同的方法,譬如说,将随着以什么顺序访问哪些表或索引的不同而不同。所使用的执行计划可以决定语句能执行得有多快。Oracle中称之为优化器(Optimizer)的组件用来选择这种它认为最有效的执行计划。由于一系列因素都会影响语句的执行,优化器综合权衡各个因素,在众多的执行计划中选择认为是最佳的执行计划。然而,应用设计人员通常比优化器更知道关于特定应用的数据特点。这是需要人工干预数据库优化的主要原因。
看下面这个SQL(pro*c):
EXEC SQL UPDATE employees
SET salary=1.10*salary
WHERE department-id=var-department-i
Oracle把它分成下列步骤来执行:
第1步:Create a Cursor
第2步:Parse the Statement
第3步:Describe Results of a Query
第4步:Define Output of a Query
第5步:Bind Any Variables
第6步:Parallelize the Statement
第7步:Run the Statement
第8步:Fetch Rows of a Query
第9步:Close the Cursor
下面来详细分析这些步骤:
第1步:Create a Cursor
由程序接口调用创建一个游标。任何SQL语句都会创建它,特别在运行DML语句时,都是自动创建游标的,不需要开发人员干预。多数应用中,游标的创建是自动的。而在预编译程序(pro*c)中游标的创建,可能是隐含的,也可能显式的创建。在存储过程中也是这样的。
第2步:Parse the Statement
语法分析分别执行下列操作:翻译SQL语句,验证它是合法的语句,即书写正确。实现数据字典的查找,以验证是否符合表和列的定义,在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义,验证为存取所涉及的模式对象所需的权限是否满足。
第3步:Describe Results of a Query
描述阶段只有在查询结果的各个列是未知时才需要;例如,当查询由用户交互地输入需要输出的列名。在这种情况要用描述阶段来决定查询结果的特征(数据类型,长度和名字)。
第4步:Define Output of a Query
在查询的定义阶段,你指定与查询出的列值对应的接收变量的位置、大小和数据类型,这样我们通过接收变量就可以得到查询结果。如果必要的话,Oracle会自动实现数据类型的转换。这是将接收变量的类型与对应的列类型相比较决定的。
第5步:Bind Any Variables
在该例中,Oracle需要得到对department-id列进行限定的值。得到这个值的过程就叫绑定变量(binding variables)决定此语句最佳的执行计划将它装入共享SQL区对分布的语句来说,把语句的全部或部分路由到包含所涉及数据的远程节点
第6步:并行执行语句(Parallelize the Statement)
并行化可以导致多个服务器进程(oracle server processes)为同一个SQL语句工作,使该SQL语句可以快速完成,但是会耗费更多的资源,所以除非很有必要,否则不要使用并行查询。
第7步:Run the Statement
Oracle拥有所有需要的信息与资源,因此可以真正运行SQL语句了。如果该语句为SELECT查询或INSERT语句,则不需要锁定任何行,因为没有数据需要被改变。
第8步:Fetch Rows of a Query
在fetch阶段,行数据被取出来,每个后续的存取操作检索结果集中的下一行数据,直到最后一行被取出来。上面提到过,批量的fetch是优化的技巧之一。
第9步:Close the Cursor
SQL语句处理的最后一个阶段就是关闭游标
(二)Oracle的优化器
优化器有时也被称为查询优化器,这是因为查询是影响数据库性能最主要的部分,不要以为只有SELECT语句是查询。实际上,带有任何WHERE条件的DML语句中都包含查询要求。在ORACLE的发展过程中,一共开发过2种类型的优化器:基于规则的优化器和基于代价的优化器。这2种优化器的不同之处关键在于:取得代价的方法与衡量代价的大小不同。现对每种优化器做一下简单的介绍:RBO(rule base optimization)基于规则和CBO(cost base optimization)基于成本。
三、SQL执行计划
(一)分析执行计划
假定A、B、C都是不是小表,且在A表上一个组合索引:A(a.col1,a.col2),注意a.col1列为索引的引导列。考虑下面的查询:
select A.col4
from A,B,C
where B.col3=10 and A.col1=B.col1 and A.col2=C.col2 and C.col3=5
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimization=CHOOSE
1 0 MERGE JOIN
2 1 SORT(JOIN)
3 2 NESTED LOOPS
4 3 TABLE ACCESS(FULL)OF'B'
5 3 TABLE ACCESS(BY INDEX ROWID)OF'A'
6 5 INDEX(RANGE SCAN)OF'INX_COL12A'(NON-UNIQUE)
7 1 SORT(JOIN)
8 7 TABLE ACCESS(FULL)OF'C'
Statistics
----------------------------------------------------------
0 recursive calls
8 db block gets
6 consistent gets
0 physical reads
0 redo size
551 bytes sent via SQL*Net to client
430 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts(memory)
0 sorts(disk)
6 rows processed
执行计划:
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimization=CHOOSE
1 0 MERGE JOIN
2 1 SORT(JOIN)
3 2 NESTED LOOPS
4 3 TABLE ACCESS(FULL)OF'B'
5 3 TABLE ACCESS(BY INDEX ROWID)OF'A'
7 1 SORT(JOIN)
8 7 TABLE ACCESS(FULL)OF'C'
看执行计划时,我们的关键不是看哪个操作先执行,哪个操作后执行,而是关键看表之间连接的顺序(如得知哪个为驱动表,这需要从操作的顺序进行判断)、使用了何种类型的关联及具体的存取路径(如判断是否利用了索引)在从执行计划中判断出哪个表为驱动表后,根据我们的知识判断该表作为驱动表(就像上面判断ABC表那样)是否合适,如果不合适,对SQL语句进行更改,使优化器可以选择正确的驱动表。
(二)干预执行计划
基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担。但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。此时就需要进行人为的干预,告诉优化器使用我们指定的存取路径或连接类型生成执行计划,从而使语句高效的运行。例如,如果我们认为对于一个特定的语句,执行全表扫描要比执行索引扫描更有效,则我们就可以指示优化器使用全表扫描。在ORACLE中,是通过为语句添加hints(提示)来实现干预优化器优化的目的。
hints是Oracle提供的一种机制,用来告诉优化器按照我们的告诉它的方式生成执行计划。我们可以用hints来实现:
1.使用的优化器的类型。
2.基于代价的优化器的优化目标,是all-rows还是first-rows。
3.表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid。
4.表之间的连接类型
5.表之间的连接顺序
6.语句的并行程度
除了“RULE”提示外,一旦使用别的提示,语句就会自动的改为使用CBO优化器,此时如果你的数据字典中没有统计数据,就会使用缺省的统计数据。所以建议大家如果使用CBO或HINTS提示,则最好对表和索引进行定期的分析。
Hints只应用在它们所在sql语句块(statement block,由select、update、delete关键字标识)上,对其它SQL语句或语句的其它部分没有影响。如:对于使用union操作的2个sql语句,如果只在一个sql语句上有hints,则该hints不会影响另一个sql语句。我们可以使用注释(comment)来为一个语句添加hints,一个语句块只能有一个注释,而且注释只能放在SELECT,UPDATE,DELETE关键字的后面,如果你没有正确的指定hints,Oracle将忽略该hints,并且不会给出任何错误。
参考文献:
[1]盖国强,冯春培,叶梁等.Oracle数据库性能优化(第4版)[M].北京:人民邮电出版社,2005
[2]阿弗尤尼,吴越胜,张耀辉等.Oracle 9i数据库性能调整与优化[M].北京:清华大学出版社,2005
认识数据库首先认识SQL语句 篇9
create相关
show database; 显示出现有的数据库
use database_x; 现在要使用数据库database_x
create table coffee (id int(5) not null,coffee_name var25)); 创建一张表,包含id和coffee_name两个字段
alter table coffee add taste var10); 增加新的一列
into coffee (id,coffee_name,taste,rank) value (“1”,“BlueMountain”,“well”,“5”); 插入数据
show columns from coffee; 查看表结构
show create table coffee; 查看表信息,包括建表语句
alter table student rename ss; 改变表名
alter table ss drop mark; 删除表ss中mark列
select语句
select * from coffee where id=“1”; 查询出id=1的所有信息
select coffee_name from coffee where id=“2”; 查询出id=2的coffee name
select * from club where id between “1” and “3”; 查询出id=1到3的条目
select * from club where id=“1” or id=“3”; 查询出id=1和id=3这两个条目
select club_name from club where mark>50; 查询出mark大于50的club
select club_name from club where mark not between 48 and 50; 查询mark不在48与50之间的club
select * from club where id in(“1”,“3”,“4”); 查询id=1,3,4的条目
select * from club where id not in(“1”,“3”,“4”);
select * from club where name like “M%r”; 通配符%表示任意长度的字符(可以是0,汉字为两个字符)
select * from club where name like “M_r”; _表示单个字符
select * from club where id in(“1”,“3”,“4”) and mark>50; 多重查询
select * from club order by mark desc; 按照mark降序排列(desc:降序,usc:升序)
数量查询相关
select count(*) from club; 查询club中有多少条记录
select count(distinct mark) from club; 不同分数的有多少条记录
select sum(mark) from club; 积分总和
select avg(mark) from club;平均积分
select max(mark) from club; 最高积分
select min(mark) from club; 最低积分
update语句
club set mark=mark-8 where id=“1”; id=1的俱乐部积分罚8分
语句
from club where id=“001”; 删除id=001的俱乐部信息
以上语句都是SQL语句增删改查最基本的部分,属于入门级别,一定要掌握。
简单sql语句 篇10
AVG(平均)COUNT(计数)MAX(最大值)MIN(最小值)SUM(总合)
运用函数的语法是:
SELECT “函数名”(“栏位名”)FROM “表格名”;
举例来说,若我们要由我们的示范表格中求出 Sales 栏位的总合,
Store_Information表格
Store_NameSalesTxn_DateLos Angeles150005-Jan-San Diego25007-Jan-1999Los Angeles30008-Jan-1999Boston70008-Jan-1999我们就打入,
SELECT SUM(Sales) FROM Store_Information;结果:
SUM(Sales)27502750 代表所有 Sales 栏位的总合: 1500 + 250 + 300 + 700,
除了函数的运用外,SQL 也可以做简单的数学运算,例如加 (+) 和减 (-)。对于文字类的资料,SQL 也有好几个文字处理方面的函数,例如文字相连 (concatenation),文字修整 (trim),以及子字串 (substring)。不同的数据库对这些函数有不同的语法,所以最好是参考您所用数据库的信息,来确定在那个数据库中,这些函数是如何被运用的。
简单sql语句 篇11
Oracle数据库是甲骨文公司的一款关系数据库管理系统,目前仍在数据库市场上占有主要份额。它一般应用于商业,政府部门,它的功能很强大,能够处理大批量的数据,在网络方面也用的非常多?由于查询操作在SQL语句中代价最大,因此,优质的查询语句可以使应用系统的性能得到大大提高。在进行可能的性能改进的检查时,首先应该检查最有可能导致性能变差的方面,包括编写拙劣的应用SQL语句、大小不合适的SGA内存结构。效率差的SQL语句执行计划。过度的文件I/O。访问数据库资源的紊乱等。因此,数据库系统的性能受到SQL语句的执行效率的影响,通过对有问题的SQL语句进行调整,可以使数据库系统的性能得到显著改善,有助于提高数据库内存区的命中率。减少I/O访问和对网络带宽的占用,探讨基于Oracle数据库的SQL语句优化具有非常重要的意义。
2 SQL语句优化技术
所谓SQL语句优化技术,就是将性能低下的SQL语句转换成目的相同的性能优异的SQL语句。优化SQL语句的传统方法是通过手工重写来对SQL语句进行优化。DBA或资深程序员通过对SQL语句执行计划的分析,依靠自己的实际工作经验,尝试对SQL语句进行重写,然后对结果和性能进行比较,从而试图找到性能较佳的SQL语句。这种传统上的作法无法找出SQL语句的所有可能写法,并且依赖于人的经验,非常耗费时间。
3 SQL语句优化
3.1 Oracle数据库对表的访问
Oracle数据库采用两种访问表中记录的方式:
(1)全表扫描
全表扫描就是对表中每条记录进行顺序的访问。Oracle采用一次读入多个数据块(database block)的方式对全表扫描进行优化。
(2)通过ROWID访问表
为了提高访问表的效率,强烈采用基于ROWID的访问方式情况。ROWID包含了表中记录的物理位置信息。Oracle数据和存放数据的物理位置之间的联系,采用索引进行实现。通常情况下,索引提供了快速访问ROWID的方法,因此那些基于索引列的查询,能够得到性能上的提高。
3.2 SQL语句编写需要满足的规则
根据上面两种Oracle访问表的方式,进行SQL语句的编写时,需要满足以下规则:
(1)尽量使用索引。
(2)选择联合查询的联合次序。在SQL语句的编写中,应该注意首先需要选择要查询的主表,因为主表要扫描整个表数据,所以主表应该数据量最小。
(3)IN或者NOT IN语句在子查询中慎重使用,可以使用(NOT)EXISTS。
(4)慎重使用视图的联合查询,尤其慎重使用比较复杂的视图之间的联合查询。一般来说,将对视图的查询分解为对数据表的直接查询能够取得更好的效果。
(5)可以在参数文件中进行SHARED_POOL_RE-SERVED_SIZE参数的设置,这个参数保留了一个连续的内存空间在SGA共享池中,对于存放大的SQL程序包非常有帮助。
(6)对于某些经常使用的存储过程,可以通过Oracle公司提供的DBMS_SHARED_POOL程序固定在SQL区中而不被换出内存,对于提高最终用户的响应时间是非常有利的。
3.3 实例
(1)通过使用索引进行SQL语句优化
例如,比较下面两条SQL语句:
语句A:SELECT deptno,deptname FROM dept WHERE deptno NOT IN(SELECT deptno FROM student);
语句B:SELECT deptno,deptname FROM dept WHERE NOTEXISTS(SELECT*FROM student WHERE dept.deptno=student.deptno);
通过执行发现,这两条查询语句实现的结果相同,但是在执行语句A时,Oracle会扫描整个student表,而建立在student表上的deptno索引没有使用到,当执行语句B时,由于在子查询中使用了联合查询,Oracle只扫描了student表中的部分数据,并利用了deptno列的索引,因此,语句B的效率比语句A的效率高。
(2)选择最有效率的表名顺序
Oracle的解析器按照从右到左的顺序对FROM子句中的表名进行处理,FROM子句中写在最后的表将最先被处理,当FROM子句中包含多个表时,必须选择记录条数最少的表作为基础表。如果有3个以上的表进行连接查询,那么,就需要选择交叉表作为基础表,交叉表就是被其他表所引用的那个表?
例如:
student表描述了location表和category表的交集?
相对于下列SQL语句更有效率:
4 结语
通过进行SQL语句优化,提高了Oracle数据库系统的性能,明显降低了其系统响应时间,提高了程序运行速度,使系统的顺利运行得到良好的保障。高效SQL语句的编写,决定了Oracle数据库运行性能的高低,因此,在实际的性能管理工作中,应加强Oracle数据库的SQL语句优化。
摘要:简要介绍SQL语句优化技术,并结合具体的事例,探讨了基于Oracle数据库的SQL语句优化。
关键词:Oracle数据库,SQL语句,优化
参考文献
[1]李学强,罗省贤.基于ORACLE系统的数据库性能优化设计[J].通信与广播电视,2006,(04).
[2]巢子杰.Oracle数据库优化探究[J].软件导刊,2010,(02).
[3]聂洪.ORACLE数据库性能的调整[J].梅山科技,2006,(S1).
[4]江骏.Oracle中SQL优化原理分析[J].计算机教育,2009,(10).
[5]邢春晖,郑智星.ORACLE数据库的管理[J].黑龙江科技信息,2010,(08).
[6]韩云波,宋莉.Oracle性能调整技术研究[J].电脑知识与技术,2010,(07).
[7]闫河.运用C#处理Oracle数据库图片[J].电脑编程技巧与维护,2010,(02).
[8]胡朝明,唐华旺.利用Oracle构建图书馆数字资源仓储系统[J].浙江理工大学学报,2010,(01).
[9]白晨星.Oracle商务智能在现代企业信息中的应用[J].中国商贸,2010,(02).
【简单sql语句】推荐阅读:
sql语句简单面试题09-09
教师节的祝福语句简单08-29
关于人情世故的语句,对生活的简单感悟07-06
SQL数据库编程学习应用语句07-18
经典语句个性签名 - 经典语句个性签名06-07
程序语句06-18
关于书籍语句06-03
淘宝评价语句06-19
励志名言语句06-19
绝情的语句06-26