第一篇:学习SQL必看
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语句学习
一、选择题
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语句学习 数据定义语言(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语言学习 --语 句功 能 --数据操作 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--检索查询结果打开一个游标 FETCH--检索一行查询结果 CLOSE--关闭游标 PREPARE--为动态执行准备SQL 语句 EXECUTE--动态地执行SQL 语句 DESCRIBE--描述准备好的查询 ---局部变量 declare @id char(10) --set @id = '10010001' select @id = '10010001' ---全局变量 ---必须以@@开头 --IF ELSE declare @x int @y int @z int select @x = 1 @y = 2 @z=3 if @x > @y print 'x > y'--打印字符串'x > y' else if @y > @z print 'y > z' else print 'z > y' --CASE use pangu update employee set e_wage = case when job_level = ’1’ then e_wage*1.08 when job_level = ’2’ then e_wage*1.07 when job_level = ’3’ then e_wage*1.06 else e_wage*1.05 end --WHILE CONTINUE BREAK declare @x int @y int @c int select @x = 1 @y=1 while @x < 3 begin print @x--打印变量x 的值 while @y < 3 begin select @c = 100*@x + @y print @c--打印变量c 的值 select @y = @y + 1 end select @x = @x + 1 select @y = 1 end --WAITFOR --例 等待1 小时2 分零3 秒后才执行SELECT 语句 waitfor delay ’01:02:03’ select * from employee --例 等到晚上11 点零8 分后才执行SELECT 语句 waitfor time ’23:08:00’ select * from employee ***SELECT*** select *(列名)from table_name(表名)where column_name operator value ex:(宿主) select * from stock_information where stockid= str(nid) stockname = 'str_name' stockname like '% find this %' stockname like '[a-zA-Z]%'---------([]指定值的范围) stockname like '[^F-M]%'---------(^排除指定范围) ---------只能在使用like关键字的where子句中使用通配符) or stockpath = 'stock_path' or stocknumber < 1000 and stockindex = 24 not stocksex = 'man' stocknumber between 20 and 100 stocknumber in(10,20,30) order by stockid desc(asc)---------排序,desc-降序,asc-升序 order by 1,2---------by列号 stockname =(select stockname from stock_informationwhere stockid= 4) ---------子查询 ---------除非能确保内层select只返回一个行的值,---------否则应在外层where子句中用一个in限定符 select distinct column_name form table_name---------distinct指定检索独有的列值,不重复select stocknumber ,“stocknumber + 10” = stocknumber + 10 from table_name select stockname , “stocknumber” = count(*)from table_name group by stockname ---------group by 将表按行分组,指定列中有相同的值 having count(*)= 2---------having选定指定的组 select * from table1, table2 where table1.id *= table2.id--------左外部连接,table1中有的而table2中没有得以null表示table1.id =* table2.id--------右外部连接 select stockname from table1 union [all]-----union合并查询结果集,all-保留重复行 select stockname from table2 ***insert*** insert into table_name(Stock_name,Stock_number)value(“xxx”,“xxxx”) value(select Stockname , Stocknumber from Stock_table2)---value为select语句 ***update*** update table_name set Stockname = “xxx” [where Stockid = 3] Stockname = default Stockname = null Stocknumber = Stockname + 4 ***delete*** delete from table_name where Stockid = 3 truncate table_name-----------删除表中所有行,仍保持表的完整性 drop table table_name---------------完全删除表 ***alter table***---修改数据库表结构 alter table database.owner.table_name add column_name char(2)null.....sp_help table_name----显示表已有特征 create table table_name(name char(20), age smallint, lname varchar(30)) insert into table_name select.........-----实现删除列的方法(创建新表) alter table table_name drop constraint Stockname_default----删除Stockname的default约束 ***function(/*常用函数*/)*** ----统计函数---- AVG--求平均值 COUNT--统计数目 MAX--求最大值 MIN--求最小值 SUM--求和 --AVG use pangu select avg(e_wage)as dept_avgWage from employee group by dept_id --MAX --求工资最高的员工姓名 use pangu select e_name from employee where e_wage = (select max(e_wage) from employee) --STDEV() --STDEV()函数返回表达式中所有数据的标准差 --STDEVP() --STDEVP()函数返回总体标准差 --VAR() --VAR()函数返回表达式中所有值的统计变异数 --VARP() --VARP()函数返回总体变异数 ----算术函数---- /***三角函数***/ SIN(float_expression)--返回以弧度表示的角的正弦 COS(float_expression)--返回以弧度表示的角的余弦 TAN(float_expression)--返回以弧度表示的角的正切 COT(float_expression)--返回以弧度表示的角的余切 /***反三角函数***/ ASIN(float_expression)--返回正弦是FLOAT 值的以弧度表示的角 ACOS(float_expression)--返回余弦是FLOAT 值的以弧度表示的角 ATAN(float_expression)--返回正切是FLOAT 值的以弧度表示的角 ATAN2(float_expression1,float_expression2) --返回正切是float_expression1 /float_expres-sion2的以弧度表示的角 DEGREES(numeric_expression) --把弧度转换为角度返回与表达式相同的数据类型可为 --INTEGER/MONEY/REAL/FLOAT 类型 RADIANS(numeric_expression)--把角度转换为弧度返回与表达式相同的数据类型可为 --INTEGER/MONEY/REAL/FLOAT 类型 EXP(float_expression)--返回表达式的指数值 LOG(float_expression)--返回表达式的自然对数值 LOG10(float_expression)--返回表达式的以10 为底的对数值 SQRT(float_expression)--返回表达式的平方根 /***取近似值函数***/ CEILING(numeric_expression)--返回>=表达式的最小整数返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT 类型 FLOOR(numeric_expression)--返回<=表达式的最小整数返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT 类型 ROUND(numeric_expression)--返回以integer_expression 为精度的四舍五入值返回的数据--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型 ABS(numeric_expression)--返回表达式的绝对值返回的数据类型与表达式相同可为 --INTEGER/MONEY/REAL/FLOAT 类型 SIGN(numeric_expression)--测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型--与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型 PI()--返回值为π 即3.14***936 RAND([integer_expression])--用任选的[integer_expression]做种子值得出0-1 间的随机浮点数----字符串函数---- ASCII()--函数返回字符表达式最左端字符的ASCII 码值 CHAR()--函数用于将ASCII 码转换为字符 --如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值 LOWER()--函数把字符串全部转换为小写 UPPER()--函数把字符串全部转换为大写 STR()--函数把数值型数据转换为字符型数据 LTRIM()--函数把字符串头部的空格去掉 RTRIM()--函数把字符串尾部的空格去掉 LEFT(),RIGHT(),SUBSTRING()--函数返回部分字符串 CHARINDEX(),PATINDEX()--函数返回字符串中某个指定的子串出现的开始位置 SOUNDEX()--函数返回一个四位字符码 --SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值DIFFERENCE()--函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异 --0 两个SOUNDEX 函数返回值的第一个字符不同 --1 两个SOUNDEX 函数返回值的第一个字符相同 --2 两个SOUNDEX 函数返回值的第一二个字符相同 --3 两个SOUNDEX 函数返回值的第一二三个字符相同 --4 两个SOUNDEX 函数返回值完全相同 QUOTENAME()--函数返回被特定字符括起来的字符串 /*select quotename('abc', '{')quotename('abc') 运行结果如下 ---{ {abc} [abc]*/ REPLICATE()--函数返回一个重复character_expression 指定次数的字符串 /*select replicate('abc', 3)replicate('abc',-2) 运行结果如下 ---------------------- abcabcabc NULL*/ REVERSE()--函数将指定的字符串的字符排列顺序颠倒 REPLACE()--函数返回被替换了指定子串的字符串 /*select replace('abc123g', '123', 'def') 运行结果如下 ---------------------- abcdefg*/ SPACE()--函数返回一个有指定长度的空白字符串 STUFF()--函数用另一子串替换字符串指定位置长度的子串 学习总结 第一讲 1.什么是数据库,数据库的作用! 2.现流行的数据库的种类,特点 3.sql2005的版本、特点,硬件要求 4.数据库的安装(在安装过程中介绍数据库的插件,登录方式,实例) 5.系统安装进行中: 6.数据库的几个基本概念(关系型数据库) 7.存储方式(表结构)(关系=一张二维表、网状、层次简要说明) 8.二维表结构剖析(主键、外键等基本概念) 9.上机:(练习安装数据库,熟悉数据库的基本环境) 第二讲 1.详细观看上节课所安装上的数据库的插件的作用 2.演示企业管理器的界面 3.数据库的身份认证方式详解 4.系统数据库的介绍 5.数据库文件 6.新建自己的数据库 7.数据库服务的开启与停止、数据库文件的移动 8.上机:练习建立数据库(自己的名字命名的) 第三讲 1.复习数据库的建立 2.数据库基本用户的管理 3.现实抽象模型ER图(简单运用) 4.运行实体类思想在数据库中建立基本表(字段类型简单介绍),用企业管理器和sql两种方式 5.上机:练习建表(学生名单表) 第四讲 1.关系表的建立,方法、思想 2.约束的类型 3.约束的创建和删除 4.使用默认和规则 5.上机:建立关联表(学生教师关联表) 项目实训(进销存数据库设计) 第五讲 开始sql的学习: 1. 打开数据库 2. Select简单语句 3. 使用*和列明 4. 使用distinct消除重复 5. 使用top n 【percent】返回n行 6. 修改查询中的列标题 as 7. 在查询结果中显示字符窜 8. 使用where子句 9. 使用条件表达式 10. 上机:练习上面多学的sql语法(检索学生教师信息),下节课同学在黑板演示 第六讲 1.复习上节课的sql语句,学生演示 2.继续学习sql语句 3.使用列表达式 4.order by子句 5.使用in关键字 6.使用like关键字查询(精确查询和模糊查询) 7.使用is null关键字查询空值行 8.上机:建立选课表,查询没有选课学生,按班显示 第七讲 1.复习上节学习sql语句,学生上台演示 2.查询范围信息 3.使用between关键字 4.使用compute关键字 5.使用group by子句 6.上机:以班分组选出不及格的学生和不同时间入学的学生 第八讲 1.复习上节知识 2.使用having子句 3.学习嵌套查询 4.使用union连接查询 5.多表查询 6.学习别名 第九讲 1.复习上节内容 2.使用exists关键字 3.小型实训(建立图书馆图书数据表,查询出符合客户意愿的图书) 第十讲 索引及其应用 1.索引的作用 2.建立索引的原则 3.使用企业管理器建立索引 4.使用sql建立索引 5.上机:练习建立索引(学生表) 第十一讲 1.复习上节内容 2.索引的相关操作 3.删除索引 4.索引的分析与维护 5.上级:在自己的图书管理系统上建立合理的索引 视图的学习 1.视图的概述 2.视图的优缺点 3.视图的创建、修改、删除 4.上机:练习创建视图 第十三讲 1.复习上节sql创建视图方法 2.重命名视图及显示视图信息 3.通过视图查询数据、通过视图更新数据 4.上机:给自己的图书系统常见合适的试图,使查询更简便 第十四讲 储存过程的学习 1.什么是储存过程 2.储存过程的类型 3.存储过程的优点 4.储存过程与视图的比较 5.创建储存过程 6.上机:创建自己的储存过程 第十五讲 1.复习上节创建储存过程 2.带参数的储存过程 3.修改储存过程 4.删除储存过程 5.重命名储存过程 6.重新编译储存过程 7.上机:在自己的项目上创建储存过程 第十六讲 触发器的学习 1.触发器的概述(作用,目的) 2.触发器的创建 3.管理触发器 4.上机:在自己项目上创建合适的触发器 第十七讲 安全体系: 1.sql2005的安全认证模式 2.身份认证 3.windows身份认证‘ 4.混合身份认证 5.权限认证 6.创建账户 7.登录账户 8.账户的权限管理 9.上机:创建以自己名字为名的账户 1.复习上节课的权限分配方式 2.sql授权 3.上机:在自己的项目上创建不同权限的用户 第十九讲 数据复制 1.复制模型 2.复制与出版的关系 3.复制类型(快照复制、事务复制、合并复制) 第二十讲 1.复习上节复制内容 2.配置复制 3.创建发布 4.订阅 5.创建强制订阅 上面的内容就是我对sql2005的总体的讲课思路和顺序的概括,在写上面的内容时,不知不觉的又对sql2005的总体的知识结构有个一个更加清晰的思路。 **在对数据库的基础知识的备课的过程中,新的理解: 1.数据库多层表的联接关系,联接和子查询。 2.数据库建表思想:树形表,主从表的建立 3.体会数据库范式结构:三范式,理解范式,处理冗余数据,修改删除异常。 4.高级查询语句及函数的应用 5.在查询中运算和强制转换的功能 6.数据库中并发运行,共享锁、排他锁的理解,防止丢失修改、读入无效数据 **下面是详细记录的几点具体理解 1.建表的时字段类型的选择对你的运行效率起着至关重要的作用,varchar(max)nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操 作,这是一个亮点。 2、外键的级联更能扩展 可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。但是再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SET NULL 和 SET DEFAULT 属性,能够提供能好的级联设置。 3、索引附加字段 这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。网上有人实验,在环境中会比映射到表中提高30%左右的效率。 4.子查询和表连接 现在sql语法实现多表查询,一般可以用两种方法,即表连接和子查询。子查询跟关联效率差不多,但要看你怎么写了,查询中尽量避开用in、not in 对asp.net的学习 在李老师的带领下,我们一起学习asp.net,最近做的是李老师以前做过的一个仙霞集团得网站,当时是用asp技术做的,现在我们把它改成asp.net的,下面说下我的学习心得吧! 一:熟悉asp语言和asp.net语言的头文件(就是自动生成的那个),讲文件的扩展名换成aspx,看当时选的asp.net是否是代码单独放置,如果是就构造一个对应的cs文件,如果选的否就不用构造了,直接就ok,如果是静态的页面,这样就结束了,如果是动态页面,把asp代码删掉,添加上.net代码就ok了,基本做法就是这样! 二:过程中遇到的问题: 1:访问IIS元数据库失败 解决方法: 1先关闭你的VS2005。打C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files 找到你刚才调试的程序的名字的目录删除它。 3关闭IIS服务器,重开一次。 4用IE浏览一下你的程序,问题解决。 2.js的导航条定位问题 引用了原来的js导航条,在引用后出现莫名其妙的导航条的弹出层定位不准,出现的位置不在合适的位置了,要改变他的位置,经过分析发现两处界定他的位置,一个是css代码中使用POSITION: absolute;绝对定位,在js中设定初始的像素值(xy)。 三:新的认识 1.DataReader只能提供只读访问,不能用来改变数据,它仅能向前遍历数据。 2.在DataTable中寻找行可以使用以下的两种方式: 1.objRows = objTable.Select(“ColName1 = 'str1'“ And ColName2 = 'str2'“) 2.objRows = objTable.Rows.Find(“主键码“)这种方法要求提供主键码。 3.Command对象和DataAdapter对象之间的区别: 一:Command对象用于运行命令,DataAdapter对象用于为多个命令提供存储空间。 二:DataAdapter对象具有SelectCommand,UpdateCommand,InsertCommand,DeleteCommand 四个属性,这些属性可以保存Command对象。第三篇:sql语句学习_经典_推荐
第四篇:sql语言学习
第五篇:sql学习步骤