第一篇:SQL学习总结
上个星期,自主学习了SQL Server,基本了解了SQL Server的语法知识和结构,对SQL 有了一定的认识,现在我就对我这一星期对SQl的 学习做一个总结:
为了永久性的集中存放数据,并且还能体现数据与数据之间联系.此时需要用到数据库来保存数据.由于之前也接触过一两种数据库,向Oracle,MySQL,再就是SQL Server,这三种都是关系型数据库,都是用于存储大量的数据信息,是一种存储数据的仓库。不过,不管是哪一种数据库,他们之间的联系我觉得都是相通的,对于数据库的常见操作,无非就是“三建四句“。
所谓的“三建四句“就是说,三建:建库,建表,建约束;四句:增,删,改,查。
SQL 语言,也称为结构化查询语言,是用于访问关系型数据库的专用语言,同样也是数据库的核心语言,总体上可以分为三类:数据操纵语言(DML), 数据定义语言(DDL)、数据控制语言(DCL)。
数据操纵语言(DML)主要有四种形式:
插入:insert
更新:update
删除:delete
查询:select,涉及到数据的完整性——简单查询、子查询、多表连接查询
数据定义语言(DDL)主要用于创建数据库中的各种对象——
数据库
数据表
视图:是一种观察数据的途径
索引:用于查询数据,提高效率
同义词
Create,Drop,Alert,Truncate(截断)
数据控制语言(DCL):是用于授予和回收访问数据库的某种权限,并对数据库进行监控。
Grant(授予),Revoke(回收),Denny(拒绝),Rollback
SQL 中的运算符:算术运算符、位运算符、比较运算符、逻辑运算符、通配运算符、字符串连接符、赋值运算符
上面这些只是SQL Server数据的基本操作,而它真正强大的地方并不止这些,还有程序设计,SQL Server中的编程语言就是T-SQL语言,是一种非过程化的语言。
触发器:触发器是一种特殊类型的存储过程,主要是通过实践进行触发而被执行。它的主要作用就是能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。
存储过程:(stored procedure)类似c语言中的函数,是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数来执行它。
游标:游标是一种能从包含多条数据记录的结果集中每次提取一条记录的机制。将批操作变成行操作,对结果集中得某行进行操作。
第二篇:SQL总结
1.SQL语句的With cte as用法:
with as短语,也叫做子查询部分。即定义一个SQL片断,该片断会让整个SQL语句所用到。eg:
with
cr as
(select CountryRegionCode from person.CountryRegion where Name like 'C%')
select * from person.StateProvince where CountryRegionCode in(select * from cr)
CTE后面必须直接跟使用CTE的SQL语句(如select,insert,update等),否则,CTE将失效。CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔。eg:
with
cte1 as
(select * from table1 where name like 'abc%'),cte2 as
(select * from table2 where id > 20),cte3 as
(select * from table3 where price < 100)
select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id
2.case when then多条件判断:
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
WHEN 条件3 THEN 结果3
WHEN 条件4 THEN 结果4
.........WHEN 条件N THEN 结果N
ELSE 结果X
END
Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
3.select语句前面加@转义字符的作用是强制后面的字符串中不使用转义字符,当作字符串
处理。
eg:string ss=@“aanaa”;输出:aanaa
string ss=“aanaa”;
输出:aa
aa
4.select getdate():从SQL SERVER返回当前的时间与日期。
select first():函数返回指定的字段中第一个记录的值。
select last():函数返回指定的字段中最后一个记录的值。
select ucase():把字段的值转换为大写。
select lcase():把字段的值转换为小写。
select round():用于把数值字段设入为指定的小数位数。SELECT ROUND(column_name,decimals)FROM table_name
column_name 必需。要舍入的字段。decimals 必需。规定要返回的小数位数。format():用于对字段的显示进行格式化。
SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD')as PerDate FROM Products
5.union与union all的区别:
对重复结果的处理,UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复
6.SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
将整个table1复制到table2中:
INSERT INTO SELECT语句
语句形式为:Insert into Table2(field1,field2,...)select value1,value2,...from Table1(要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。)
SELECT INTO FROM语句
语句形式为:SELECT value1, value2 into Table2 from Table1(要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中)
7.nchar :固定长度的 Unicode 数据,最大长度为 4,000 个字符。
nvarchar:可变长度Unicode 数据,其最大长度为4,000字符。
char: 固定长度的非 Unicode 字符数据,最大长度为 8,000 个字符。
varchar:可变长度的非Unicode数据,最长为8,000 个字符。
char和varchar都是字符串类型的,用Unicode编码的字符串,结果是字符的整数值.8.select 1 from:
select 1 from mytable;与select anycol(目的表集合中的任意一行)from mytable;与select * from mytable 作用上来说是没有差别的,都是查看是否有记录,一般是作条件用的。select 1 from 中的1是一常量,查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
查看记录条数可以用select sum(1)from mytable;等价于select sum(*)from mytable;
9.SQL中的字符匹配:
[NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>']
<匹配串>可以是一个完整的字符串,也可以含有通配符%和_
%代表任意长度的字符串。eg:a%b表示以a开头以b结尾的任意长度的字符串。_代表任意单个字符。eg:a_b表示以a开头,以b结尾的长度为3的任意字符串。ESCAPE定义转义字符,当转义符置于通配符之前时,该通配符解释为普通字符。
10.GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。HAVING短语给出选择组的条件。
11.ROW_NUMBER()OVER函数的基本用法 :
row_number()OVER(PARTITION BY COL1 ORDER BY COL2)表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
select row_number()over(order by field2 desc)as row_number,* from t_table order by field1 desc Desc:倒序,Asc:正序
12.DbDataAdapter.Fill 方法(DataTable, IDbCommand, CommandBehavior):
在DataTable中添加或删除新行以匹配使用指定 DataTable 和 IDataReader 名称的数据源中的行。
13.SqlCommand.ExecuteScalar 方法:执行查询,并返回查询所返回的结果集中第一行的第一列,忽略其他列或行。
14.inner join(等值连接)只返回两个表中联结字段相等的行
left join(左联接)返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接)返回包括右表中的所有记录和左表中联结字段相等的记录
15.e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem指触发的类型为DadaList中的基本行或内容行
16.order by的用法:
如果Order by 中指定了表达式Nulls first则表示null值的记录将排在最前(不管是asc 还是 desc)
如果Order by 中指定了表达式Nulls last则表示null值的记录将排在最后(不管是asc 还是 desc)
eg:将nulls始终放在最前
select * from zl_cbqc order by cb_ld nulls first
--将nulls始终放在最后
select * from zl_cbqc order by cb_ld desc nulls last
单列升序:select
单列降序:select
多列升序:select
多列降序:select
多列混合排序:select
17.C#中NULL,“",DBNULL,String.Empty,Convert.IsDBNull区别
(1)NULL
null 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果 int i=null,的话,是不可以的,因为Int是值类型的。
(2)DBNULL
DBNull在DotNet是单独的一个类型,该类只能存在唯一的实例,DBNULL.Value,DBNull唯一作用是可以表示数据库中的字符串,数字,或日期,为什么可以表示原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。对于 DataRow , 它的 row[column] 返回的值永远不为 null,要么就是具体的为column 的类型的值。要么就是 DBNull。所以 row[column].ToString()这个写法永远不会在ToString那里发生NullReferenceException。DBNull 实现了 IConvertible。但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。
(3)”“和String.Empty
这两个都是表示空字符串,其中有一个重点是string str1=”“ 和 string str2=null 的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,string str2=null,这样定义后,只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。
(4)Convert.IsDBNull()
Convert.IsDBNull()返回有关指定对象是否为 DBNull 类型的指示,即是用来判断对象是否为DBNULL的。其返回值是True或Flase。
string.Empty不分配存储空间
”“分配一个长度为空的存储空间
所以一般用string.Empty
null表示一个对象的指向无效,即该对象为空对象
DBNull。Value表示一个对象在数据库中的值为空,或者说为初始化,DBNull。Value对象指向有效的对象
18.DataSet.Relations.add():获取用于将表链接起来并允许从父表浏览到子表的关系的集合。DataSet.Relations.Add(”关联名称“, 父关联主键字段, 子关联外来键字段)
19.DataBind():在Page_Load方法中我们建立了一个数组(ArrayList),并通过DataBind方法将这个数组捆绑到了DropDownList控件中,使得DropDownList最后有数据显示:)
20.IN 操作符允许我们在 WHERE 子句中规定多个值。
SQL IN 语法:SELECT column_name(s)FROM table_nameWHERE column_name IN(value1,value2,...)
21.DataBinder.Eval方法:在运行时使用反射来分析和计算对象的数据绑定表达式<%# DataBinder.Eval(Container.DataItem, ”ColumnName“)%>
eval()函数可计算某个字符串,并执行其中的的 JavaScript 代码。
可以理解为反射的绑定
或者理解为将Eval()里的字符串转换为表达式
在数据绑定的时候常用,其实是通过反射的手段实现了绑定
22.sql语句 count(1)与 count(*)的区别 :
count(1),其实就是计算一共有多少符合条件的行。
1并不是表示第一个字段,而是表示一个固定值。
其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1.count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。
23.DataTable.NewRow :创建与该表具有相同框架的新的DataRow
24.ExcuteNonQuery():
如果要创建或修改数据库结构,操作成功时返回值为-1;如果要更新记录,返回值为操作影响的记录数;
ExecuteNonQuery()方法主要用于用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete 语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,如果数据操作回滚得话返回值为-1,关于MyCommand的ExecuteNonQuery(),ExecuteScalar(),ExecuteReader方法的区别:
***ExecuteNonQuery():执行SQL,返回一个整型变量,如果SQL是对数据库的记录进行操作,那么返回操作影响的记录条数,如果是SQL=”CREATE TABLE LookupCodes(code_id smallint IDENTITY(1,1)PRIMARY KEY CLUSTERED, code_desc varchar(50)NOT NULL)"那么在表创建成功后该方法返回-1。
***ExecuteScalar():执行SQL,(如果SQL是查询Select)返回查询结果的第一行第一列,如果(如果SQL不是查询Select)那么返回未实列化的对象,因为对象未实列化,所以返回结果不能ToString(),不能Equals(null),也就是说返回结果没有任何作用
***executeReader方法执行SQL,(如果SQL是查询Select)返回查询结果的集合,类型是 System.Data.OleDb.OleDbDataReader,你可以通过此结果,获取查询的数据。如果(如果SQL不是查询Select)那么返回一个没有任何数据的System.Data.OleDb.OleDbDataReader类型的集合(EOF)
25.DbDataAdapter.Fill 方法(DataTable):在 DataSet 的指定范围中添加或刷新行,以与使用 DataTable 名称的数据源中的行匹配。
26.Decimal:decimal(2,1),有效长度为2,小数位占1位。
varchar:可变长度的非Unicode数据,最长为8,000 个字符。
nvarchar:可变长度Unicode 数据,其最大长度为4,000字符。
char: 固定长度的非 Unicode 字符数据,最大长度为 8,000 个字符。
nchar :固定长度的 Unicode 数据,最大长度为 4,000 个字符。
char和varchar都是字符串类型的,用Unicode编码的字符串,结果是字符的整数值.timestamp:数据类型是一种特殊的数据类型,用来创建一个数据库范围内的唯一数码。一个表中只能有一个timestamp列。每次插入或修改一行时,timestamp列的值都会改变。尽管它的名字中有“time”,但timestamp列不是人们可识别的日期。在一个数据库里,timestamp值是唯一的Uniqueidentifier特殊数据型
SELECT UPPER('Kelly'):upper是数据库的字符串函数,它的作用是将传递给它的英文字符串中小写字母转换为大写(大写的保持不变);
SELECT LOWER('kelly'):lower将指定字符串中的大写字母换成小写字母
SUBSTRING(colunm name,startposition,length)从指定字符串中取字符
eg:SQL实例:
显示每个地区的总人口数和总面积.
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。
显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
27.SELECT [ALL|DISTINCT] <目标列表达式> [别名] [,<目标列表达式> [别名]]…… FROM <表名或视图名> [别名] [,<表名或视图名> [别名]]……
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]]
INSERT
INTO <表名> [(<属性列1>[,<属性列2>……])]
VALUES(<常量1> [,<常量2>]……)
UPDATE <表名>
SET <列名>=<表达式> [,<列名>=<表达式>]……
[WHERE <条件>]
DELETE
FROM <表名>
[WHERE <条件>]
第三篇:sql语句学习
一、选择题
1、SQL语言是()语言。——(SQL特点)(易)
A)层次数据库 B)网络数据库 C)关系数据库D)非数据库
答案:C2、SQL语言具有两种使用方式,分别称为交互式SQL和()。
——(SQL语言使用方式)(易)
A)提示式SQLB)多用户SQLC)嵌入式SQLD)解释式SQL
答案:C
3-4-5()包括数据库模式定义和数据库存储结构与存取方法定义。()实现对DB的操作,包括查询、插入、删除、修改数据库中的数据。()用于数据保护,包括数据的安全性,完整性,并发控制和恢复等。——(数据库语言DDLDMLDCL)(中)
A)数据控制子语言 B)数据定义子语言 C)数据操纵子语言 D)数据库语言
答案:B C A
6-7-8-9-
10、下列SQL语句中,实现数据检索的语句是(),修改表结构的是(),修改属性值的是(),删除表结构的是(),删除表记录的是()。
——(DROP TABLE, ALTER TABLE,UPDATE, DELETE,SELECT 语句)(易)
A)SELECTB)DROPC)UPDATED)ALTERE)DELETE
答案:A D C B E
二、用关系代数表达式及SQL语句描述关系查询
1、设有如下关系表R、S和T:——(易)R(BH,XM,XB,DWH)
S(DWH,DWM)
T(BH,XM,XB,DWH)
写出实现下列关系代数的SQL语句:
1)DWH'100'(R)σDWH=’100’(R)
2)XM,XB(R)∏xM,XB(R)
3)XM,DWH(
4)RS R∞S
5)XM,XB,DWH(
解:
1)SELECT * FROM R WHERE DWH=’100’;
2)SELECT XM,XB FROM R;
3)SELECT XM,DWH FROM R WHERE XB=’女’;
4)SELECT R.*,S.DWM FROM R, S WHERE R.DWH=S.DWH;
5)SELECT XM,XB,DWH FROM R,S WHERE R.DWH=S.DWH AND XB=’男’;XB'男'XB'女'(R))∏XM,DWH(σXB=’女’(R))(RS))∏XM,XB,DWH(σXB=’男’(R∞S))
2、设有如下三个关系:——(易-易)
A(A#,ANAME,WQTY,CITY): A#:商店代号;ANAME:商店名;WQTY:店员人数
B(B#,BNAME,PRICE):B#:商品号;BNAME:商品名称;
AB(A#,B#,QTY):QTY:商品数量
试用关系代数和SQL语言写出下列查询。
1)找出店员人数不超过100人或者在长沙市的所有商店的代号和商店名;
2)找出供应书包的商店名;
解:
1)A#,ANAME(WQTY100 CITY'长沙'(A))∏A#,ANAME(σWQTY<=100ⅤCITY=’长沙’(A))
SELECT A#,ANAME FROM A WHERE WQTY<=100 OR CITY=’长沙’;
2)ANAME((BNAME'书包'(B))ABA)∏ANAME((σBNAME=’书包’(B))∞AB∞(A))
SELECT ANAME FROM A,B,AB
WHERE BNAME=’书包’ AND B.B#=AB.B# AND AB.A#=A.A#;
3.设有如下关系模式:
student(NO, NAME , SEX ,BIRTHDAY, CLASS)
teacher(NO,NAME,SEX,BIRTHDAY,PROF,DEPART)PROF为职称,DEPART为系别
course(CNO, CNAME, TNO)
score(NO, CNO, DEGREE)DEGREE 为成绩
写出实现以下各题功能的SQL语句:
(1)查询至少有2名男生的班号;——(难)
(2)查询不姓“王”的同学记录;——(易)
(3)查询每个学生的姓名和年龄;——(难)
(4)查询学生中最大和最小的birthday日期值;——(中)
(5)查询学生表的全部记录并按班号和年龄从大到小的顺序;——(中)
(6)查询男教师及其所上的课程;——(中)
(7)查询最高分同学的学号,课程号和成绩;——(中)
(8)查询和“李军”同性别并同班的所有同学的姓名;——(中)
(9)查询选修“数据库系统概论”课程的男同学的成绩表;——(中)
(10)查询所有未讲课的教师的姓名和所在系别;——(难)
(11)查询“计算机系”教师所教课程的成绩表;——(难)
(12)查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录;——(难)
(13)查询最低分大于70,最高分小于90的学生的学号;——(中)
(14)查询成绩在60到80之间的所有记录;——(中)
(15)查询成绩比该课程平均成绩低的同学的成绩表;——(相关子查询)(难)
(16)查询所有女教师和女同学的姓名、性别和生日;——(中)
(17)查询“计算机系”和“无线电系”不同职称的教师的姓名和职称;——(中)
解:(1)SELECT CLASS FROM student WHERE SEX=‘男’
GROUP BY CLASS HAVING COUNT(*)>=2;
(2)SELECT * FROM student WHERE NAME NOT LIKE ‘王%’;
(3)SELECT NAME,year(date())-year(birthday)as age FROM student;
(4)SELECT MAX(BIRTHDAY), MIN(BIRTHDAY)FROM student;
(5)SELECT * FROM student ORDER BY CLASS,BIRTHDAY DESC;
(6)SELECT x.name, y.cname FROM teacher x, course y WHERE x.no=y.tno and x.sex=’男’;
(7)SELECT * FROM score WHERE degree=(SELECT max(degree)FROM score);
(8)SELECT name FROM student WHERE sex=(SELECT sex FROM student WHEREname=’
李军’)and class=(SELECT class FROM student WHERE name=’李军’);
(9)SELECT * FROM score WHERE no IN(SELECT no FROM student WHERE sex=‘男’)and
cno=(SELECT cno FROM course WHERE cname=‘数据库系统概论’);
(10)SELECT name, depart FROM teacher t WHERE NOT EXIST(SELECT * FROM course c
WHERE c.tno=t.no);
(11)SELECT * FROM score s, teacher t, course c WHERE t.depart=’计算机系’ and t.no=c.tno
and c.cno=score.cno;
(12)SELECT * FROM student s, score sc WHERE s.no=sc.no and cno=’3-105’ and
degree>(SELECT degree FROMsc WHERE no=’109’ and cno=’3-105’);
(13)SELECT no FROM score GROUP BY no HAVING min(degree)>70 and max(degree)<90;
(14)SELECT * FROM score WHERE degree BETWEEN 60 AND 80;
(15)SELECT * FROM score a WHERE degree <(SELECT avg(degree)FROM score b WHERE b.cno=a.cno group by b.cno);
(16)SELECT name, sex, birthday FROM teacher WHERE sex=‘女’UNION SELECT name, sex,birthday FROM student WHERE sex=‘女’;
(17)SELECT name, prof FROM teacher WHERE depart=’计算机系’ OR depart=’无线电系’
order by prof;
4、设有图书登记表TS,具有属性:BNO(图书编号),BC(图书类别),BNA(书名),AU(著者),PUB(出版社)。按下列要求用SQL语言进行设计。——(易)
1)按图书馆编号BNO建立TS表的索引ITS;
2)查询按出版社统计其出版图书总数。
3)删除索引。
解:1)CREATE INDEX ITSON TS(BNO);
2)SELECT PUB,COUNT(BNO)FROM TS GROUP BY PUB;
3)DROP INDEXITS;
5、已知三个关系R、S和T——(中)
R(A,B,C)S(A,D,E)T(D,F)
试用SQL语句实现如下操作:
1)R、S和T三个关系按关联属性建立一个视图R-S-T;
2)对视图R-S-T按属性A分组后,求属性C和E的平均值。
解:1)CREATE VIEW R-S-T(A,B,C,D,E,F)AS
SELECT R.A , B, C ,S.D, E, F FROM R, S, T
WHERE R.A=S.A AND S.D=T.D;
2)SELECT AVG(C), AVG(E)FROM R-S-T GOUPY BY A;
6、设有学生表S(SNO, SN)(SNO为学生号,SN为姓名)和学生选修课程表SC(SNO,CNO,CN,G)
(CNO为课程号,CN为课程名,G为成绩),试用SQL语言完成以下各题:——(易)
a)建立一个视图V-SSC(SNO, SN, CNO, CN, G);
b)从视图V-SSC上查询平均成绩在90分以上的SN, CN 和G。
解:
1)CREATE VIEW V-SSC(SNO , SN, CNO, CN, G)AS
SELECT S.SNO, SN, CNO, CN, GFROM S, SC WHERE S.SNO=SC.SNO
2)SELECT SN, CN, G FROM V-SSC GROUP BY SNO HAVING AVG(G)>907、设有关系模式: 其中SB表示供应商,SN为供应商号,SNAME为供应商名字,CITY
为供应商所在城市; PB(PN, PNAME, COLOR, WEIGHT)其中PB表示零件,PN为零件代号,PANME为零件名
字,COLOR为零件颜色,WEIGHT为零件重量; JB(JN, JNAME, CITY)其中JB表示工程,JN为工程编号,JNAME为工程名字,CITY为工
程所在城市;
SPJB()其中SPJB表示供应关系,QTY表示提供的零件数量。
写出实现以下各题功能的SQL语句:
(1)取出所有工程的全部细节;——(易)
(2)取出所在城市为上海的所有工程的全部细节;——(易)
(3)取出重量最轻的零件代号;——(难)
(4)取出为工程J1提供零件的供应商代号;——(易)
(5)取出为工程J1提供零件P1的供应商代号;——(易)
(6)取出由供应商S1提供零件的工程名称;——(易)
(7)取出供应商S1提供的零件的颜色;——(易)
(8)取出为工程J1或J2提供零件的供应商代号;——(中)
(9)取出为工程J1提供红色零件的供应商代号;——(易)
(10)取出为所在城市为上海的工程提供零件的供应商代号;——(易)
(11)取出为所在城市为上海或北京的工程提供红色零件的供应商代号;——(中)
(12)取出供应商与工程所在城市相同的供应商提供的零件代号;——(中)
(13)取出上海的供应商提供给上海的任一工程的零件的代号;——(难)
(14)取出至少有一个和工程不在同一城市的供应商提供零件的工程代号;——(难)
(15)取出上海供应商不提供任何零件的工程的代号;——(难)
(16)取出这样一些供应商代号,它们能够提供至少一种由红色零件的供应商提供的零件;
——(难)
(17)取出由供应商S1提供零件的工程的代号;——(易)
(18)取出所有这样的一些 市的工程提供零件;——(难) (19)取出所有这样的三元组 市的工程提供指定的零件;——(难) (20)重复(19)题,但不检索两个CITY值相同的三元组。——(难) 解: (1)SELECT * FROM JB; (2)SELECT * FROM JB WHERE CITY=‘上海’; (3)SELECT PN FROM PB WHERE WEIGHT=(SELECT MIN(WEIGHT)FROM PB); (4)SELECT SN FORM SPJB WHERE JN=‘J1’; (5)SELECT SN FORM SPJB WHERE JN=‘J1’AND PN=‘P1’; (6)SELECT JNAME FROM JB,SPJB WHERE SN=‘S1’AND SPJB.JN=JB.JN; (7)SELECT DISTINCT COLOR FROM PB,SPJB WHERE SN=‘S1’AND SPJB.JN=JB.JN' (8)SELECT SN FROM SPJB WHERE JN IN {J1, J2}; 或者 SELECT SN FROM SPJB WHERE JN=’J1’ OR JN=’J2’; (9)SELECT SN FROM SPJB,PB WHERE COLOR=‘红色’AND PB.PN=SPJB.PN AND JN=’J1’; (10)SELECT DISTINCT SN FROM SPJB,JB WHERE CITY=‘上海’AND JB.JN=SPJB.JN; (11)SELECT SN FROM PB, JB, SPJB WHERE COLOR=‘红色’AND CITY IN {‘上海’,‘北京’} AND PB.PN=SPJB.PN AND JB.JN=SPJB.JN; (12)SELECT PN FROM SB, JB , SPJB WEHRE SB.CITY=JB.CITY AND SB.SN=SPJB.SN AND JB.JN=SPJB.JN; (13)SELECT PN FROM SB, SPJB, JB WEHRE SB.CITY=‘上海’AND JB.CITY=‘上海’ AND SB.SN=SPJB.SN AND JB.JN=SPJB.JN; (14)SELECT JN FROM JB WHERE EXISTS(SELECT * FROM SB WHERE EXISTS(SELECT * FROM SPJB WHERE SB.CITY<>JB.CITY AND SPJB.SN= SB.SN AND SPJB.JN= JB.JN)); (15)SELECT DISTINCT JN FROM SPJB WHERE JN NOT IN(SELECT DISTINCT SPJB.JN FROM SB,SPJB WHERE SB.SN=SPJB.SN AND SB.CITY=‘上海’); (16)SELECT DISTINCT SPJB.SN FROM SB,SPJB WHERE SPJB.PN IN(SELECT SPJB.PN FROM SPJB,PB WHEREPB.PN=SPJB.PN AND PB.COLOR=‘红色’; (17)SELECTJN FROM SPJB WHERE SN=’S1’; (18)SELECT DINSINCT SB.CITY , JB.CITY FROM SB, JB, SPJB WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.SN; (19)SELECT SB.CITY, SPJB.PN, JB.CITY FROM SB,JB,SPJB WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.JN; (20)SELECT DISTINCT SB.CITY, SPJB.PN, JB.CITY FROM SB,JB,SPJB WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.JN AND SB.CITY<>JB.CITY; 8、设有如下关系模式:——(中) 图书关系B(图书编号B#,图书名T,作者A,出版社P); 读者关系R(借书证号C#,读者名N,读者地址D); 借阅关系L(C#,B#,借书日期E,还书标志BZ); BZ=‘1’表示已还; BZ=‘0’ 表示未还; 写出实现以下各题功能的SQL语句: (1)查询“工业出版社”出版的图书名 (2)将书号为B5的图书的出版社改为“工业出版社” (3)查询99年12月31日以前借书未还的读者名与书名 (4)查所借的书包含借书证号为C1的读者借出未还的所有书的读者名与借书证号。 (5)删去“工业出版社”出版的所有图书及相关的借阅信息。 解: (1)SelectTfromBWhereP = ’工业出版社’ (2)UpdateBSetP=’工业出版社’ WhereB# = ’B5’ (3)SelectN , TFrom B, R , L WhereE <’99/12/31’ AND BZ=’0’ AND L.C#=R.C# AND L.B#=B.B# (4)select N,C# from R where not exists (select * from LL1 where L1.C#=’c1’ and BZ=‘0’ andnot exists (select * from L L2 where L2.c#=R.c# and L2.B#=L1.B#)) (6)Delete from LWhere B#IN(Select B#From B Where P=’工业出版社’); Delete from B Where P=’工业出版社’; sql学习心得:SQL SERVER 2005 sql学习心得:SQL SERVER 2005学习心得 一、数据库设计方面 1、字段类型。 varchar(max)nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操 作,这是一个亮点。但是这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否 会出现大规模的碎片?是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQL Server的字段类型更加简洁统一。 XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应 该是相当的熟了!) 2、外键的级联更能扩展 可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。但是 再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SET NULL 和 SET DEFAULT 属性,能够 提供能好的级联设置。 3、索引附加字段 这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了 很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。 4、计算字段的持久化 原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算 字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使 用。 5、分区表 分区表是个亮点!从分区表也能看出微软要做大作强SQL Server的信心。资料很多,这里不详细说。但是重点 了解的是:现在的SQL Server2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性 对历史数据和实时数据的处理是很有帮助的。 但是需要注意的一点,也是我使用过程中发现的一个问题。在建立 function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。如果你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。 大家也可以试试。 分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未 分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右) 6、CLR类型 微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数 据库的一些概念可以实现了。但是作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系 统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性 能问题! 其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口 。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!还不是性能有问题 !否则面向对象的数据库早就实现了! 建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。或者是要和操作系统进行Socket通讯的场景。否则建议慎重! 7、索引视图 索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面 。还有一大堆的环境参数和种种限制都让人对它有点却步。 8、语句和事务快照 语句级快照和事务级快照终于为SQL Server的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务 级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的! 9、数据库快照 原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪 回技术还是细粒度不够。可惜! 10、Mirror Mirror可以算是SQL Server的Data guard了。但是能不能被大伙用起来就不知道了。 二、开发方面 1、Ranking函数集 其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQL Server2005的row_number比Oracle的更先进。因为它把Order by集成到了一起,不用像Oracle那样还要用子查询进行封装 。但是大家注意一点。如下面的例子: select ROW_NUMBER()OVER(order by aa) from tbl order by bb 会先执行aa的排序,然后再进行bb的排序。 可能有的朋友会抱怨集成的order by,其实如果使用ranking函数,Order by是少不了的。如果担心Order by会影响效率,可以为order by的字段建立聚集索引,查询计划会忽略order by 操作(因为本来就是排序的嘛)。 2、top 可以动态传入参数,省却了动态SQL的拼写。 3、Apply 对递归类的树遍历很有帮助。 4、CTE 个人感觉这个真是太棒了!阅读清晰,非常有时代感。 5、try/catch 代替了原来VB式的错误判断。比Oracle高级不少。 6、pivot/unpivot 个人感觉没有case直观。而且默认的第三字段(还可能更多)作为group by字段很容易造成新手的错误。 三、DBA管理方面 1、数据库级触发器 记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。 2、多加的系统视图和实时系统信息 这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。 3、优化器的改进 一直以来个人感觉SQL Server的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验 发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。) 4、profiler的新事件观察 这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能 启动profiler。否则点击没有反应。 5、sqlcmd 习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQL Server Management Studio的朋友 使用。 四、遗憾 1、登陆的控制 始终遗憾SQL Server的登陆无法分配CPU/内存占用等指标数。如果你的SQL Server给别人分配了一个只可以 读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。而SQL Server如果 能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。 2、数据库物理框架没有变动 undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个 数据库,可能能在一定程度上避免I/O效率问题。但是同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。 3、还是没有逻辑备份 备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才 能解决。 4、SSIS(DTS)太复杂了 SQL Server的异构移植功能个人感觉最好了。(如果对比过SQL Server的链接服务器和Oracle的透明网关的朋友会发现SQL Server的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。) 以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。 sql语句学习 数据定义语言(DDL): 1)创建数据库(create):create database database-name; eg.create database test; 2)删除数据库:drop database dbname; eg.drop database test; 3)创建新表:create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..); eg.根据已有的表创建新表的例子:create table tab_new like tab_old;create table tab_new as select col1,col2… from tab_old definition only; 4)删除表:drop table tabname; 5)增加列:alter table tabname add column col type; 6)添加主键: alter table tabname add primary key(col); 7)删除主键:alter table tabname drop primary key(col); 8)创建索引:create [unique] index idxname on tabname(col….); 9)删除索引:drop index idxname;注:索引是不可更改的,想更改必须删除重新建; 10)创建视图:create view viewname as select statement; 2.数据操纵语言(DML) 1)查询语句(select) eg1.select * from table1 where field1 like '%value1%'; eg2.select * from table1 order by field1,field2 [desc]; eg3.select count as totalcount from table1; eg4.select sum(field1)as sumvalue from table1; eg5.select avg(field1)as avgvalue from table1; eg6.select max(field1)as maxvalue from table1; eg7.select min(field1)as minvalue from table1; eg8.select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c;(注:此为左外连接,结果集中包括连接表的匹配行,也包括左连接表的所有行) 2)插入语句(insert) insert into table1(field1,field2)values(value1,value2); 3)删除语句(delete) delete from table1 where 范围; 4)更新语句(update) update table1 set field1=value1 where 范围; 3.数据控制语言(DCL) 1)授予权限语句(GRANT) GRANT privileges(columns)ON what TO user IDENTIFIED BY “password” WITH GRANT OPTION; 其中:privileges可为如下限定符:ALTER 修改表和索引、CREATE(创建数据库和表)、DELETE(删除表中已有的记录)、DROP(删除数据库和表)、INDEX(创建或删除索引)、INSERT(向表中插入新行)、REFERENCE(未用)、SELECT(检索表中的记录)、UPDATE(修改现存表记录)、FILE(读或写服务器上的文件)、PROCESS(查看服务器中执行的线程信息或杀死线程)、RELOAD(重载授权表或清空日志、主机缓存或表缓存)、SHUTDOWN(关闭服务器)、ALL 所 有;ALL PRIVILEGES同义词、USAGE(特殊的“无权限”权限) columns:权限运用的列,它是可选的,并且你只能设置列特定的权限。如果命令有多于一个列,应该用逗号分开它们; what:权限运用的级别。权限可以是全局的(适用于所有数据库和所有表)、特定数据库(适用于一个数据库中的所有表)或特定表的。可以通过指定一个columns字句是权限是列特定的。 user :权限授予的用户,它由一个用户名和主机名组成。MySQL中的一个用户名就?悄懔臃衿魇敝付ǖ挠没?该名字不必与你的Unix登录名或Windows名联系起来。缺省地,如果你不明确指定一个名字,客户程序将使用 你的登录名作为MySQL用户名。这只是一个约定。你可以在授权表中将该名字改为nobody,然后以nobody连接 执行需要超级用户权限的操作。 password:赋予用户的口令,它是可选的。如果你对新用户没有指定IDENTIFIED BY子句,该用户不赋给口令(不安全)。对现有用户,任何你指定的口令将代替老口令。如果你不指定口令,老口令保持不变,当你用IDENTIFIED BY 时,口令字符串用改用口令的字面含义,GRANT将为你编码口令,不要象你用SET PASSWORD 那样使用password() 函数。 WITH GRANT OPTION子句是可选的。如果你包含它,用户可以授予权限通过GRANT语句授权给其它用户。你可以用该子句给与其它用户授权的能力。 用户名、口令、数据库和表名在授权表记录中是大小写敏感的,主机名和列名不是。 eg1.创建一个超级用户test1 grant all privilleges on *.* to test1@localhost identified by '123456' with grant option;eg2.创建一个只能查询的用户 test2 mysql> grant select on *.* to test2@localhost identified by '9876543'; 2)撤权并删除用户(revoke) 要取消一个用户的权限,使用REVOKE语句。REVOKE的语法非常类似于GRANT语句,除了TO用FROM取代并且没有INDETIFED BY和WITH GRANT OPTION子句: revoke privileges(columns)ON what FROM user user部分必须匹配原来GRANT语句的你想撤权的用户的user部分。privileges部分不需匹配,你可以用GRANT 语句授权,然后用REVOKE语句只撤销部分权限。REVOKE语句只删除权限,而不删除用户。即使你撤销了所有 权限,在user表中的用户记录依然保留,这意味着用户仍然可以连接服务器。要完全删除一个用户,你必须 用一条DELETE语句明确从user表中删除用户记录: #mysql-u root mysql DELETE FROM user WHERE User=“user_name” and Host=“host_name”; FLUSH PRIVILEGES; DELETE语句删除用户记录,而FLUSH语句告诉服务器重载授权表。(当你使用GRANT和REVOKE语句时,表自动重载,而你直接修改授权表时不是。) eg.删除用户test1 revoke all on *.* from; use mysql; delete from user where user='test' and host='localhost';flush privileges; 3)提交语句(commit) 4)回滚语句(rollback)第四篇:学习SQL必看
第五篇:sql语句学习_经典_推荐