sql语句
来源:互联网 发布:r语言编程书籍 编辑:程序博客网 时间:2024/05/29 19:38
1.创建表
举例如下:create table teachers(
Tno char(7) primary key,
Tname char(10) not null,
Sex char(2) check(Sex = '男' OR Sex ='女'),
Birthday DATE,
Title char(6),
Dno char(4),
Foreign key(Dno)REFERENCES Departments(Dno)
);
注:char 和varchar的区别:char是定长字符串,varchar是变长字符串,前者需要固定长度的空间,而后者占用的空间在最大长度范围内是可变的。
2.修改表(SQL语言使用ALTER TABLE修改基本表)
(1)向基本表中添加新的列ALTER TABLE<表名> ADD [COLUMN]<列定义>如:ALTER TABLE Coursers ADD Pno CHAR(5);
(2)对于已存在的列只允许修改或删除列的缺省值,语句形式为:ALTER TABLE<表名>
ALTER [COLUMN]<列名>{SET DEFAULT<缺省值>|DROP DEFAULT}
如:ALTER TABLE Students ALTER SEX SET DEFAULT '女';
(3)删除已存在的列 ALTER TABLE <表名> DROP[COLUMN]<列名>{CASCADE|RESTRICT}其中CASCADE表示级联,RESTRICT表示受限
如:ALTER TABLE Courses DROP Pno;
(4)添加表约束ALTER TABLE<表名> ADD<表约束定义>
(5)删除表约束ALTER TABLE<表名>DROP CONSTRAINT<约束名>{CASCADE|RESTRICT}
3.删除表DROP TABLE<表名>{CASCADE|RESTRICT}如DROP TABLE SC RESTRICT;
4.建立和删除索引(索引类似于数的目录,索引通常分为唯一性索引和非唯一性索引,也可以分为聚簇索引和非聚簇索引)
(1)创建索引的语句格式为:CREATE [UNIQUE][CLUSTER] INDEX<索引名>ON <表名>(<列名>[<次序>]...<列名>[<次序>]);
其中列名后可以用次序指定索引值的排列次序,包括ASC(升序)和DESC(降序)缺省值为ASC;UNIQUE表示该索引为唯一性索引,缺省时为非唯一性索引;
CLUSTER表示建立的索引时聚簇索引,缺省时为非聚簇索引注:聚簇索引比非聚簇索引的查询效率高,但是维护代价大,所以一个基本表最多只能建立一个聚簇索引
如:CREATE INDEX Student_Dept ON Students(Dno);
(2)删除索引DROP INDEX<索引名>
5.查询语句用SELECT语句实现
(1)语句的一般形式如下SELECT[ALL|DISTINCT]<选择序列>
FROM <表引用>,...,<表引用>
[WHERE<查询条件>]
[GROUP BY<分组列>,...<分组列>[HAVING<分组选择条件>]]
[ORDER BY<排序列>[ASC|DESC],..,<排序列>[ASC|DESC]]
注:ALL表示不删除结果的重复行,DISTINCT表示删除结果中的重复行
(2)不带WHERE的简单查询,举例SELECT * FROM Students;
(3)带WHERE的查询
*比较表达式形式如下:<值表达式1>R<值表达式2>其中R是比较运算符(<、<=、>、>=、=、<>、!=)
*BETWEEN表达式判定一个给定的值是否在给定的闭区间,最常见的形式如下:<值表达式>[NOT]BETWEEN<下界>AND<上界>
如:SELECT Sname,Speciality
FROM Students
WHERE year(Birthday)BETWEEN1987 AND 1990;
*IN表达式判定一个给定的元素是否咋给定的集合中。
IN表达式的两种形式:a.<值表达式>[NOT]IN(<值表达式列表>)举例如下:
SELECT Sno,Sname
FROM Students
WHERE Specility IN('计算机科学与技术','软件工程');
b.<元祖>|[NOT] IN<子查询>
*LIKE表达式允许模糊查询一般形式为:<匹配值>[NOT] LIKE<模式>[ESCAPE '<换码字符>']其中,匹配值是属性,模式是字符串常量,模式中允许使用通配符,有两种通配符:“_”可以与任意单个字符匹配,而“%”可以与零个或多个任意字符匹配,ESCAPE'<换吗字符>'通常的形式是ESCAPE'\'它定义为转义字符,将紧随气候的一个字符转移。
举例如下:SELECT *
FROM Courses
WHERE Cname LIKE 'C \ _ % ' ESCAPE '\';
*NULL表达式允许我们判定给定的值是否为空值。常见形式如下:<值表达式>|<子查询>IS[NOT]NULL
如:SELECT Sno,Cno FROM SC WHERE Grade IS NULL;
6.排序和分组
a.将查询结果排序
ORDER BY子句可以按多个结果列将查询结果排序,形式如下:ORDER BY<排序列>[ASC|DESC],<排序列>[ASC|DESC]缺省值为升序(ASC)注:如果指定多个排序列,则查询结果按指定的次序,首先按第一个排序列的值排序,第一个排序列值相同的结果元祖按第二个排序列的值排序,如此下去。
如:SELECT * FROM SC ORDER BY Cno,Grade DESC;
b.聚集函数(SQL的聚集函数可以单独使用,也可以配合GROUP BY(分组)子句使用),单独使用时,聚集函数作用于整个查询结果;而与GROUPBY子句配合使用时,聚集函数作用于查询结果的每个分组。)
聚集函数具有如下形式:COUNT([ALL|DISTINCT] *)或<聚集函数>([ALL|DISTINCT]<值表达式>)
第一种情况:COUNT(*)或COUNT(ALL *)返回每个分组中元组的个数;而COUNT(DISTINCT *)返回每个分组中不同元组的个数。
第二种情况:<聚集函数>可以使COUNT(计数),SUM(求和),MAX(最大值),MIN(最小值),AVG(平均值);<值表达式>是可求值的表达式。通常是属性,短语ALL或DISTINCT是可选的,缺省时为ALL
如 SELECT MIN(Grade),AVG(Grade),MAX(Grade) FROM SC WHERE Cno = 'CS302';
c.分组
GROUP BY子句的一般形式为:GROUP BY<分组列>,<分组列>[HAVING<分组选择条件>]
其中,分组列是属性,他所在的表出现在FROM子句中,可选的HAVING子句用来过滤掉不满足分组选择条件的分组,缺省时等价于HAVING TRUE,分组条件允许出现聚集条件
如:SELECT Sno,AVG(Grade) FROM Students GROUP BY Sno HAVING AVG(Grade)>60;
7.嵌套查询(最常见的子查询嵌套在WHERE或HAVING短语的条件中,子查询不能使用ORDER BY语句)
嵌套查询可以为2类:不相关子查询(子查询条件不依赖于父查询)和相关子查询(子查询条件依赖于父查询)
a.IN引出的子查询表达式为<元组>[NOT] IN <子查询>当且仅当元组出现在子查询的结果中,该<元组>IN<子查询>为真,而<元组>NOT IN<子查询>为假
如:SELECT Sno,Sname
FROM Students
WHERE Sex = '女' AND Speciality IN (
SELECT Speciality
FROM Students
WHERE Sname = '王丽丽'
);
b.集合的比较引出的子查询表达式为:<值表达式>R ALL|SOME|ANY<子查询>,其中,值表达式是属性,R是比较运算符,当子查询的结果为单个值时,可以省略ALL,SOME和ANY。注:假设v是值表达式的值,s是子查询的查询结果,是一个集合,当v R ALL s为真,当且仅当v与s中的每个值都满足比较关系R。v R SOME s为真,当且仅当v与s中的某个值满足比较关系R。
如:SELECT Cno,AVG(Grade)
FROM SC
GROUP BY Cno
HAVING AVG(Grade) >= ALL (SELECT AVG(Grade) FROM SC GROUP BY Cno);
c.存在量词引出的子查询表达式为 EXISTS<子查询>其中,子查询的SELECT子句的形式为SELECT *。EXISTS为真,当且仅当子查询的结果非空。
如:SELECT Sno,Sname
FROM Students S
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno = S.Sno AND Cno = 'CS403');
d.检测子查询结果中的重复元素表达式为UNIQUE<子查询>该表达式为真,当且仅当子查询的结果中不存在两个完全相同的元组。
如:SELECT Tname ,Title
FROM Teachers T
WHERE UNIQUE(SELECT Tno FROM Teaches TC WHERE T.Tno = TC.Tno);此语句为查询之讲授一门课程的教师的姓名和职称。
8.数据更新
(1)插入 两种形式:a. 插入单个元组:语句格式为 INSERT INTO T[(A1,A2,...,AK)] VALUES(C1,C2,...,CK)其中T是基本表,也可以是视图,A是T的属性c是常量,当A缺省时,VALUES子句必须按基本表属性的定义次序提供新元组每个属性上的值。如:INSERT INTO SC(Sno,Cno,Grade) VALUES('200323','CS12','34');
b.插入查询结果语句格式为INSERT INTO T[(A1,A2,...,AK)] <查询表达式>其中,查询表达式通常是一个SELECT语句,该语句对查询表达式求值,并将记过元组集插入到基本表T中。
如:INSERT INTO Cardinf(Card-no,Name,Balance)
SELECT Tno,Tname,100.00
FROM Teachers
WHERE Dno = 'IE';
(2)删除DELETE语句格式为:DELETE FROM T [WHERE <删除条件>]WHERE缺省时,则删除表中的全部元组
如:DELETE FROM Students WHERE Sno = '200904';
(3)修改UPDATE语句格式为UPDATE T SET A1=E1,...,AK = EK [WHERE<修改条件>]
如:UPDATE Teachers SET Title = '副教授' WHERE Tno = 'B089989';UPDATE语句只能修改一个表的元组
- SQL语句
- sql语句
- SQL语句
- SQL语句
- SQL语句
- SQL语句
- SQL语句
- SQL语句
- SQL 语句
- sql语句
- sql语句
- Sql语句
- SQL语句
- SQL语句
- sql语句
- SQL 语句
- sql语句
- sql语句
- 不能继承的类
- SVN+APACHE的安装配置
- C语言:stat,fstat和lstat函数
- ArcGIS Server 站点架构-Web Adaptor
- crontab
- sql语句
- 阿里巴巴资深DBA的职业生涯总结
- [软件人生]耐得住寂寞——积累是低潮时期技术人员的品质
- hibernate缓存机制
- jQuery的26个使用技巧
- nodejs 发送 post 请求 带参数
- ArcGIS 10.1 for Server 在windows下的安装
- 如何认知(考察)面试者?
- 【原+译】图解移动行业数据