例:列出张姓且单名的学生的学号、姓名。



Select sno,sname
From  Student
Where sname LIKE‘张_ _’






转义符: escape



例:列出课程名称中带有‘_’的课号及课名。



Select cno,cname
From  Course
Where cname LIKE‘%\_%’ escape ‘\’





•指定结果集中元组的排列次序



–耗时



–ASC(缺省)、DESC



–(Null的处理、序号引用、未列出属性的引用)






例:列出CS系中的男生的学号、姓名、年龄,并按年龄进行排列(升序)



Select sno,sname,sage
From Student
Where sdept = ‘CS’
Order By sage ASC









例:列出具有两门(含)以上不及格的学生的学号、不及格的课目数。





Select sno,count(*)
From SC
Where grade < 60
Group By sno
Having count(*) >= 2







关系的连接——内连接



内连接的连接方式



Select  *
From  S Inner Join SC on S.sno = SC.sno
也可以用笛卡儿积 + 选择的方法实现
Select  *
From   S , SC
Where  S.sno = SC.sno








关系的连接——外连接



–左外连接(Left Outer Join):
Select *
From   S Left OuterJoin SC on S.sno = SC.sno
–右外连接(Right Outer Join):
Select *
From   S Right Outer Join SC on S.sno = SC.sno

–全外连接(Full Outer Join):
Select *
From  ( S Full Outer Join SC on S.sno = SC.sno)
–交叉连接(Cross  Join):
Select   sno,cno
From   S  Cross  Join C








嵌套子查询—集合成员资格In





例:查询选修了数据库课程的学生的学号





Select sno
From SC
Where cno IN (
Select cno
From C
Where cname like ‘%数据库%’)






例:找出与201190609118同龄的学生



Select  *
From Student
Where sage = ( Select sage
   From Student
   Where sno = ‘201190609118’ )









例:找出年龄最小的学生



方法1:
Select * From S Where sage <=ALL (Select sage From S )
方法2:
Select *   From    S
Where sage = (  Select min(sage)   From S )







例:创建从学生表中查询自己信息的视图并使用该视图进行查询。



Create Viewzz as
Select   *
From   学生表
Where姓名 = ‘zz’

SELECT   *   FROM   zz



例:创建查询自己各科成绩的视图



Create View  zz个人成绩  as
Select姓名,课程名,成绩
From学生表,课程表,成绩表
Where姓名 = ‘zz’  AND
学生表.学号=成绩表.学号码AND
课程表.课程号=成绩表.课程号



例:建立学生平均成绩视图



Create View  平均成绩视图(学号,平均分) as
Select 学号,avg(成绩)
From   成绩表
Group By 学号



例:修改学生平均成绩视图



ALTER  View  平均成绩视图(姓名,平均分) as
Select 姓名,avg(成绩)
From   成绩表,学生表
Where  学生表.学号=成绩表.学号
Group By  姓名



创建带参存储过程,从学生表、课程表、成绩表中查询指定学生的姓名、课程名和成绩。



CREATE   PROCEDURE  成绩查询
     @sname  varchar(6)
  AS  
SELECT   姓名,课程名,成绩
FROM      学生表、课程表、成绩表
WHERE   学生表.学号=成绩表.学号    AND
       课程表.课程号=成绩表.课程号   AND
       姓名= @sname
执行存储过程
  EXEC      成绩查询@sname =‘zz’



insert 触发器示例



create trigger tri_insert
on 学生表
for insert
as
declare @student_id char(10)
select @student_id=s.student_id
from  学生表  s inner join inserted  i
on s.学号=i.学号
if @student_id='0000000001'
begin
raiserror('不能插入1的学号!',16,8)
rollback   transaction
end






update触发器示例



create trigger tri_update
on 学生表
for update
as
if update(学号)
begin
raiserror('学号不能修改!',16,8)
rollback transaction
end






delete触发器示例



create trigger tri_delete
on 学生表
for delete
as
declare @student_id varchar(12)
select @student_id=学号 from deleted
if @student_id=‘201190609111’
begin
raiserror('错误',16,8)
rollback transaction
end






内嵌表值函数



举例:



CREATE  FUNCTION  func(@id char(12))
RETURNS TABLE
AS
RETURN (SELECT   *  FROM  学生表WHERE  学号 = @id)
**************************************调用内联表值函数:
select    *
from     func(‘201190609118')


















---------------------------------------------------------------------------------








SQL 练习_Group




建立学生表


CREATE TABLE  学生表
(  学号   CHAR(12) PRIMARY KEY , 
   姓名   CHAR(6)  NOT NULL, 
   性别   CHAR(2)  CHECK (性别 IN (‘男’,‘女’))
   班级   CHAR(10)
 )



建立课程表


CREATE TABLE  课程表
( 
	课程号  CHAR(2) PRIMARY KEY ,
	课程名  CHAR(20) NOT NULL,
	学分    INT
)


建立成绩表


CREATE TABLE  成绩表
( 
	学号    CHAR(12)  REFERENCES 学生表(学号),
	课程号  CHAR(2),
	成绩    INT  DEFAULT 0,
	FOREIGN  KEY(课程号 ) 
		REFERENCES (课程表 ) , 
	PRIMARY KEY (学号,课程号 ) 
)



---------------------------------------------------------------------------------










---------------------------------------------------------------------------------










---------------------------------------------------------------------------------