精通SQL结构化查询语言详解

精通SQL结构化查询语言详解
精通SQL结构化查询语言详解

关系:是汇集在表结构中的行和列的集合,每个关系由一个或多个属性组成

关系,属性和数组这3个术语在涉及到关系模型时使用,SQL在描述这些术语时,使用的是表,列和行

联系指实体间对应关系

三范式:

1.每一列都是不可分的基本数据项,同一列中不能有多个值,每一行只包含一个实例的信

息,简言之,就是无重复的列

2.属性完全依赖于主关键字,

3.一个数据表中不包含已在其它表中已包含的非主关键字信息

SQL组成

1.数据定义语言(Data Definition Language),用于创建,修改,删除数据库对象,SQL

关键字包括CREA TE,ALTER,DROP

2.数据查询语言(Data Query Language),用于检索数据,主要SQL关键字为SELECT

3.数据操纵语言(Data Manipulation Language),用于增,删,改数据库对象中的数据,

主要SQL关键字INSERT,UPDA TE和REVOKE

4.数据控制语言(Data Control Language),用于控制用户对数据库的访问,主要SQL关

键字GRANT,DENY和REVOKE

5.其它语言要素,事务控制,程序化语言

================================== 表=============================== 创建表

增加列

删除列:有默认值,作为主键不能被删除,具有非空约束的列可以被删除

处理办法:先删除约束,再删除列

修改列:TEXT,IMAGE,NTEXT,TIMESTAMP,索引的一部分,是PRIMARY KEY或FOREIGN KEY,有缺省值,有CHECK,UNIQUE时不能改变其类型

重命名表

重命名列

================================ 数据库============================== 创建数据库

创建区分大小写的列(sql server默认不区分大小写)

================================ 索引=============================

索引:一个表的存储是由两部分存放的,一部分用来存储表的数据页面,另一部分存储索引页面,索引就存放在索引页面上。通常,索引面页相对于数据页面来说小得多,当进行数据检索时,系统先搜索索引页面,从中找到所需要数据的指针,再通过指针从数据页面中读取数据

簇索引:簇索引与数据是混为一体的

非簇索引:非簇索引具有与表的数据完全分离的结构,由于非簇索引使用索引页存储,因此比簇索引需要更多的空间,且检索效率低

创建索引

索引改名和删除

============================== 完整性控制============================ 完整性约束分3种类型:

1.与表有关的约束:是在创建有的语句中定义的一种约束,在定义列同时定义该约束称为

列约束;在列定义之后,单独定义多个列的约束称为表约束

上面在name列后面的是列约束,最后一行是表约束,它们都可以实施primary key,foreign key,unique,check约束,除此之外,列约束还可以实施not null约束,也可以这样实现

如果希望删除主表中数据时同时删除子表中相关数据时可采用

2.域约束(只能使用check约束):域可以代替数据类型使用,如

但是在sql server中不支持create domain,不过可以通过给列设置check约束实现

3.断言(只能使用check约束):sql server2k不支持

4.sql server中的完整性控制,包括规则,缺省值,触发器

规则是对表中的列或自定义数据类型的限制,规则是单独存储的,与表对象无关,即表删除不会对规则产生影响,一个规则可应用多个列,一个列最多只能应用一个规则

缺省值:性质同上

============================== 查询============================= 自然连接,自动判断相同的列,匹配连接(不灵活,不能指定匹配列)

CASE WHEN 语句

左外连接= 内连接+ 左边表中不匹配的行

右外连接= 内连接+ 右边表中不匹配的行

全外连接= 内连接+ 左边表中不匹配的行+ 右边表中不匹配的行

不管是哪种连接,DBMS总是一次执行两个表的联合,因此为了在单一查询中连接3个或以上表,就需要进行多次连接,如:查询所有教师的姓名,所在系,开设的课程名以及选修这门课的学生姓名和成绩。总是把前面的结果和后面的表进行连接

交叉连接等同于from后的表用逗号隔开,都是返回两个表中所有行的迪卡尔积

UNION可用于合并查询结果,自动消除重复行,如果不希望消除重复,必须使用UNION ALL 可查不同表中的数据,但列数,类型要匹配,还可以对最后的结果进行排序(列的序号也可)注意:多表进行UNION运算时,(A UNION ALL B)UNION C和A UNION ALL(B UNION C)结果可能不同,括号可改变连接顺序

UNION JOIN把来自一个源表中的行与另一个源表中的行联合起来,生成的结果中包括第一个表中的所有行和列和另一个表中的所有行和列。缺少的属性值用NULL表示(SQL SERVER不支持)

ROLLUP运算符,对分组进行扩展

CUBE运算符,对分组进行扩展

EXISTS子查询:用来测试集合是否为空,它总与子查询一起使用,而且只要子查询中至少返回一个值,则EXISTS判式的值为TRUE,否则为FALSE

UNIQUE子查询:用来测试子查询的结果表是否存在重复行,若没有重复行,则返回TRUE,否则返回FALSE,NOT UNIQUE正好相反,不过SQL SERVER不支持

子查询的执行要依赖于上一层查询行的当前值,这种子查询称为相关子查询,如EXISTS =========================== 存储过程与函数============================ 存储过程的优点:允许组件式编程,较快的执行速度,减少网络流量,安全

常用流程控制语句:

DECLARE用来定义一个局部变量,可用SELECT语句赋值,这个变量必须以@开头,跟着一个标识符,如下:

全局变量:冠以@@ 的变量,由系统定义,常见的有

@@error :当事务成功后,其值为0,否则为由系统产生的,最近的一个错误号(服务器:消息后面的值)

@@textsize :select语句返回的text或image数据的字节数

GOTO lable无条件转到用户定义的标号处

RETURN [int_value] :无条件的退出一个查询或一个过程,其中可选整数表达式返回给调用者一个状态值

WAITFOR :用来定义某天中的一个时刻,执行一个语句块

print 显示最长255个字符的消息

函数:只能返回单一值或表,此外,函数不能执行增删改操作标量型函数

内联表值型函数

多声明表值型函数

位非运算:要求一个负数的二进制表示方式,可以先求出它的原码,然后每位取反得出它的反码,反码再加1得出补码如:假设还是以8位二进制来表示带符号的整数-56的原码是:00111000那么它的反码是:11000111补码为:11000111+1=11001000得出,-56在计算机内部是用11001000这串二进制来表示的

================================ 触发器=============================== 触发器是一种特殊的存储过程,它在表的数据变化时发生作用,触发器可以维护数据完整性与存储过程的区别:存储过程通过其它程序启动运行,而触发器由一个事件来启动运行,并且不能接收参数

SQL支持三种类型的触发器:INSERT,DELETE,UPDA TE。当向表中插入数据,更新数据或删除数据时,触发器就被调用,通过给表定义一个或多个触发器,可以指定哪个数据修改时,可以激发触发器

执行环境:包括一到两个称为测试表的虚表,用于保存目标表更新,插入和删除的数据信息。用户不能直接修改测试表中的数据,但能在SELECT语句中使用这些表来检测INSERT,DELETE和UPDA TE的结果,各种类型触发器用到的测试表如下:

?Inserted表存入了INSERT和UPDA TE语句中的副本。在INSERT或UPDA TE语句的执

行中,这些新行同时被加到Inserted表和trigger表中。Inserted表中的行是trigger表中新行的副本

也就是更新和插入操作中,把新行同时复制到原表和Inserted表中

?Deleted表存放了Delete和Update语句中相关行的副本。在DELETE或UPDA TE语句

的执行中,这些相关行从trigger表中移到了Deleted表中。一般情况下,这两张表中无共同行

也就是更新和删除操作中,把原表中删除的行剪切到deleted表中

?一个UPDA TE效果上等价于一个DELETE再接着一个INSERT。首先“旧”行被复制

到deleted表中,然后新行被复制到trigger表和inserted表中

INSERT触发器

DELETE触发器

UPDA TE触发器

INSTEAD OF 触发器

仅执行触发器本身,而不执行具体的SQL语句(INSTEAD OF 的意思)

========================== 事务控制与并发处理========================== 事务的特性

1.原子性:指事务全有或全无的性质。也就是说,事务就作为一个工作单元,事务处理完成后,所有的工作要么都在数据库中保留下来,要么完全回滚,全部不保留2.一致性:事务完成或撤消后,应处理一致的状态,即事务中任何数据的变化符合数据定义的规则。另外,数据结束后,数据库内所有结构都必须正确。

3.隔离性:多个事务同时进行,它们之间应该互不干扰,事务过程中暂时不一致的数据不能被其它事务应用,直到数据再次一致

4.永久性:一旦事务引发了变化,事务提交以后,所做的工作就被永久的保存下来,即使硬件和应用程序发生错误,这些数据也会可靠一致

SQL中使用事务的一般过程如为:首先通过SET TRANSACTION 设置事务的属性(主要用于并发控制),再由START TRANSACTION语句开始事务。事务结束可以有两种方式:由COMMIT语句提交事务和由ROLLBACK语句回滚事务

COMMIT提交事务:该语句将成功地结束当前事务,并永久的保存事务中对于数据库的所有改变。而在未提交事务以前,这些改变是暂时的,一般情况下,在其他事务中不能看到本事务中对数据库的修改

ROLLBACK回滚事务:该语句也结束当前事务,但他当撤消该事务所做的全部工作,即事务中对于数据库的任何修改都将无效,回滚一般是指回到事务开始时的状态,但也可以在事务中设置保存点,然后回到事务指定的保存点。保存点和ROLLBACK语句一起使用,可使当前事务进行部分回滚

在SQL:1999定义中,事务即可以隐式开始,也可以显式开始,所谓隐式开始就是当执行

某些SQL语句时,事务自动开始,即这些语句必须在事务中执行。而显式事务就是通过START TRANSACTION语句来开始事务

SQL SERVER中有3种开始事务的方式:隐式,显式,自动提交(缺省)

自动提交:是指对于用户发出的每条SQL语句,SQL SERVER都会自动开始一个事务,并且在执行后自动进行提交操作来完成这个事务。可以说,在这种事务模式下,一个SQL语句就是一个事务

显示提交:以BEGIN TRANSACTION命令开始一个事务

隐式提交:是指在当前会话中,通过SET IMPLICIT_TRANSACTION ON命令设置事务类型,这时,任何DML语句(DELETE,UPDA TE,INSERT)事务都会开始一个事务,而事务的结束也是使用COMMIT或ROLLBACK

延期约束:SQL SERVER不支持,指事务中的每条语句都必须立即应用约束,还是在事务结束后再应用约束

使用ROLLBACK SA VE_POINT语句回到保存点时,事务并不终止(意味着这种语句可以和COMMIT一起被执行,而ROLLBACK和COMMIT只能执行其一,因为任一可以结束事务,再执行另一个会提示事务并没有开始)

事务隔离级别(以下开销越来越大,但出错的可能越来越小)

READ UNCOMMITTED未提交的读取:限制最少,它允许读取已经被其它用户修改但尚未提交的数据,用于结果不要求太精确的统计数据,开销少

READ COMMITTED提交读取:通过隐藏未提交的变化解决了读取“脏数据”的问题,虽然READ COMMITTED消除了读取未提交数据,但并不能防止不可重复的读取和幻影读REPEA TABLE READ可重复读取:用SELECT命令读取的数据在整个命令执行过程中由DBMS实施锁定,不会被更改

SERIALIZABLE可串行化:指的是将事务以一种顺序方式连接起来,防止一个事务影响其

它事务

总结:READ UNCOMMITTED可以读取其它用户未提交的数据,READ COMMITTED可以读取已提交的数据,REPEA TABLE READ锁定表,其它用户同时不允许更新数据(可以插入),SERIALIZABLE不允许插入

在SQL SERVER中,从数据库角度锁可以分为:

1.共享锁:共享锁锁定的资源可以被其它用户读取,但不能修改。在SELECT命令执行时,SQL SERVER通常会对对象进行共享锁定。一般情况下,加共享锁的数据页被读取完毕后,共享锁就立即被释放

2.独占锁:独占锁锁定的资源只允许进行锁定操作的程序使用,对它的任何其它操作都被拒绝。执行数据更新命令,如INSERT,UPDA TE,DELETE命令时,SQL SERVER会动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。直到更新结束,独占锁才被释放

3.更新锁:为防止死锁而设定。当SQL SERVER准备更新数据库时,它首先对数据库对象做更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL SERVER确定要进行更新数据库时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定

使用悲观锁(程序员控制锁定,而不是数据库控制(不需要代码中做任何事))可以在多个同时修改数据库的用户间实现悲观并发控制。对数据表加锁后,其他人不可操作,直到加锁用户用COMMIT命令或ROLLBACK命令解锁

SELECT * FROM TABLE [WITH] (HOLDLOCK | TABLOCKX)

SET TRANSACTION ISOLA TION LEVEL可得到相同效果(UNCOMMITTED与在所有语句中加NOLOCK相同)

数据库SQL查询语句大全

经典SQL查询语句大全 一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1. dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明:添加主键:Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col) 8、说明:创建索引:create [unique] index idxname on tab name(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!

数据库SQL查询语句大全修订稿

数据库S Q L查询语句 大全 公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]

经典SQL查询语句大全 一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definitio n only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type

注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明:添加主键:Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col) 8、说明:创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1 11、说明:几个高级查询运算词 A:UNION 运算符

SQL数据库查询语句范例

推荐一、简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和Where子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。Select nickname,email FROM testtable Where n ame=’张三’ (一) 选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。 1、选择所有列例如,下面语句显示testtable表中所有列的数据:Select * FROM testtable 2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 例如:Select nickname,email FROM testtable 3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名列名列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题: Select 昵称=nickname,电子邮件=email FROM testtable 4、删除重复行 Select语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINC T选项时,对于所有重复的数据行在Select返回的结果集合中只保留一行。 5、限制返回的行数 使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。例如: Select TOP 2 *FROM testtable Select TOP 20 PERCENT * FROM testtable (二) FROM子句 FROM子句指定Select语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。 在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和cityta ble表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定: Select username,citytable.cityid FROM usertable,citytable Where usertable.cityid=citytable.cityid 在FROM子句中可用以下两种格式为表或视图指定别名: 表名 as 别名表名别名

数据库sql查询语句上机练习1_习题_结果(单世民)

习题1 请根据给出的数据库表结构来回答相应问题: DEPT (DEPTNO INT, DNAME VARCHAR(14),LOC VARCHAR(13)); EMP (EMPNO INT,ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT, HIREDATE DATE, SAL FLOAT, COMM FLOAT, DEPTNO INT); BONUS (ENAME VARCHAR(10), JOB VARCHAR(9), SAL INT, COMM INT); SALGRADE ( GRADE INT, LOSAL INT, HISAL INT); 其中表中包含如下数据: DEPT表: EMP表: SALGRADE表:

BONUS表: 无数据 根据上面描述完成下面问题: (注意:注意保存脚本,尤其是DDL和DML,以便进行数据还原) DDL 1. 写出上述表的建表语句。此外,在DEPT上创 建名为”PK_DEPT”的主键约束,在EMP表上 创建名为”PK_EMP”的主键约束以及指向表 DEPT的外键约束”FK_DEPTNO”。 命令: Create table DEPT (DEPTNO INT NOT NULL,DNAME VARCHAR(14),LOC VARCHAR(13)); Alter table DEPT add constraint PK_DEPT PRIMARY KEY (DEPTNO); create table EMP(EMPNO INT NOT NULL,ENAME VARCHAR(10),JOB VARCHAR(9),MGR INT,HIREDATE DATE, SAL FLOAT,COMM FLOAT,DEPTNO INT); alter table EMP add constraint PK_EMP PRIMARY KEY (EMPNO); alter table EMP add constraint FK_DEPTNO foreign key(DEPTNO) references DEPT(DEPTNO);

数据库sql查询语句练习2_习题_结果(单世民)

现在有一教学管理系统,具体的关系模式如下:Student (no, name, sex, birthday, class) Teacher (no, name, sex, birthday, prof, depart) Course (cno, cname, tno) Score (no, cno, degree) 其中表中包含如下数据: Course表: Score表: Student表:

Teacher表: 根据上面描述完成下面问题: (注意:注意保存脚本,尤其是DDL和DML,以便进行数据还原)DDL 1.写出上述表的建表语句。 2.给出相应的INSERT语句来完成题中给出数据的插入。 单表查询 3.以class降序输出student的所有记录(student表全部属性) 命令:select*from Student order by class desc;

4.列出教师所在的单位depart(不重复)。 命令:select distinct depart from Teacher; 5.列出student表中所有记录的name、sex和class列 命令:select name,sex,class from Student; 6.输出student中不姓王的同学的姓名。 命令:select name from Student except select name from Student where name like'王%';或

select name from Student where name not like'王%'; 7.输出成绩为85或86或88或在60-80之间的记录(no,cno,degree) 命令:select no,cno,DEGREE from Score where degree=85 or degree=86 or degree=88 or degree between 60 and 80; 8.输出班级为95001或性别为‘女’的同学(student表全部属性) 命令:select*from Student where class=95001 or sex='女';

数据库SQL查询语句练习题

设教学数据库Education有三个关系: 学生关系S(SNO,SNAME,AGE,SEX,SDEPT);学习关系SC(SNO,CNO,GRADE);课程关系C(CNO,CNAME,CDEPT,TNAME)查询问题: (1)检索计算机系的全体学生的学号,姓名和性别; (2)检索学习课程号为C2的学生学号与姓名; (3)检索选修课程名为“DS”的学生学号与姓名; (4)检索选修课程号为C2或C4的学生学号; (5)检索至少选修课程号为C2和C4的学生学号; (6)检索不学C2课的学生姓名和年龄; (7)检索学习全部课程的学生姓名; (8)查询所学课程包含学生S3所学课程的学生学号。 (1)检索计算机系的全体学生的学号,姓名和性别; SELECT Sno,Sname,Sex FROM S WHERE Sdept ='CS'; (2)检索学习课程号为C2的学生学号与姓名; Sname ,1.SELECT SnoSname ,2.SELECT S.SnoFROM S SC , FROM SWHERE Sno IN WHERE S.Sno=SC.Sno SELECT Sno (;C2'AND https://www.360docs.net/doc/c13429430.html,o=‘ FROM SC )‘C2' WHERE Cno= DS)检索选修课程名为“”的学生学号与姓名(3表建立它们二者的表没有直接联系,必须通过SC表中,但S和C 本查询涉及到学号、姓名和课程名三个属性,分别存放在S和C S SC →联系。 C →基本思路: Cno;表中找出“DS”课程的课程号(1)首先在C ;Cno 集合中的某个元素Cno2)然后在SC表中找出Cno等于第一步给出的(送入结果表列。和SnameSno等于第二步中Sno 集合中某个元素的元组,取出Sno S(3)最后在关系中选出Sname ,SELECT SnoFROM S WHERE Sno IN SELECT Sno ( FROM SC WHERE Cno IN SELECT Cno ( FROM C );DS') WHERE Cname=‘ 的学生学号;C2或C4(4)检索选修课程号为SELECT Sno FROM SC ';'C2 OR Cno=‘C4WHERE Cno=‘

数据库SQL语句实验报告

《数据库原理及应用》实验报告 SQL语句部分 总成绩:

实验一熟悉SQL SERVER,数据定义实验 实验一成绩: 一、实验目的 1、利用查询分析器创建数据库 2、利用查询分析器用SQL语言定义基本表、索引并进行相关操作 二、实验步骤及内容 在以下实验中,使用学生-课程数据库,它描述了学生的基本信息、课程的基本信息及学生选修课程的信息。 1.创建学生课程数据库 3.创建课程关系表C : 5.将以上创建表S、C、SC的SQL命令以 .SQL文件的形式保存在磁盘上。 6、在表S上增加“出生日期”属性列。 7、删除表S的“年龄”属性列。 8、删除S姓名列的唯一值约束。 9、修改SC表成绩属性列为精确数字型。 10、在表S上,按“Sno”属性列的唯一值方式建立索引。 11、删除表SC,利用磁盘上保存的.SQL文件重新创建表SC。 12、创建教材P74页习题5中SPJ数据库中的四个关系:S、P、J、SPJ。 三、实验结果: 1.创建学生课程数据库 create database Studend; create table S ( Sno CHAR(9)PRIMARY KEY, Sname CHAR(20)UNIQUE, Ssex CHAR(2), Sage smallint, Sdept char(20), );

3.创建课程关系表C : 课程号课程名先行课学分 Cno Cname Cpno ccredit create table C ( Cno char(4)primary key, Cname CHAR(40), Cpno char(4), Ccredit SMALLINT, ); 4.创建课程关系表SC : 学号课程号成绩 Sno Cno grade create table SC ( Sno char(9), Cno char(4), Grade smallint, ); 5.将以上创建表S、C、SC的SQL命令以 .SQL文件的形式保存在磁盘上。 6、在表S上增加“出生日期”属性列。 alter table S add Sbirthday datetime; 7、删除表S的“年龄”属性列。 alter table S drop column Sage;

数据库SQL语句大全

SQL语句大全--语句功能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 -数据定义 CREATE TABLE --创建一个数据库表 DROP TABLE --从数据库中删除表 ALTER TABLE --修改数据库表结构 CREATE VIEW --创建一个视图 DROP VIEW --从数据库中删除视图 CREATE INDEX --为数据库表创建一个索引 DROP INDEX --从数据库中删除索引 CREATE PROCEDURE --创建一个存储过程 DROP PROCEDURE --从数据库中删除存储过程CREATE TRIGGER --创建一个触发器 DROP TRIGGER --从数据库中删除触发器 CREATE SCHEMA --向数据库添加一个新模式DROP SCHEMA --从数据库中删除一个模式CREATE DOMAIN --创建一个数据值域 ALTER DOMAIN --改变域定义 DROP DOMAIN --从数据库中删除一个域 --数据控制 GRANT --授予用户访问权限 DENY --拒绝用户访问 REVOKE --解除用户访问权限 --事务控制 COMMIT --结束当前事务 ROLLBACK --中止当前事务 SET TRANSACTION --定义当前事务数据访问特征 --程序化SQL DECLARE --为查询设定游标 EXPLAN --为查询描述数据访问计划 OPEN --检索查询结果打开一个游标

数据库SQL查询语句

一、简单查询语句 1. 查看表结构 SQL>DESC emp; 2. 查询所有列 SQL>SELECT * FROM emp; 3. 查询指定列 SQL>SELECT empmo, ename, mgr FROM emp; SQL>SELECT DISTINCT mgr FROM emp; 只显示结果不同的项 4. 查询指定行 SQL>SELECT * FROM emp WHERE job='CLERK'; 5. 使用算术表达式 SQL>SELECT ename,sal*13+nvl(comm,0) FROMemp; nvl(comm,1)的意思是,如果comm中有值,则nvl(comm,1)=comm; comm中无值,则nvl(comm,1)=0。 SQL>SELECT ename, sal*13+nvl(comm,0) year_sal FROM emp; (year_sal为别名,可按别名排序) SQL>SELECT * FROM emp WHERE hiredate>'01-1月-82'; 6. 使用like操作符(%,_) %表示一个或多个字符,_表示一个字符,[charlist]表示字符列中的任何单一字符,[^charlist]或者[!charlist]不在字符列中的任何单一字符。 SQL>SELECT * FROM emp WHERE ename like 'S__T%'; 7. 在where条件中使用In SQL>SELECT * FROM emp WHERE job IN ('CLERK','ANAL YST'); 8. 查询字段内容为空/非空的语句 SQL>SELECT * FROMemp WHERE mgr IS/IS NOT NULL; 9. 使用逻辑操作符号 SQL>SELECT * FROM emp WHERE (sal>500 or job='MANAGE') and ename like 'J%'; 10. 将查询结果按字段的值进行排序 SQL>SELECT * FROM emp ORDER BY deptno, sal DESC; (按部门升序,并按薪酬降序) 二、复杂查询 1. 数据分组(max,min,avg,sum,count) SQL>SELECT MAX(sal),MIN(age),A VG(sal),SUM(sal) from emp; SQL>SELECT * FROM emp where sal=(SELECT MAX(sal) from emp)); SQL>SELEC COUNT(*) FROM emp; 2. group by(用于对查询结果的分组统计)和having子句(用于限制分组显示结果)SQL>SELECT deptno,MAX(sal),A VG(sal) FROM emp GROUP BY deptno; SQL>SELECT deptno, job, A VG(sal),MIN(sal) FROM emp group by deptno,job having A VG(sal)<2000; 对于数据分组的总结: a. 分组函数只能出现在选择列表、having、order by子句中(不能出现在where中) b. 如果select语句中同时包含有group by, having, order by,那么它们的顺序是group by, having, order by。 c. 在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须出现在group by子

数据库sql查询语句练习3_习题_结果(单世民)仓库_习题

数据库结构如下: 仓库(仓库号, 城市, 面积) 订购单(职工号, 供应商号, 订购单号, 订购日期)供应商(供应商号, 供应商名, 地址) 职工(仓库号, 职工号, 工资) 具体数据如下: 仓库表: 职工表:

使用SQL语句完成: DDL 1.写出创建上述表的语句 命令: create table仓库(仓库号varchar(8)primary key,城市varchar(8),面积int); create table订购单(订购单号varchar(8)primary key,职工号varchar(8),供应商号varchar(8),订购日期nchar(8)) create table供应商(供应商号varchar(8)primary key,供应商名varchar(18),地址varchar(8)) create table职工(职工号varchar(8)primary key,仓库号varchar(8),工资int)DML 2.给出插入上述数据的insert语句 命令: insert into仓库values('WH1','北京',370) insert into仓库values('WH2','上海',500) insert into仓库values('WH3','广州',200) insert into仓库values('WH4','武汉',400) insert into订购单values('OR67','E3','S7','06/23/01') insert into订购单values('OR73','E1','S4','07/28/01') insert into订购单values('OR76','E5','S4','05/25/01') insert into订购单values('OR77','E6','S6','05/26/01') insert into订购单values('OR79','E3','S4','06/13/01') insert into订购单values('OR80','E1','S2','08/29/01') insert into订购单values('OR90','E3','S3','09/01/01') insert into订购单values('OR91','E3','S7','07/13/01') insert into供应商values('S2','名硕电子公司','苏州') insert into供应商values('S3','振华电子厂','西安') insert into供应商values('S4','华通电子公司','北京') insert into供应商values('S6','607厂','郑州') insert into供应商values('S7','爱华电子厂','北京') insert into职工values('E1','WH2',1220) insert into职工values('E3','WH1',1210) insert into职工values('E4','WH2',1250) insert into职工values('E5','WH3',1230) insert into职工values('E6','WH1',1250) 单表查询 3.检索职工关系中的所有信息 命令:select*from职工 结果:

数据库SQL查询语句练习题(1)

. 设教学数据库Education有三个关系: 学生关系S(SNO,SNAME,AGE,SEX,SDEPT);学习关系SC(SNO,CNO,GRADE);课程关系C(CNO,CNAME,CDEPT,TNAME) 查询问题: (1)检索计算机系的全体学生的学号,姓名和性别; (2)检索学习课程号为C2的学生学号与姓名; (3)检索选修课程名为“DS”的学生学号与姓名; (4)检索选修课程号为C2或C4的学生学号; (5)检索至少选修课程号为C2和C4的学生学号; (6)检索不学C2课的学生姓名和年龄; (7)检索学习全部课程的学生姓名; (8)查询所学课程包含学生S3所学课程的学生学号。 (1)检索计算机系的全体学生的学号,姓名和性别; SELECT Sno,Sname,Sex FROM S WHERE Sdept =’CS’; (2)检索学习课程号为C2的学生学号与姓名; (3)检索选修课程名为“DS”的学生学号与姓名 本查询涉及到学号、姓名和课程名三个属性,分别存放在S 和C表中,但S和C表没有直接联系,必须通过SC表建立它们二者的联系。 C → SC → S 基本思路: (1)首先在C表中找出“DS”课程的课程号Cno; (2)然后在SC表中找出Cno等于第一步给出的Cno 集合中的某个元素Cno; (3)最后在S关系中选出Sno等于第二步中Sno 集合中某个元素的元组,取出Sno 和Sname送入结果表列。 SELECT Sno,Sname FROM S WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM C WHERE Cname=‘DS’)); (4)检索选修课程号为C2或C4的学生学号; SELECT Sno FROM SC WHERE Cno=‘C2’ OR Cno=‘C4’;(5)检索至少选修课程号为C2和C4的学生学号; SELECT Sno FROM SC X,SC Y WHERE X.Sno=Y.Sno AND https://www.360docs.net/doc/c13429430.html,o=‘C2’ AND https://www.360docs.net/doc/c13429430.html,o=‘C4’;(6)检索不学C2课的学生姓名和年龄; (7)检索学习全部课程的学生姓名; 在表S中找学生,要求这个学生学了全部课程。换言之,在S 表中找学生,在C中不存在一门课程,这个学生没有学。SELECT Sname FROM S WHERE NOT EXISTS (SELECT * FROM C WHERE NOT EXISTS (SELECT * FROM SC WHERE SC.Sno=S.Sno AND https://www.360docs.net/doc/c13429430.html,o=https://www.360docs.net/doc/c13429430.html,o)); (8)查询所学课程包含学生S3所学课程的学生学号。 分析:不存在这样的课程Y,学生S3选了Y,而学生X没有选。SELECT DISTINCT Sno FROM SC X WHERE NOT EXISTS (SELECT * FROM SC Y WHERE Y.Sno=‘S3’ AND NOT EXISTS (SELECT * FROM SC Z WHERE Z.Sno=X.Sno AND https://www.360docs.net/doc/c13429430.html,o=https://www.360docs.net/doc/c13429430.html,o));

通用SQL数据库查询语句范例

通用SQL数据库查询语句范例(多表查询) 弱电学院---文章分类: 电脑→数据库∧上一篇∨下一篇◎最新发布列表... 双击自动滚屏发布者:弱电之家发布时间:2008-10-6 17:53: 00 来源:互联网 总阅读:1351次本周阅读:31次今日阅读:4 次 推荐一、简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和Where子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。 例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email 字段。 Select nickname,email FROM testtable Where name=’张三’ (一) 选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。 1、选择所有列 例如,下面语句显示testtable表中所有列的数据:

Select * FROM testtable 2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。例如: Select nickname,email FROM testtable 3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名 列名列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题: Select 昵称=nickname,电子邮件=email FROM testtable

4、删除重复行 Select语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在Select返回的结果集合中只保留一行。 5、限制返回的行数 使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TO P n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。例如: Select TOP 2 *FROM testtable Select TOP 20 PERCENT * FROM testtabl e (二) FROM子句 FROM子句指定Select语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。 在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

数据库sql查询语句练习4_习题_结果(单世民)图书_习题

现有图书管理数据库的三个关系模式: 图书(总编号, 分类号, 书名, 作者, 出版单位, 单价)读者(借书证号, 单位, 姓名, 性别, 职称, 地址)借阅(借书证号, 总编号, 借书日期) 具体数据为: 读者:

根据以上描述,请完成: DDL 1.写出创建上述表的语句 命令:create table图书(总编号varchar(7)primary key,分类号varchar(8),书名varchar(18),作者varchar(8),出版单位varchar(18),单价float) create table读者(借书证号varchar(4)primary key,单位varchar(7),姓名varchar(8),性别varchar(2),职称varchar(8),地址varchar(18)) create table借阅(借书证号varchar(3),总编号varchar(6),借书日期date,primary key(借书证号,总编号,借书日期)) DML 2.给出插入上述数据的insert语句 命令: insert into图书values('445501','TP3/12','数据库导论','王强','科学出版社', insert into图书values('445502','TP3/12','数据库导论','王强','科学出版社', insert into图书values('445503','TP3/12','数据库导论','王强','科学出版社', insert into图书values('332211','TP5/10','计算机基础','李伟','高等教育出版社', insert into图书values('112266','TP3/12','FoxBASE','张三','电子工业出版社', insert into图书values('665544','TS7/21','高等数学','刘明','高等教育出版社', insert into图书values('114455','TR9/12','线性代数','孙业','北京大学出版社', insert into图书values('113388','TR7/90','大学英语','胡玲','清华大学出版社', insert into图书values('446601','TP4/13','数据库基础','马凌云','人民邮电出版社', insert into图书values('446602','TP4/13','数据库基础','马凌云','人民邮电出版社', insert into图书values('446603','TP4/13','数据库基础','马凌云','人民邮电出版社', insert into图书values('449901','TP4/14','FoxPro大全','周虹','科学出版社', insert into图书values('449902','TP4/14','FoxPro大全','周虹','科学出版社', insert into图书values('118801','TP4/15','计算机网络','黄力钧','高等教育出版社', insert into图书values('118802','TP4/15','计算机网络','黄力钧','高等教育出版社', insert into读者values('111','信息系','王维利','女','教授','1号楼') insert into读者values('112','财会系','李立','男','副教授','2号楼') insert into读者values('113','经济系','张三','男','讲师','3号楼') insert into读者values('114','信息系','周华发','男','讲师','1号楼') insert into读者values('115','信息系','赵正义','男','工程师','1号楼') insert into读者values('116','信息系','李明','男','副教授','1号楼') insert into读者values('117','计算机系','李小峰','男','助教','1号楼') insert into读者values('118','计算机系','许鹏飞','男','教授','1号楼')

数据库SQL查询语句练习题

设教学数据库 Education 有三个关系: 学生关系 S ( SNO SNAMEAGE SEX SDEPT ;学习关系 SC( SNO CNO GRADE ;课程关系 C (CNO CNAME CDEPT TNAME 查询问题: 检索计算机系的全体学生的学号,姓名和性别; 检索学习课程号为 C2的学生学号与姓名; 检索选修课程名为“ DS'的学生学号与姓名; 检索选修课程号为 C2或C4的学生学号; 检索至少选修课程号为 C2和C4的学生学号; 检索不学C2课的学生姓名和年龄; 检索学习全部课程的学生姓名; (1) SELECT Snq Sname Sex FROM S WHERE Sdept =' CS ; (2) 检索学习课程号为 C2的学生学号与姓名; 放 表建立它们二者的联系。 C T SC T S 基本思路: (1) 首先在 (2) 然后在 中的某个元素 Sno 等于第二步中Sno 集合中某 和 Sname 送入结果表列。 'DS)); (4) 检索选修课程号为 C2或C4的学生学号; SELECT Sno FROM SC WHERE Cno=' C2' OR Cno= ‘ C4'; (5) 检索至少选修课程号为 C2和C4的学生学号; SELECT Sno FROM SC X SC Y WHERE X.Sno=Y.Sno AND https://www.360docs.net/doc/c13429430.html,o= ‘ C2' AND https://www.360docs.net/doc/c13429430.html,o= ‘ C4'; (6) 检索不学C2课的学生姓名和年龄; (IIS .................... 在表I ER 中找学生,要求这个学 在s (表中找学生S 在C 中不 学 FROM SC 学pWCRSncmo : ‘C2 ); FROM S WHERE NOT EXISTS (SELECT * FROM C WHERE NOT EXISTS (SELECT * FROM SC WHERE SC.Sno=S.Sno AND https://www.360docs.net/doc/c13429430.html,o=https://www.360docs.net/doc/c13429430.html,o )); (8)查询所学课程包含学生 S3所学课程的学生学号。 分析:不存在这样的课程 Y ,学生S3选了 Y ,而其他学生 没有选。 SELECT DISTINCT Sno FROM SC AS X WHERE NOT EXISTS (SELECT * FROM SC AS Y WHERE Y.Sno= ‘ S3' AND NOT EXISTS (SELECT * FROM SC AS Z WHERE Z.Sno=X.Sno AND https://www.360docs.net/doc/c13429430.html,o=https://www.360docs.net/doc/c13429430.html,o )); 设教学数据库Education 有三个关系: 学生关系 S ( SNO SNAME AGE SEX SDEPT ; 学习关系 SC( SNO CNO GRAD ) 课程关系 C ( CNO CNAME CDEPT TNAMJE 查询问题: 1:查所有年龄在20岁以下的学生姓名及年龄。 2:查考试成绩有不及格的学生的学号 3:查所年龄在20至23岁之间的学生姓名、系别及年龄。 4:查计算机系、数学系、信息系的学生姓名、性别。 5:查既不是计算机系、数学系、又不是信息系的学生姓名、 性 别 6:查所有姓“刘”的学生的姓名、学号和性别。 7:查姓“上官”且全名为 3个汉字的学生姓名。 8:查所有不姓“张”的学生的姓名。 9:查DB_Design 课程的课程号。 10:查缺考的学生的学号和课程号。 11:查年龄为空值的学生的学号和姓名。 12:查计算机系20岁以下的学生的学号和姓名。 13:查计算机系、数学系、信息系的学生姓名、性别。 14:查询选修了 C3课程的学生的学号和成绩,其结果按分 数的 降序排列。 15:查询全体学生的情况,查询结果按所在系升序排列, 对同一 系中的学生按年龄降序排列。 16:查询学生总人数。 17:查询选修了课程的学生人数。 18:计算选修了 C1课程的学生平均成绩。 (1) (2) (3) (4) (5) (6) (7) (8) 查询所学课程包含学生 S3所学课程的学生学号。 检索计算机系的全体学生的学号,姓名和性别; 1.SELECT Sno ,Sname FROM S WHERE Sno IN (3)检SELECT 程名为“ D 本查 询涉及到学号、姓名和课 在 SW E Ci 卡no 但解此表没 2.SELECT S.Sno ,Sname FROM S ,SC S' WH 生学号S 姓名C.Sno 课 程名三个属性,分另C 存 艺 没有直接联系,必须通过 C 表中找出“ DS 课程的课程号 Cno ; SC 表中找岀 Cno ; Cno 等于第一步给出的 Cno 集合 (3)最后在S 关系中选出 个元素的元组,取出 Sno SELECT Snq Sname FROM S WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM C WHERE Cname= '课程的学生 姓名2.SELECT Sname ;FROM S 生学了全部课程N OT 言之 STS FROM SC WHERE SC.Sno=S.Sno AND Cno= ‘ C2 );

数据库sql查询语句

数据库结构如下: 仓库(仓库号, 都市, 面积) 订购单(职工号, 供应商号, 订购单号, 订购日期)供应商(供应商号, 供应商名, 地址) 职工(仓库号, 职工号, 工资) 具体数据如下: 仓库表:

订购单表: 供应商表: 职工表:

使用SQL语句完成: DDL 1.写出创建上述表的语句 命令: create table仓库(仓库号varchar(8)primary key,都市varchar(8),面积int); create table订购单(订购单号varchar(8)primary key,职工号varchar(8),供应商号varchar(8),订购日期nchar(8)) create table供应商(供应商号varchar(8)primary key,供应商名varchar(18),地址varchar(8)) create table职工(职工号varchar(8)primary key,仓库号

varchar(8),工资int)DML 2.给出插入上述数据的insert语句 命令: insert into仓库values('WH1','北京',370) insert into仓库values('WH2','上海',500) insert into仓库values('WH3','广州',200) insert into仓库values('WH4','武汉',400) insert into订购单values('OR67','E3','S7','06/23/01') insert into订购单values('OR73','E1','S4','07/28/01') insert into订购单values('OR76','E5','S4','05/25/01') insert into订购单values('OR77','E6','S6','05/26/01') insert into订购单values('OR79','E3','S4','06/13/01') insert into订购单values('OR80','E1','S2','08/29/01') insert into订购单values('OR90','E3','S3','09/01/01') insert into订购单values('OR91','E3','S7','07/13/01') insert into供应商values('S2','名硕电子公司','苏州') insert into供应商values('S3','振华电子厂','西安')

相关文档
最新文档