数据库基础知识重点(结合书的笔记)

创建数据库

格式:

​ 说明:创建数据库Create DtataBase语句,由于该语句在执行时,会自动创建数据文件与日志文件,因此在语句的格式中需要指明数据库的名称、数据文件名、日志文件名、存放路径、文件大小、增长比例等参数。

Create Database 数据库名
On [Primary]
(	name=逻辑文件名,
	filename=物理文件名,
	[,size=初始大小]
	[,maxsize=文件最大长度|unlimited]
	[,filename=文件增长幅度]
)[,...n]
Log On
(	name=逻辑文件名,
	filename=物理文件名
	[,size=初始大小]
	[,maxsize=文件最大长度|unlimited]
	[,filegrowth=文件增长幅度]
)[,...n]

例子:

​ 创建一个名为Test1的数据库,它有两个数据文件,其中主数据文件为100M,最大大小为200M,按20MB增长;1个辅助数据文件为20MB,最大大小不限,按10%增长。该数据库有两个事物日志文件,大小、最大长度和文件增长幅度均采用系统默认值,所有文件均放在e:\sql.

Create Database Test1#创建数据库Test1
On
(	name=Test1_data1,#主数据文件名
 	filename=`e:\sql\Test1_data1.mdf`,#储存位置,注意后缀
 	size=100mb,#大小
 	maxsize=200,#最大大小
 	filegrowth=20#增长率
),
(	name=Test1_data2,#辅助数据库文件名
 	filename=`e:\sql\Test1_data2.ndf`,#储存位置,注意后缀
 	size=20,#大小
 	maxsize=unlimited,#最大大小不限
 	filegrowth=10%#增长率
)
Log On#日志文件
(	name=Test1_log1,
 	filename=`e:\sql\Test1_log1.ldf`,
 ),
 (	name=Test1_log2,
  	filename=`e:\sql\Test1_log2.ldf`,
)

总结:

​ 通过以上的实例,可以清楚的了解到数据库表的创建格式。文件的后缀名。

注:

​ 创建数据库之后要刷新服务器才能在列表中显示新建的数据库,

存储过程

​ 存储过程是一种数据库对象,由一组被分析和编译后的SQL语句以过程形式放在数据库服务器上,供用户调用,允许数据以参数的形式在过程与应用程序之间进行来回传递。

优点:

  1. 减少网络传输量

  2. 加快执行速度

  3. 加强可移植性

  4. 增强安全机制

系统存储过程:

P153

事务

概念:

​ 事务是一个操作序列,序列中的每一个操作单元要么执行,要么都不执行。

例题:先创建一个极其简单的银行表(bank),其中有两个账户(A和B),分别存入了2000元和3000元。

Create Table bank
(
	account varchar(20) not null primary key,
    ammount money
)
--现在账户A想转500元给账户B
update bank ammount=amount-500
where account='A'
update bank ammount=amount+500
where account='B'
--此例表明:如果在这个事务中如何一个阶段,查询表,查询的结构都会不正确,必须要等这个事务处理完,或为处理才会显示正确的结果。

特性:

​ 并发的概念:

​ 两个或多个事务在同一个时间访问一个数据库对象的现象称为并发。

​ 并发控制:

​ 任务是确保在多个事务同时存取数据库中同一数据时,不破化事务的隔离性、一致性和数据库的一致性。

事务具有的特性:

  1. 原子性(Atomicity)
    1. 指一个事务要么执行(提交)要么撤销(回滚)
  2. 一致性(Consistency)
    1. 数据库只会包含事务提交的结果,数据库会从一个一致性状态(执行前)变到另一个一致性状态(执行后),不会处于中间状态,如果因为故障而中断事务,则系统必须撤销该事务的所有操作,回滚到事务开始时的一致状态。
  3. 隔离性(Lsolation)
    1. 并发执行的事务之间不能互相干扰,将并发事务间保持互斥称为隔离性
  4. 持续性(Durability)
    1. 事务一旦提交,对数据库中数据的改变是永久的,接下来的其他操作或故障不应该对其执行结果有任何影响。

事务管理:

  1. 锁机制保证事务的排他性
    1. 可以锁定一个正在被事务修改的数据,防止其他用户访问到‘’不一致‘’的数据
  2. 日志机制使事务具有可恢复性
  3. 事务日志管理特性保证事务的原子性和一致性

事务控制语句:

Begin Transaction:

​ 表示一个事务的开始

Commit:

​ 事务的结束

Rollback

​ 表示回滚,即在提交事务时发生了故障,撤销之前的所有操作,回滚到事务开始状态

Save Transaction:

​ 设置保存点,一个事务内,回滚节点。

例题:看书。

分布式事务:

​ 是指两个或多个的数据库事务,准备阶段、提交阶段

锁🔒机制

事务缺陷

  1. 脏读:A改,B读,A取消,B读不一致
  2. 不可重复读:A读,B修改,A再读不一致
  3. 幻影行:A读,B插入或删除,A再读不一致

隔离级别

P143页

​ 是在一段时间内禁止用户做某些操作,以避免产生不一样的数据

特征:

  1. 锁粒度:☞被锁定目标的大小。

  2. 锁的持续期:由隔离级别决定。

  3. 锁模式:☞锁的用途

    1. 共享锁:只读

    2. 排他锁:只能有一个人操作

    3. 更新锁:☞事务更新将要使用排他锁

    4. 意向锁:用于警示作用的锁

    5. 架构锁:用于保护数据库的模式

    6.  排他锁实例:
       Begin Transacton
       Update score
       set pscore = pscore + 5
       Where pscore < 60
       --现在不能查看数据库score
       RollBack
       --回滚,结束事务,排他性失效
      

丢失更新:

​ ☞两个或多个事务读取同一数据并进行修改,其中一个事务的修改结果破坏了另一个事务修改的结果。

丢失更新的防止:

悲观并发控制:

​ 使用一个锁系统,可以阻止用户以影响其他用户的方式修改数据。如果用户执行的操作导致应用被锁住了,则只有这个锁的所有者释放该锁,其他用户才能执行与该锁冲突的操作。

乐观并发控制:

​ 用户读取数据时不锁定数据,当用户更新数据时,系统进行检查,查看该用户是否又更新了该数据,如果其他人更新了数据,则产生一个错误。

数据操作

SQL功能动词
数据定义Create、Drop、Alter
数据操作Insert、Update、Delete
数据查询Select
数据控制Grant、Deny、Revoke

数据插入语句:

当数据库被创建后,需要插入数据。有两种方法:
1. 直接打开数据库,选择编辑前200行
2. 使用插入语句(使用Values关键字的Insert语句、使用Select子句的Insert语句)

Insert语句;

--语句格式
Insert [Into] <数据表名> [(列名列表)]
Values (值列表)

说明:

  1. 一次只能插入一个数据

  2. 如果向所有列插入数据且字段顺序相同,则字段名可以省略,如果向表中的部分列插入数据,则相应的字段名不能省略,字段名顺序可以与表不同。

  3. 列名列表和值列表必须严格一一对应,不仅列名的个数和值的个数相同,对应额数据类型也要相同,字符型长度不能超过定义的长度,否则会发生插入错误。

  4. 字符型的值和日期型的值要用单引号引起来,数字型的值则不需要用引号,如果数据中含有单引号,则需要替换成两个单引号。

  5. 如果在设计表的时候就指定了某列不允许为空,则必须要插入数据,

  6. 具有默认值的列,可以使用Default(默认)关键字来代替插入的数值

插入全部字段值:
--向系部列表department中插入两个系部的数据,代码如下:
Insert Into department
Values('D01','计算机系',null)
Insert Into department
Values'D02','电子系',null
插入部分字段值;
--改写上面的
Insert Into department(department_id,name,remark)--三个列名
Values('D01','计算机系',null)
Insert Into department(department_id,name)--两个列名
Values('D02','电子系')

Select子句的Insert语句:

--语句格式Insert [Into] <数据表名> [(列名列表)]Select 列名列表From 表名[where 条件]

具体说明见数据查询

说明:

  1. 实体完整性约束的限制:插入数据时不能违反实体完整性约束,即主键的值非空且不能重复。

  2. 参照完整性约束的限制:即外键的值必须取自参照表的主键或为空。

    --例如向专业表major中插入4个专业的数据insert Into majorValues('SW','软件专业','D01',null)insert Into majorValues('NW','网络专业','D01',null)insert Into majorValues('IT','物联网专业','D02',null)insert Into majorValues('NEW','新专业','D03',null)--上述语句中的前三句数据插入成功,后一句失败,因为专业表外键的值没有“D03”
    
    1. 其他约束的限制

数据更新语句:

​ 发现数据有错误,要修改数据。

数据更新的基本语句

Update 表名Set 列名1=1,列名2=2Where 条件表达式

说明

  1. 一条update语句可以修改多个字段的值,多个列赋值之间用逗号进行。

  2. 列和值的数据类型必须完全一样。

  3. 字符型的值和日期型的值要用单引号引起来,数字型的值则不需要用引号,如果数据中含有单引号,则需要替换成两个单引号。

  4. Update语句可以更新一到多条记录的相应列的数据,如果只要修改某条记录,则应该在条件表达式中指定主键的值。

  5. 如果省略了Where子句,则更新该数据表的所有记录。

例子:

--修改学号为“SW03102”的学生的生日Update student --仅更新一条记录Set birthday = '1991 -3 -5'Where student_id='SW103102'--将所有学生的课程编号为“C307”的课程增加5分Update scoreSet pscore = pscore + 5Where course_id = "C307"

综合题目;

​ 在成绩表score中将课程编号以“C1”开头的百分制成绩设置为等级制成绩,并把成绩百分制设置为空。

Update scoreSet pscore = null,grade = 	case		when pscore>=90 then '优'		when pscore>=80 then '良'		when pscore>=70 then '中'		when pscore>=60 then '及格'		when pscore<60 then '不及格'	else gradeendWhere crouse_id like 'C1%'

数据删除语句:

Delete语句:

格式;

Delete From 表名Where 条件表达式

说明:

  1. 可以删除一条和多条记录,如果只要删除某一条记录则应在条件表达式中指定主键的值。

  2. 如果忽略了where条件表达式的话就会删除所有的记录。

    --删除已经退学的“R04”的学生记录Delete From studentWhere roll_id= 'R04'
    

    Truncate语句:

    ​ 它是无条件的删除一张表格中的所有记录,速度比delete更快。

    Truncate Table 表名
    

    说明:

    1. 用于删除所有的记录,
    2. 语句的操作不记录在日志文件中。

数据查询:

​ 数据查询可以完成对关系表的集合运算(并、交、差)和关系代数运算(投影、选择、连接),还可以对数据表进行排序与统计汇总运算,因此数据查询语句具有极强的查询与统计汇总功能,

格式:

Select [All|Distinct] <目标表达式1> [,....n]From <表名|视图名>[,...n][Where <条件表达式>][Group By <表达式列表>][Having <条件表达式> ][Order BY <表达式 > [ASC | Desc]]

说明:

  1. Select [All|Distinct] <目标表达式1> [,…n]为投影运算,“目标表达式”指定了结果要包含的数据列
  2. From <表名|视图名>指定了查询的数据源
  3. [Where <条件表达式>]为选择运算,指定了数据源中的行需要满足的筛选条件。
  4. [Group By <表达式列表>]为分组语句,通常需要在分组的情况下进行统计运算。
  5. [Having <条件表达式> ]为附加选择运算,用来向使用Group BY子句的查询添加数据筛选条件。
  6. [Order BY <表达式 > [ASC | Desc]]为排序运算,指定了结果集中行的排列顺序。

简单查询:

select····From子句:

选择全部列:
Select *From 表名---------------------查询所有学生的信息Select *From student
选择指定列:
Select 列名1,列名2,····From 表名---------------------查询学生的姓名、性别、出生日期Select name,sex,birthdayFrom student
使用计算列:

​ 有些时候,某些数据需要经过计算才能得到:

Select 列名1,列名2,计算表达式1,计算表达式2,···From 表名--------------------查询学生的学号、姓名、性别、年龄Select student_id,name,sex,year(getDate())-year(birthday)From student-------------------------上述的例子中使用了两个函数,getDate():返回当前日期year():返回参数的年份值.

为列指定别名:

上述题目中没有涉及列的别名,如果没有普通列没有指定别名,就会显示数据表中真实的字段名,如果计算列没有指定别名,就会显示“无列名”,为方便查看可以指定别名。

格式;

Select 列名1 as '别名',列名2 as '别名2',计算表达式1 as '别名3',计算表达式2 as '别名4',···From 表名--当计算表达式过长时,可以写成‘别名=计算表达式’例题:查询学生的学号、姓名、性别和年龄,用中文别名显示字段名。select stident_id as '学号',name as '姓名',sex as '性别',year(getDate())-year(birthday) as '年龄'From student--as关键字可以省略,如果别名中没有空格,则单引号也能省略。

消除重复行:

为了使投影运算后的列值不重复,可在列名前添加关键字Distinct

实例;

--基于学生student查询班级编号。(不重复)select Distinct school_class_id 班级编号From student

无条件选择部分行;

​ 如果表中的数据太多(如达到100万行),那么显示所有行是不现实的,这时可以指定只显示其中的部分行。

格式:

Select Top n [percent] 列名列表From 表名--Top一般要与Order By 子句结合使用,选取出按某种排序方式显示的前n条记录。--n Percent表示选择前n%的记录。--例子:查询成绩表score中百分制成绩最高的前3行。select Top 3 student_id,course_id,pscoreFrom scoreOrder BY pscore desc--成绩最高的前3行,但是有的成绩时一样的,上述的并不会并列显示,需要显示重复的记录,只需要加上with ties。select Top 3 with ties prcore,student_id,course_idFrom scoreOrder BY pscore desc

Where子句:

​ 从数据表中选择行是用Where条件子句来实现,

格式:省略。

查询条件运算符含义
关系表达式=、>、<、>=、<=、(或!=)、!<、!>等于、大于、小于
范围查询between···and、not between···and在··范围之间、在··范围之外
集合查询in、not in在····集合中、不在···集合之内
模糊查询like、not like类似于、不类似于
逻辑查询and、or、not并且、或、不
空值查询is null、is not null为空、不为空

1.关系表达式:

​ 关系运算符:可以连接列名和常量,从而形成关系表达式,用于查询条件中。

例如;查询所有男同学的姓名

Select name 姓名,telephone 电话From studentWhere sex="M"

复杂一点的:查询年龄大于21岁的学生、姓名、性别、年龄。

select student_id 学号,name 姓名,sex 性别,year(getDate())-year(birthday) 年龄FROm studentWhere year(getDate())-year(birthday)>21

2.范围查询:

​ 用于查询表达式的值在一个连续的范围内的数据记录:

查询的条件如下:

<表达式> [not] between <下界> and <上界>

例如:查询百分制成绩在80~95分的学生学号、课程号和成绩:

Select student_id 学号,course_id 课程号,pscore 成绩From scoreWhere pscore between 80 and 95

3.集合查询:

​ 用于查询表达式的值在(或不在)一个连续的集合中的数据记录,

<表达式> [not] in 集合

例如:查询等级成绩是优、良、和中的学生学号、课程号、成绩,由于等级制的成绩是不连续的,所以应该使用集合查询。

select student_id,course_id,gradeFrom scoreWhere grade in("优","良","中")

4.模糊查询:

​ 利用通配符来达到不精确匹配的查询要求。

通配符说明实例
%百分号,代表0至多个任意字符‘王%’表示以王起始,后面接0至多个其他字符,如王姓的姓名
_下划线,代表1个任意字符“王_”表示以“王”起始,后接一个其他字符,
[]代表指定范围内的字符‘王[明治]_'表示以王起始,后接"明"或“治”,再加一个字的姓名
]代表不在指定范围内的字符和上面相反。

例如:查询所有王姓学生

select name 姓名,sex 性别From studentWhere name like '王%'

5.逻辑表达式:

就像是

andornot(取反)

6.空值判断:

​ 空值表示没有值,它不是数值0,也不是空字符串,因此要用is null这样的语法来判断。

例如:查询课程编号以“C3”起始,且缺考(即百分制考试成绩为空)的学生成绩信息。

select student_id,course_id,pscoreFrom scorewhere pscore is null and course_id like 'C3%'

Order BY子句:

​ 指定排序的规则:

语法格式:

Select 列表列表From 表名Order By 排序用列名列表[Asc|Desc]

说明:

  1. Asc为升序排序(默认值),Desc为降序排序。

  2. 可对多达16个列表执行Order By 语句。

  3. “排序用列名列表”中可以是列名,也就是列别名,还是列的序号(列号从1开始)

  4. Oeder By关键字必须是select语句中子句的最后一个。

    例题:查询成绩表score中课程编号以“C3”起始的学生成绩信息,包括学号、课程号和百分制成绩。先按课程号升序排序,再按成绩从高到底排序。

    Select student_id,course_id,pscoreFrom scoreWhere course_id like 'C3%'Order By course_id asc,pscore desc--也可以写成:Select student_id,course_id,pscoreFrom scoreWhere course_id like 'C3%'Order By 2,pscore desc
    

Group By子句:

用户除了对数据库进行查询外,还经常需要进行统计汇总操作。

统计函数说明实例
sum(字段名)对数字型字段求和(null值除外)sum(class_hour)返回课时的总和
avg(字段名)对数字型字段求均值(null值除外)avg(score)返回平均值
min(字段名)对数字、字符、日期型字段求最小值(null值除外)min(score)返回最低成绩
max(字段名)对数字、字符、日期型字段求最大值(null值除外)max(score)返回最高成绩
count(字段名)统计行数(字段值为null的除外)count(score)返回成绩不为空的行数
count(*)统计行数(包括null值)count(*)返回所有行数

例题:统计学生总人数:

select count(*) 总人数From student-----------------------统计学生的各种成绩情况:select avg(pscore)平均成绩,min(pscore)最低成绩,max(pscore)最高成绩,count(pscore)有成绩的行数,count(grade)有等级的行数,count(*)总行数From score

在统计过程中,还需要按组进行分类统计,这时需要用到分组语句Group by,在分组前可能需要进行记录帅选,对分组后的统计数据可能也需要进行选取,分组统计的语句格式如下:

selcet 分组字段,统计函数From 表名Where 条件表达式Group by 分组字段Having 条件表达式Order By 排序字段

说明:

在Select子句中出现的“分组字段”必须出现在Group By子句的后面,且字段名相同。

--分组统计学生表student中各个班级的男女生人数。select school_class_id as 班级,sex 性别,count(*) as 人数from studentGroup by sex,school_class_id

例题(1):统计成绩表score中,各门课程中及格学生的百分制成绩的平均分、最高分和最低分。

select course_id 课程号,avg(pscore) 平均分,max(pscore) 最高分,min(pscore) 最低分From scorewhere pscore>=60Group by course_id

例题(2):统计成绩表score中,各门课程中及格学生的百分制成绩的平均值、最高分和最低分,要求显示平均分>75分的统计记录,并将查询结果按平均分从高到低排序。

​ 本例与例(1)的区别在于分组后要进行组的筛选,将平均分>75的组筛选出来,代码如下:

select course_id 课程号,avg(pscore) 平均分,max(pscore) 最高分,min(pscore) 最低分From scoreWhere pscore>=75group by couse_idHaving avg(pscore)>75order by avg(pscore)

联合查询:

简介:如果有多个不同的查询结果集,又希望将它们按照一定的关系连接在一起进行联合查询,组成一组新数据,则这时可以使用集合运算来实现。

1.集合并运算

​ 集合并运算是将来自不同查询的结果组合起来,形成一个具有综合信息的查询结果集(并集)

例题:查询系部表department中的系部名称和专业表中的专业名称。

select nameFrom dapartmentUnionselect namefrom major--union操作会自动将重复的元组去除

2.集合交运算

​ 集合交运算是将来自不同查询结果的共有元组组合起来,形成一个具有综合信息的查询结果集。

例题:查询既选修了“C3001”课程又选修了“C3002”课程的学生号。

select student-idFrom scorewhere course-id='C3001'intersectselect student_idFrom scoreWhere course_id ='C3002'

3.集合差运算

​ 集合差运算是将属于左查询结果集但是不属于右查询结果集的元组组合起来,形成一个具有综合信息的查询结果集。(差集)

--查询选修了“C3001”课程但是没有选修“C3002”课程的学生学号。select student_idfrom scorewhere course_id='C3001'Exceptselect student_idfrom scorewhere course_id='C3002'

连接查询:

1.交叉查询:

​ 交叉连接将两张表不加限制地连接在一起,没有约束条件,也称为非限制性连接。

格式:

Select 列表列名From1	cross Join2也可以简写成select 列名列表From1,表2

例题:将学生表student与课程表course进行交叉连接。

select student.name 学生姓名,course.name 课程名From student	Cross Join course

2.内连接和等值连接:

以下部分的内容比较难理解,直接看书P87.

😥

修改数据库

简述:

​ 创建完数据库后,一般不能对数据库做太多的修改,但是数据库拥有者可以为数据库添加辅助数据文件或事务日志文件,也可以修改某些配置选项,如最大大小、增长方式、安全配置等。修改数据库是通过Alter DataBase语句。

修改:

1. 修改数据库名称:

​ 可以通过Alter DataBase语句和调用系统内置储存过程sp_renamedb两种方式实现。

例子

​ 将数据库Socresys更名为Xscj(修改数据库的时候不能被其他用户使用)

使用Alter Database语句Alter Database ScoresysModify name=Xscj
调用系统内置储存过程sp_renamedbsp_renamedb Scoresys,Xscj

:修改数据库的名称时不会改变数据库的其他属性。

2.修改数据库容量和增长率:

例子:

​ 修改数据库Scoresys现有数据文件的属性,将主数据文件的最大大小修改为不限制,增长方式修改为按每次5mb增长。

Alter Database ScoresysModify Flie#modify意思为修改(	name=score_data,	maxsize=unlimited)GoAlter Database ScoresysModify File(	name=scroe_data,	filegrowth=5)

:Alter Database语句一次只能修改主数据文件的一个属性。

3.添加/删除数据库文件

例子:

​ 先为数据库Sroesys增加辅助数据文件scorebak,然后再删除scorebak。

Alter Database ScoresysAdd File(	name=scorebak,	filename=`e:\sql\scorebak.ndf`)GoAlter Database ScoresysRemove File scorebak

4.添加/删除文件组

例子:

​ 为数据库Scorebak添加文件组Fgroup,并为文件组添加两个辅助数据文件。

Alter Database Scoresys
Add Filegroup Fgroup
go
Alter Database Scoresys
Add File
(	name=score_data2,
 	filename=`e:\sql\score_data2.ndf`,
),
(	name=score_data3,
 	filename=`e:\sql\score_data3.ndf`,
)
to Filegroup Fgroup

​ 数据库Scorebak删除文件组Fgroup

Alter Database Scoresys
Remove File score_data2
go
Alter Database Scoresys
Remove File score_data3
go
Alter Database Scoresys
Remove Filegroup Fgroup
说明:

​ sql语句删除文件组时必须保证文件组为空,即文件组中的数据文件要之前全部删除。

删除数据库

注意:

​ 当数据库处于以下情况时不能删除。

  1. 当用户正在使用的时候

  2. 当数据库正恢复

  3. 当数据库正复制时

    ==数据库中的master、model、tempdb都不能被删除,msdb虽然可以被删除,但是删除msdb后很多服务(sql server 代理服务)将无法使用,

    Drop Database 数据库名
    

1.标量型函数:

格式:

creaate Function [用户名].<函数名> (形参列表)
Retuens <函数返回类型>
[AS]
Begin
	<语句组1>
	Return 函数值
	<语句组2>
end

例如:

--定义函数
create function dbo.Age(@Birth DateTime,@CurDate DateTime)
Returns Tinyint
AS
begin
	Return Year(@CurDate)-Year(@Birth)
end

--调用
use Scoresys
select student_id 学号,name 姓名,sex 性别,dbo.Age(birthday,GetDate()) 年龄--通过查询获取数据放入函数进行计算,然后返回值。
From student
Where dbo.Age(birthday,GetDate()) is not null

函数调用

<函数名> (<实参1>,<实参2>,····)
select xxxxx

内联(单语句函数)表值型函数:

creaate Function getstudent()
returns table
as
	return (select * from student)


select * from student
--调用
select * from dbo,getstudent()

例题:

use Scoresys
go
Create Function Dpt_Class(@name Varchar(10))
Returns Table
AS
Return (
		select school_class_id 班级编码,school_class.name 班级名,major.name 专业名 From school_class
		join major On major.major_id=school_class.major_id
		join department On department.department_id=major.department_id
		where department.name=@name
		)
--调用
use scoresys
select * from Dpt_Class("计算机系")

多语句表值型函数:

Use scoresys
Go
Create function Class_Studnet(@name varcher(50))
Returns @Student_Tab Table
(	student_id varchar(36),
	student_name varchar(8),
	sex char(1),
	class_name varchar(50),
	major_name varchar(50),
	depart_name varchar(50)AS
Begin
	insert @Student_Tab
	select student_id,student.name,sex,
		school_class.name,major.name,department.name
	From student
		join school_class On school_class.school_class_id=student.school_class_id
		join major On major.major_id=school_class.major_id
		join department On deparment.department_id=major.department_id
	where school_class.name=@name
	Return
End
--调用
select * from Class_Student('软件1031')
--理解:先是定义了函数名Class_Student,形参为班级名@name,返回的是一个变量,这变量是一个表格,定义表格的表结构
--在函数体中使用Insert语句从学生表student、班级表·····中将所需要的字段信息插入变量表中,最后通过返回return返回数据表内容。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无法长大的Panda

您的鼓励是最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值