1、 SQL2005教案 (40课时) 第一节课 sql2005的安装,数据库和表的创建以及基本概念 1.图示说明 2.基本概念 数据库(DB,Database):数据库是长期储存在计算机内,有组织,可共享的大量数据的集合. 数据(Data):数据是数据库中存储的基本对象,它是描述事物的符号记录.数据是信息的载体,信息是数据反映出的一种关系. 数据库管理系统(DBMS,Database Management System):是数据库的机构,是一种软件,负责数据库中的数据组织,数据操作,数据维
2、护,控制及保护和数据服务等. 数据库系统(DBS):包含数据,数据库,数据库管理系统,数据管理员等. 3.数据库系统的发展 人工管理阶段 文件系统阶段 数据库系统阶段 4.SQL2005的版本及常用数据库 SQL2005版本: * SQL Server Enterprise Edition:具有企业级功能的SQL Server版本,适用于大型企业以及大型数据库或数据仓库的服务器版本。 * SQL Server Standard Edition:具有标准功能的SQL Server版本,适用于一般企业的服务器版本
3、 * SQL Server Workgroup Edition:自SQL Server 2000开始才有的版本,专为工作组群或部门所设计,适用于较小规模的组织。 * SQL Server Web Edition:自SQL Server 2008开始才有的版本,专为Web 服务器与Web Hosting所设计,功能上较Workgroup Edition少一些。 * SQL Server Express Edition:免费的SQL Server版本,适用于小型应用程序或是单机型应用程序,但在功能上有设限,如只能使用一颗处理器,以及最大数据库大小为4GB等。请见SQ
4、L Server Express。 目前常用数据库: 开源公司的mysql 微软的mssql我们也经常说是SQL SERVER oracle公司的oracle SYBASE的powerbuilder IBM的DB2 BORLAND公司的产品interbase, 美国Informix软件公司的Informix 数据库,表的创建 1. 创建数据库goods 2. 创建3个表 Users表(用户表) Ware表(商品信息表) Shopping表(商品销售表)
5、 3. 基本概念: 表、行、列、属性、字段、域、实体. 4. 数据库重命名,表结构的修改. 5. SQL(Structured Query Language-结构化查询语言):是由IBM公司在70年代开发的关系型数据库原型System R的一部分,现在已成为关系型数据库系统通用的查询语言,它是数据库系统的通用语言.SQL语言主要包括数据定义,数据控制,数据操纵和数据查询等功能,其中最重要的是数据查询功能. 6. 数据定义语言DDL(Data Definition Language) <1>创建数据库 create database goods <2>选择数据库
6、 use goods <3>创建表 create table users( User_ID int, User_Name nvarchar(50), Email nvarchar(50), Card nvarchar(50), Tell nvarchar(50), Address nvarchar(50)) <4>修改表 --添加一列 alter table users add remark varchar(50) --修改一列的数据类型 alter tab
7、le users alter column remark varchar --删除一列 alter table users drop column remark <5>删除表 drop table Users <6>删除数据库(注意确定一下当前正在使用的数据库) drop database t 第二节课 数据处理语句DML(Data Manipulation Language) 1. 插入数据 insert into users(user_id,user_name,user_age,email,card,tell, address)
8、 values(1234,'jodon',35,'jodon123@','1234567890','138888888','美国') 注意: (1)必须用逗号将各个数据分开,字符型数据要用单引号括起来,且into可以省略。 (2)INTO子句中没有指定列名,则新插入的记录必须在每个属性列上均有值,且VALUES子句中值的排列顺序要和表中各属性列的排列顺序一致。 (3)将VALUES子句中的值按照INTO子句中指定列名的顺序插入到表
9、中。 (4)对于INTO子句中没有出现的列,则新插入的记录在这些列上将取空值(remark). (5)当插入的数据包含了每一个列,则可以省略列名.如下: Insert into users values(1234,'jodon',35,'jodon123@','1234567890', '138888888','美国') 2. 修改记录 <1> update users set user_age=20 <2>update users set user_age=26 where user_id=1234 <3>up
10、date users set user_age=user_age+5 3. 删除记录 <1>delete from users where user_id=4321 <2> delete from users 4. 主键约束 <1> <2> create table users( User_ID int primary key, User_Name nvarchar(50), Email nvarchar(50), Card nvarchar(50), Tell
11、 nvarchar(50), Address nvarchar(50)) 5. 上机练习 <1>练习课堂内容 <2>建立学生数据库student,并建立四张表:学生基本信息表,课程设置表,选课表,成绩表,并练习所学的SQL语句 第三节课 简单查询语句 1. 查询users表中所有记录的所有字段 select *--也可以把所有的列都写上 from users 注释补充: --注释一行 /*……*/注释一段 2. 查询所有记录的姓名和年龄 select user_name,user_age from
12、 users 别名补充: select user_name as 姓名,user_age as 年龄 from users --其中as可以省略 3. 查询年龄超过20的所有记录 select * from users where user_age>20-->= < <= <> != = 4. 查询年龄在20和50之间的记录 <1>select * from users where user_age>=20 and user_age<=50
13、 <2>select * from users where user_age between 20 and 50 5. 查询年龄大于30或年龄小于20的记录 select * from users where user_age <20 or user_age>30 6. 查询年龄不等于30的记录 <1>select * from users where user_age <>30--!= <2>select * from users whe
14、re not user_age =30 7. 查询年龄不等于20也不等于30的记录 <1> select * from users where user_age !=30 and user_age<>20 <2> select * from users where not (user_age =30 or user_age=20) 8. 查询年龄等于20或者等于30的记录 <1> select * from users where user_age =30 or user_age=20 <2> select * from users where use
15、r_age in (20,30) 上面7也可以用下面方式实现 select * from users where user_age not in (20,30)—not 也可以放在user_age之前 9. 查询users表中有多少条不同的记录 select distinct * from users 10. 查询users表中都有哪些年龄的记录 select distinct user_age from users 模糊查询(通配符’_’,’%’) 11. 查询所有姓姚且
16、名字为两个字的记录 select * from users where user_name like '姚_' 12. 查询所有姓姚的记录 select * from users where user_name like '姚%' 13. 查找第二个字为“小”的所有记录 select * from users where user_name like '%小%' 14. 查询所有不姓姚的记录 select * from users where u
17、ser_name like '[^姚]%' 15. 查询所有姓姚或姓王的记录 select * from users where user_name like '[姚,王]%' 16. 查询所有姓姚且第二个字不为大或小的记录 select * from users where user_name like '姚[^大,小]%' 17. 查询姓名不为空的记录 select * from users where user_name is not null 上机练习: 1〉 练
18、习课堂所讲内容 2〉2人一组以student数据库为例互相设计题 第四节课 1. 修改users表,添加新列users_sex(性别) alter table users add user_sex nchar(10) 2. 查询出前两条记录 select top 2 * from users 3. 查询users表中的所有记录,并按年龄降序或升序排列 select * from users order by user_age asc—asc可以省略不写,默认即为asc
19、 select * from users order by user_age desc 4. 查询所有记录,并按年龄升序排列,年龄相同按card降序排列 select * from users order by user_age asc , card desc 5. 查询users表中男女各多少人 select count(*) from users group by user_sex 注意:使用分组的时候,查询的列必须出现在聚合函数中或者必须出现在group by 后面,下面
20、的写法是错误的: select user_name,user_sex from users group by user_sex 6. 查询users表中男女各多少人,且只有当人数超过3人才输出信息 select count(*) from users group by user_sex having count(*)>3 7. 查询users表中最大的年龄是多少 select max(user_age) from users 8. 查询users表中最小的年龄是多少
21、 select min(user_age) from users 9. 求users表中所有人年龄的总和 select sum(user_age) from users 10. 求users表中所有人的平均年龄 select avg(user_age) from users 连接查询 1. 笛卡尔积 select * from ware,shopping 2. 等值连接 select * from ware,shopping whe
22、re ware_code=code select * from ware join shopping on ware_code=code 3. 不等值连接 select * from ware,shopping where ware_code<>code select * from ware join shopping on ware_code<>code 4. 查询所有已销售商品的名称,进价,销售价,销售数量和日期 select na
23、me,startprice,saleprice,shopping.amount,shopping.date from ware join shopping on ware_code=code 注意:当连接的表中出现相同列名时,必须加表名来区分 5. 查询所有已销售商品的名称,进价,销售价,销售数量和盈利额 select name,startprice,saleprice,shopping.amount, shopping.amount*(saleprice-startprice) 盈利 from
24、 ware join shopping on ware_code=code 6. 查询所有已销售商品且盈利的名称,进价,销售价,销售数量和盈利额 select name,startprice,saleprice,shopping.amount, shopping.amount*(saleprice-startprice) as 盈利 from ware join shopping on ware_code=code where saleprice-startprice>0 7. 自然连接(特殊的等值连接,去掉
25、了重复的列) select ware.*,shopping.amount,shopping.saleprice,shopping.date from ware inner join shopping on ware_code=code 补充:inner join 也叫内连接,inner也可以省略不写,即默认为内连接 第五节课 外连接 1. 左外连接 select * from ware left join shopping on ware_code=code 2. 右外连接
26、
select *
from ware right join shopping
on ware_code=code
3. 全外连接
select *
from ware full join shopping
on ware_code=code
4. 自连接
<1>查找年龄比姚明小的所有记录
select a.*
from users as a,users as b
where a.user_age
28、er_name='姚明' 5. 交叉连接 select * from ware cross join shopping 说明:其实就是笛卡儿积 6. 集合查询 <1>并(union) select ware_code,date from ware union select code,date from shopping --注意:所查询的目标列必须相同 <2>交(intersect) select ware_co
29、de from ware intersect select code from shopping <3>差(minus)—说明:SQL2005不支持minus运算,oracle支持 第六节课 复习 以student数据库为例复习前面所讲内容 第七节课 子查询—嵌套查询(所有的链接查询都可以用子查询实现) 1. 查询出王小明的所有成绩 步骤: <1>查询出王小明的学号 select stu_id from stu where stu_n
30、ame=’王小明’ <2>查询出上面所查询出的学号所对应的课程成绩 select s_score from score where s_id=stu_id 子查询: select s_core from score where s_id= (select stu_id from stu where stu_name=’王小明’) 按照处理方式分为相关子查询和无关子查询 相关子查询:是一种子查询和外层查询相互交叉的数据检索方法(一般不用) 无关子查询:子查询中不包含
31、对外层查询的任何引用。 2. 查询所有选修了编号为C123课程的学生姓名 select name from stu where stu_id in (select c_id from xunke where kc_id=’N123’) 单行子查询—子查询返回的是一行,因此可以可以把子查询作为一个常量对待 3. 查询身份证号为4105221996212的学生都所选课程的编号 select kc_id from xuanke where c_id= (select stu_id from stu where code=’410522199
32、6212’) 注意:如果子查询的结果不是单个值,则系统会提示错误。 4. 查询年龄最大的学生的所有信息 select * from stu where stu_age= (select max(stu_age) from stu) 5. 查询年龄比张三小的所有学生信息 select * from stu where stu_age< (select stu_age from stu where stu_name=’张三’) 多列子查询:如果子查询返回多个列的数据,就称为多列子查询。(一般很少应用) 6. 查询男生中年龄最大的
33、学生的学号和姓名 select stu_id, stu_name from stu where (stu_id, stu_age) in (select stu_id, max(stu_age) from stu group by stu_sex) 多行子查询:查询返回单列多行数据的子查询称为多行子查询。 7. 查询所有有成绩的学生信息 select * from stu where stu_id in (select s_id from score where not s_fenshu is null) 8. 查询所有
34、选修了C语言的学生信息 select * from stu where stu_id in (select s_id from course, xuanke where course.kc_id=xunanke.kc_id and course.name=’C语言’) 9. 查询所有没有选修C语言的学生信息 select * from stu where stu_id not in (select s_id from course, xuanke where course.kc_id=xunanke.kc_id and cours
35、e.name=’C语言’) 10. 查询年龄不小于所有女同学的男同学的学号和姓名 select stu_id, stu_name from stu where stu_sex=’男’ and stu_age>=any (selelct stu_age from stu where stu_sex=’女’) 11. 查询年龄比所有女同学都大的男同学的学号和姓名 select stu_id, stu_name from stu where stu_sex=’男’ and stu_age>all (select stu_age from
36、 stu where stu_sex=’女’) exists使用:存在检查—即只要子查询返回的结果不为空,则认为是真,反之认为是假。(有可能子查询和外层查询没有任何关系) 12. select * from stu where exists (select * from score) select * from stu where no
37、t exists (select * from score) 多层嵌套: 13. 查询选修了C语言的学生信息 select * from stu where stu_id= (select xuanke.id from xuanke where kc_id= (select kc_id from course where kc_name=’C语言’))
38、相同表结构之间拷贝数据 14. insert into stu1 values(select * from stu2) 15. 上机练习.
39、 第八节课 T-SQL 1. 变量 ->全局变量:由系统定义和维护,名称以两个@字符开始; ->局部变量:由用户定义和赋值,名称以单个@字符开始; 《1》全局变量 --使用全局变量记录SQL SERVER 服务器活动状态,对用户来讲是只读的。 常用全局变量举例: @@ERROR--这个变量包含当前连接发生的最后一次错误的代码。在执行的语句没有错误时,@@ERROR变量的值是0。 select @@error from student—先故意写错表名查询,然后再去掉from直接查询
40、 @@ROWCOUNT—存储最近查询的记录数。 select * from stu select @@rowcount @@VERSION—数据库版本信息 select @@VERSION 《2》局部变量 声明: DECLARE 变量名称 数据类型 declare @count int, @name char(10) 赋值:SET 变量名称=变量值 set @count=0 declare @max_age int select @max_age=ma
41、x(stu_age) from stu 2. 运算符 《1》 算术运算符 + - * / % 《2》 比较运算符(关系运算符) > < = >= <= <> != 《3》 逻辑运算符 and or not & | ~ ^ 3. 函数 《1》 系统函数 DB_NAME: 获得当前使用的数据库名 select db_name() HOST_NAME: 获得服务器主机名 select host_name() USER_NAME: 获得用户名称
42、 select user_name() select user_name(2) USER_ID: 获得用户id select user_id() 《2》 日期函数 GETDATE: 获得系统日期 select getdate() DATEADD: 在给定日期的指定部位上增加指定的值 select dateadd(day,2,getdate()) DATEDIFF: 计算给定两个日期在指定部位上的差值 select dated
43、iff(day,'2011/1/1',getdate()) YEAR:获得给定日期的年份 select year(getdate()) MONTH:获得给定日期的月份 select month(getdate()) DAY: 获得给定日期的日 select day(getdate()) 《3》 字符串函数 基本函数 UPPER:小写转大写 select upper('abc')
44、 LOWER:大写转小写 select lower('ABC') SPACE:添加空格 select '姚'+space(2)+'名' REPLACE:替换字符 select replace('abbccdd','c','Q') STUFF:在给定的字符串中删除指定位置开始的指定长度,并在此位置插入给定的新字符串 select stuff('abcdef',2,3,'123456')
45、 LTRIM:删除给定字符串左边的空格 select ltrim(' abc d '); RTRIM:删除给定字符串右边的空格 select rtrim(' abc d '); 查找函数 CHARINDEX:从指定位置开始查询指定的字符串,返回该字符串的位置编号 select charindex('bc','abcdefg',1); PATINDEX:(和上面的一样,但
46、支持通配符 select patindex('_b%','abcdefg') 长度和分析函数 DATALENGTH:求给定字符串的长度,或者是给定数据所占空间值 select datalength('123') select datalength(123) SUBSTRING:取子字符串 select substring('abcdefg',2,4) RIGHT:从给定字符
47、串有变取指定长度子字符串 select right('abcdefg',4) 转换函数 CHAR:求指定asc码值对应的字符 select char(97) STR:把给定整数转换成字符串 select str(12345) 《4》 数学函数 ABS:求绝对值 select abs(-2) CEILING:返回大于或等于给定数字的最小整数 select ceiling(3.56) FLOOR:返
48、回小于或等于给定数字的最大整数 select floor(3.56) ROUND: select round(3.56478,3) select round(4321,-3) 《5》 用户自定义函数 定义:create function 修改:alter function 删除:drop function create function 函数名称(参数名称 as 数据类型) returns 返回数据类型 [as] begin 函数内容 return 表达式
49、 end 举例1:定义一个用来计算员工奖金的函数,并使用该函数输出员工的奖金 create function bonus(@salary as money) returns money as begin return (@salary *0.3) end --输出 select 姓名,dbo.bonus(工资) as 奖金 from 员工表 举例2: create function guest.test() returns int as begin return 1+2; end select guest.test() 举例3: create function dbo.upt






