SQL简介及常用sql语法汇总(包含语法格式介绍及示例) 您所在的位置:网站首页 数据库连接查询语句格式 SQL简介及常用sql语法汇总(包含语法格式介绍及示例)

SQL简介及常用sql语法汇总(包含语法格式介绍及示例)

2024-07-15 23:28| 来源: 网络整理| 查看: 265

长文警告,对照目录使用更佳,本文包含了sql语句最基本的一些用法以及其示例,推荐初学者收藏起来当手册使用 本文是在我刚开始接触sql时整理的,难免会有一些错误与瑕疵,如有问题,欢迎各位在评论区指正

文章目录 SQL概述SQL的特点综合统一高度非过程化面向集合的操作方式一种语法结构多种使用方式语言简洁,易学易用 SQL的基本概念基本表存储文件视图 数据定义模式的定义与删除定义模式删除模式 基本表的定义,删除与修改定义基本表数据类型模式与表修改基本表删除基本表 索引的建立与删除建立索引修改索引删除索引 数据字典 数据查询单表查询选择表中的若干列选择表中的若干元组消除重复的行,DISTINCTT关键字查询满足条件的元组比较大小确定范围确定集合字符匹配涉及空值的查询多重条件查询 ORDER BY语句聚集函数GROUP BY子句 连接查询等值与非等值连接查询自身连接外连接多表连接 嵌套查询概述不相关查询相关子查询 带有IN谓词的子查询带有比较运算符的子查询带有ANY(SOME)或ALL谓词的子查询带有EXISTS谓词的子查询EXISTS谓词NOT EXISTS谓词 集合查询基于派生表的查询 数据查询总结目标列表达式的可选格式聚集函数的一般格式WHERE子句的条件表达式的可选格式 数据更新插入数据插入元组插入子查结果 修改数据修改某一个元组的值修改多个元组的值带子查询的修改语句 删除数据删除某一个元组的值删除多个元组的值带子查询的删除语句 视图建立视图基于多个基表的视图基于视图的视图带表达式的视图分组视图 删除视图查询视图更新视图更新视图的限制 嵌入式SQL嵌入式SQL的处理过程主语言处理过程嵌入式SQL的处理过程 嵌入式SQL语句与主语言之间的通信SQL通信区定义用途使用方法 主变量定义类型使用方法 游标定义用途 建立和关闭数据库连接建立数据库连接关闭数据库连接 程序实例 不用游标的SQL语句不用游标的SQL语句的种类查询结果为单记录的SELECT语句非CURRENT形式的增删改语句 使用游标的SQL语句必须使用游标的SQL语句查询结果为多条记录的SELECT语句**使用游标的步骤**说明游标打开游标推进游标指针并取当前记录关闭游标 CURRENT形式的UPDATE和DELETE语句 动态SQL静态SQL与动态SQL的比较动态SQL使用过程:使用SQL语句主变量动态参数执行准备好的语句

SQL概述

SQL(Structured Query Language):结构化查询语言,是关系数据库的标准语言

SQL是一个通用的、功能极强的关系数据库语言

SQL的特点 综合统一高度非过程化面向集合的操作方式一种语法结构多种使用方式语言简洁,易学易用 综合统一 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体。可以独立完成数据库生命周期中的全部活动: 定义和修改、删除关系模式,定义和删除视图,插入数据,建立数据库;对数据库中的数据进行查询和更新;数据库重构和维护数据库安全性、完整性控制,以及事务控制嵌入式SQL和动态SQL定义 用户数据库投入运行后,可根据需要随时逐步修改模式,不影响数据库的运行。数据操作符统一 高度非过程化 非关系数据模型的数据操纵语言“面向过程”必须指定存取路径。SQL只要提出“做什么”,无须了解存取路径。存取路径的选择以及SQL的操作过程由系统自动完成。 面向集合的操作方式 非关系数据模型采用面向记录的操作方式,操作对象是一条记录。SQL采用集合操作方式 操作对象、查找结果可以是元组的集合。一次插入、删除、更新操作的对象可以是元组的集合。 一种语法结构多种使用方式

SQL是独立的语言,

​ 能够独立地用于联机交互的使用方式

SQL又是嵌入式语言

​ SQL能够嵌入到高级语言(例如C,C++,Java)程序中,供程序员设计程序时使用

语言简洁,易学易用

SQL功能极强,核心功能只用了9个动词

image-20210328132551053.png

SQL的基本概念

SQL支持关系数据库三级模式结构

image-20210328132740156.png

基本表 本身独立存在的表SQL中一个关系就对应一个基本表一个(或多个)基本表对应一个存储文件一个表可以带若干索引 存储文件 逻辑结构组成了关系数据库的内模式。物理结构对用户是隐蔽的。 视图 从一个或几个表导出的“虚表”数据库中只存放视图的定义而不存放视图对应的数据用户可以在视图上再定义视图 数据定义

SQL的数据定义功能

模式的定义与删除表的定义与删除视图的定义与删除索引的定义与删除

image-20210328132951953.png

模式的定义与删除

image-20210328133144645.png

现代关系数据库管理系统提供了一个层次化的数据库对象命名机制 一个关系数据库管理系统的实例(Instance)中可以建立多个数据库一个数据库中可以建立多个模式一个模式下通常包括多个表、视图和索引等数据库对象 定义模式

定义模式实际上定义了一个命名空间。

在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。

在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。

定义语句 CREATE SCHEMA AUTHORIZATION [||] 为用户WANG定义一个学生-课程模式S-T: CREATE SCHEMA “S-T” AUTHORIZATION WANG; 为用户ZHANG创建了一个模式TEST,并且在其中定义一个表TAB1 CREATE SCHEMA TEST AUTHORIZATION ZHANG CREATE TABLE TAB1 ( COL1 SMALLINT,COL2 INT,COL3 CHAR(20),COL4 NUMERIC(10,3),COL5 DECIMAL(5,2)); 删除模式 删除语句 DROP SCHEMA CASCADE(级联) 删除模式的同时把该模式中所有的数据库对象全部删除 RESTRICT(限制) 如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行仅当该模式中没有任何下属的对象时才能执行。 删除模式ZHANG,同时该模式中定义的表TAB1也被删除 DROP SCHEMA ZHANG CASCADE; 基本表的定义,删除与修改 定义基本表 CREATE TABLE ( [ ] [, [ ] ] … [, ] ); :所要定义的基本表的名字:组成该表的各个属性(列):涉及相应属性列的完整性约束条件:涉及一个或多个属性列的完整性约束条件

如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。

建立“学生”表Student。学号是主码,姓名取值唯一。 CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY,/*列级完整性约束条件,Sno是主码*/ Sname CHAR(20) UNIQUE,/*Sname取唯一值*/ Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) ); 建立'课程'表Course CREATE TABLE Course (Cno CHAR(4) PRIMARY KEY, Cname CHAR(40), Cpno CHAR(4),/*先修课*/ Ccredit SMALLINT, FOREIGN KEY (Cpno) REFERENCES Course(Cno)/*Cpno是外码被参照表是Course被参照列是Cno*/ ); 建立选课表SC CREATE TABLE SC (Sno CHAR(9), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY (Sno,Cno),/* 主码由两个属性构成,必须作为表级完整性进行定义*/ FOREIGN KEY (Sno) REFERENCES Student(Sno),/* 表级完整性约束条件,Sno是外码,被参照表是Student */ FOREIGN KEY (Cno)REFERENCES Course(Cno)/* 表级完整性约束条件, Cno是外码,被参照表是Course*/ ); 数据类型 SQL中域的概念用数据类型来实现定义表的属性时需要指明其数据类型及长度选用哪种数据类型 取值范围要做哪些运算

image-20210328134730711.png

模式与表

每一个基本表都属于某一个模式

一个模式包含多个基本表

定义基本表所属模式

方法一:在表名中明显地给出模式名

Create table"S-T".Student(......); /*模式名为 S-T*/ Create table "S-T".Cource(......); Create table "S-T".SC(......);

方法二:在创建模式语句中同时创建表

方法三:设置所属的模式

创建基本表(其他数据库对象也一样)时,若没有指定模式,系统根据搜索路径来确定该对象所属的模式

关系数据库管理系统会使用模式列表中第一个存在的模式作为数据库对象的模式名

修改基本表 ALTER TABLE [ ADD[COLUMN] [ 完整性约束 ] ] [ ADD ] [ DROP [ COLUMN ] [CASCADE| RESTRICT] ] [ DROP CONSTRAINT[ RESTRICT | CASCADE ] ] [ALTER COLUMN ] ; 是要修改的基本表ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件DROP COLUMN子句用于删除表中的列 如果指定了CASCADE短语,则自动删除引用了该列的其他对象如果指定了RESTRICT短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列 DROP CONSTRAINT子句用于删除指定的完整性约束条件ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型 向Student表增加“入学时间”列,其数据类型为日期型 ALTER TABLE Student ADD S_entrance DATE; /*不管基本表中原来是否已有数据,新增加的列一律为空值*/ 将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数 ALTER TABLE Student ALTER COLUMN Sage INT; 增加课程名称必须取唯一值的约束条件 ALTER TABLE Course ADD UNIQUE(Cname); 删除基本表 DROP TABLE [RESTRICT| CASCADE]; RESTRICT:删除表是有限制的。 欲删除的基本表不能被其他表的约束所引用如果存在依赖该表的对象,则此表不能被删除 CASCADE:删除该表没有限制。 在删除基本表的同时,相关的依赖对象一起删除 删除Student表 DROP TABLE Student CASCADE /*基本表定义被删除,数据被删除,表上建立的索引、视图、触发器等一般也将被删除*/ 若表上建有视图,选择RESTRICT时表不能删除;选择CASCADE时可以删除表,视图也自动删除。 例如:先在表上新建一个视图,然后删除 CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS'; 使用RESTRICT删除会报错: DROP TABLE Student RESTRICT; --ERROR: cannot drop table Student because other objects depend on it 使用CASCADE时可以删除 DROP TABLE Student CASCADE; --NOTICE: drop cascades to view IS_Student 索引的建立与删除

建立索引的目的:加快查询速度

建立索引 CREATE [UNIQUE] [CLUSTER] INDEX ON ([][,[] ]…); :要建索引的基本表的名字索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASCUNIQUE:此索引的每一个索引值只对应唯一的数据记录CLUSTER:表示要建立的索引是聚簇索引 为学生-课程数据库中的Student,Course,SC三个表建立索引。Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引 CREATE UNIQUE INDEX Stusno ON Student(Sno); CREATE UNIQUE INDEX Coucno ON Course(Cno); CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC); 修改索引 ALTER INDEX RENAME TO 将SC表的SCno索引名改为SCSno ALTER INDEX SCno RENAME TO SCSno; 删除索引 DROP INDEX /*删除索引时,系统会从数据字典中删去有关该索引的描述*/ 删除Student表的Stusname索引 DROP INDEX Stusname; 数据字典

数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有定义信息:

关系模式定义视图定义索引定义完整性约束定义各类用户对数据库的操作权限统计信息等

关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。

数据查询 SELECT [ALL|DISTINCT] [,] … FROM [, ]…|(SELECT 语句) [AS] [ WHERE ] [ GROUP BY [ HAVING ] ] [ ORDER BY [ ASC|DESC ] ]; SELECT子句:指定要显示的属性列FROM子句:指定查询对象(基本表或视图)WHERE子句:指定查询条件GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。HAVING短语:只有满足指定条件的组才予以输出ORDER BY子句:对查询结果表按指定列值的升序或降序排序 单表查询 选择表中的若干列 查询全体学生的学号与姓名。 SELECT Sno,Sname FROM Student; 查询全体学生的姓名、学号、所在系。 SELECT Sname,Sno,Sdept FROM Student; /*查询全部列, 将指定为 '*' */ 查询全体学生的详细记录 SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student; 或 SELECT * FROM Student; /*查询经过计算的值*/ 查全体学生的姓名及其出生年份 SELECT Sname,2014-Sage FROM Student;

image-20210328143954761.png

查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名 SELECT Sname,'Year of Birth: ',2014-Sage,LOWER(Sdept) FROM Student;

image-20210328144117062.png

/*别名*/ SELECT Sname NAME,'Year of Birth:' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT,执行结果3 FROM Student;

image-20210328144302488.png

选择表中的若干元组 消除重复的行,DISTINCTT关键字 查询选修了课程的学生学号 SELECT Sno FROM SC; 等价于: SELECT ALL Sno FROM SC;

image-20210328145526879.png

指定DISTINCT关键字,去掉表中重复的行 SELECT DISTINCT Sno FROM SC;

image-20210328145539431.png

查询满足条件的元组

image-20210328145651940.png

比较大小 /*=, >, =, , !=90; 带表达式的视图 定义一个反映学生出生年份的视图。 CREATE VIEW BT_S(Sno,Sname,Sbirth) AS SELECT Sno,Sname,2014-Sage FROM Student; 分组视图 将学生的学号及平均成绩定义为一个视图 CREATE VIEW S_G(Sno,Gavg) AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno; 删除视图 语句的格式: DROP VIEW [CASCADE]; 该语句从数据字典中删除指定的视图定义如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除 删除视图BT_S和IS_S1 DROP VIEW BT_S; /*成功执行*/ DROP VIEW IS_S1; /*拒绝执行*/ 要删除IS_S1,需使用级联删除: DROP VIEW IS_S1 CASCADE; 查询视图

用户角度:查询视图与查询基本表相同

关系数据库管理系统实现视图查询的方法:

视图消解法:

进行有效性检查转换成等价的对基本表的查询执行修正后的查询 在信息系学生的视图中找出年龄小于20岁的学生 SELECT Sno,Sage FROM IS_Student WHERE Sage EXEC SQL FETCH SX INTO :HSno,:Hsname,:HSsex,:HSage; /*推进游标,将当前数据放入主变量*/ if (SQLCA.SQLCODE!= 0) /*SQLCODE != 0,表示操作不成功*/ break; /*利用SQLCA中的状态信息决定何时退出循环*/ if(count++ == 0) /*如果是第一行的话,先打出行头*/ printf("\n%-10s %-20s %-10s %-10s\n","Sno“,"Sname“,"Ssex", "Sage"); printf("%-10s %-20s %-10s %-10d\n“,HSno,Hsname,Hssex,HSage); /*打印查询结果*/ printf(“UPDATE AGE(y/n)?”); /*询问用户是否要更新该学生的年龄*/ do{scanf("%c",&yn);} while(yn != 'N' && yn != 'n' && yn != 'Y' && yn != 'y'); if (yn == 'y' || yn == 'Y') /*如果选择更新操作*/ { printf("INPUT NEW AGE:"); scanf("%d",&NEWAGE); /*用户输入新年龄到主变量中*/ EXEC SQL UPDATE Student /*嵌入式SQL更新语句*/ SET Sage = :NEWAGE WHERE CURRENT OF SX; } /*对当前游标指向的学生年龄进行更新*/ } EXEC SQL CLOSE SX; /*关闭游标SX,不再和查询结果对应*/ EXEC SQL COMMIT WORK; /*提交更新*/ EXEC SQL DISCONNECT TEST; /*断开数据库连接*/ } 不用游标的SQL语句 不用游标的SQL语句的种类 说明性语句数据定义语句数据控制语句查询结果为单记录的SELECT语句非CURRENT形式的增删改语句 查询结果为单记录的SELECT语句

这类语句不需要使用游标,只需用INTO子句指定存放查询结果的主变量

根据学生号码查询学生信息 EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept FROM Student WHERE Sno=:givensno;/*把要查询的学生的学号赋给为了主变量givensno*/ INTO子句、WHERE子句和HAVING短语的条件表达式中均可以使用主变量查询返回的记录中,可能某些列为空值NULL如果查询结果实际上并不是单条记录,而是多条记录,则程序出错,关系数据库管理系统会在SQLCA中返回错误信息 查询某个学生选修某门课程的成绩。假设已经把将要查询的学生的学号赋给了主变量givensno,将课程号赋给了主变量givencno。 EXEC SQL SELECT Sno,Cno,Grade INTO :Hsno,:Hcno,:Hgrade:Gradeid/*指示变量Gradeid*/ FROM SC WHERE Sno=:givensno AND Cno=:givencno; /*如果Gradeid < 0,不论Hgrade为何值,均认为该学生成绩为空值*/ 非CURRENT形式的增删改语句

在UPDATE的SET子句和WHERE子句中可以使用主变量,SET子句还可以使用指示变量

修改某个学生选修1号课程的成绩 EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成绩已赋给主变量:newgrade*/ WHERE Sno=:givensno; /*学号赋给主变量:givensno*/ 某个学生新选修了某门课程,将有关记录插入SC表中。假设插入的学号已赋给主变量stdno,课程号已赋给主变量couno。 gradeid=-1 ; /*gradeid为指示变量,赋为负值*/ EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gradeid);/*:stdno,:couno,:gr为主变量*/ /*由于该学生刚选修课程,成绩应为空,所以要把指示变量赋为负值*/ 使用游标的SQL语句 必须使用游标的SQL语句 查询结果为多条记录的SELECT语句CURRENT形式的UPDATE语句CURRENT形式的DELETE语句 查询结果为多条记录的SELECT语句 使用游标的步骤 说明游标打开游标推进游标指针并取当前记录关闭游标 说明游标

使用DECLARE语句

EXEC SQL DECLARE CURSOR FOR ;

功能

是一条说明性语句,这时关系数据库管理系统并不执行SELECT语句

打开游标

使用OPEN语句

语句格式 EXEC SQL OPEN ;

功能

打开游标实际上是执行相应的SELECT语句,把查询结果取到缓冲区中

这时游标处于活动状态,指针指向查询结果集中的第一条记录

推进游标指针并取当前记录

使用FETCH语句

语句格式 EXEC SQL FETCH INTO [][,[]]...;

功能

指定方向推动游标指针,同时将缓冲区中的当前记录取出来送至主变量供主语言进一步处理

关闭游标

使用CLOSE语句

语句格式 EXEC SQL CLOSE

功能

关闭游标,释放结果集占用的缓冲区及其他资源

说明

游标被关闭后,就不再和原来的查询结果集相联系被关闭的游标可以再次被打开,与新的查询结果相联系 CURRENT形式的UPDATE和DELETE语句

如果只想修改或删除其中某个记录

用带游标的SELECT语句查出所有满足条件的记录

从中进一步找出要修改或删除的记录

用CURRENT形式的UPDATE语句和DELETE语句修改或删除之

UPDATE语句和DELETE语句中要用子句WHERE CURRENT OF /*表示修改或删除的是最近一次取出的记录,即游标指针指向的记录*/

不能使用CURRENT形式的UPDATE语句和DELETE语句

当游标定义中的SELECT语句带有UNION或ORDERBY子句该SELECT语句相当于定义了一个不可更新的视图。 动态SQL 静态SQL与动态SQL的比较 静态嵌入式SQL 静态嵌入式SQL语句能够满足一般要求无法满足要到执行时才能够确定要提交的SQL语句、查询的条件 动态嵌入式SQL 允许在程序运行过程中临时“组装”SQL语句支持动态组装SQL语句和动态参数两种形式 动态SQL使用过程: 使用SQL语句主变量动态参数执行准备好的语句(EXECUTE) 使用SQL语句主变量

程序主变量包含的内容是SQL语句的内容,而不是原来保存数据的输入或输出变量

SQL语句主变量在程序执行期间可以设定不同的SQL语句,然后立即执行

EXEC SQL BEGIN DECLARE SECTION; const char *stmt="CREATE TABLE test(a int);";/*SQL语句主变量,内容是创建表的SQL语句*/ EXEC SQL END DECLARE SECTION; ... EXEC SQL EXECUTE IMMEDIATE :stmt; /*执行动态SQL语句*/ 动态参数

动态参数

SQL语句中的可变元素SQL语句中的可变元素

和主变量的区别

动态参数的输入不是编译时完成绑定而是通过 PREPARE语句准备主变量和执行语句EXECUTE绑定数据或主变量来完成

使用动态参数的步骤

声明SQL语句主变量

准备SQL语句(PREPARE)

EXEC SQL PREPARE FROM ; 执行准备好的语句 语句格式 EXEC SQL EXECUTE [INTO ] [USING ]; 向TEST中插入元组 EXEC SQL BEGIN DECLARE SECTION; const char *stmt = "INSERT INTO test VALUES(?);";/*声明SQL主变量内容是INSERT语句 */ EXEC SQL END DECLARE SECTION; ... EXEC SQL PREPARE mystmt FROM :stmt; /*准备语句*/ ... EXEC SQL EXECUTE mystmt USING 100;/*执行语句,设定INSERT语句插入值100 */ EXEC SQL EXECUTE mystmt USING 200;/* 执行语句,设定INSERT语句插入值200 */


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有