简介

SQL语言是集DDL(数据定义语言)、DML(数据操纵语言)和DCL(数据控制语言)于一体的数据库语言SQL语言是集DDL、DML和DCL于一体的数据库语言

有9个引导词:

  • DDL语句引导词:Create(建立),Alter(修改),Drop(撤消)
  • DML语句引导词:Insert(插入),Delete(删除), Update(更新), Select(选择)
  • DCL语句引导词:Grant(授权),Revoke(取消授权)

SQL的引导词不区分大小写

建立数据库

1)建立一个学生选课数据库(SCT)

这个数据库由很多表组成:
学生:学号S#, 姓名Sname, 性别Ssex, 年龄Sage, 所属系别D#,班级Sclass
Student ( S# char(8), Sname char(10), Ssex char(2),
Sage integer, D# char(2), Sclass char(6) )

院系:系别D#,系名Dname, 系主任Dean
Dept ( D# char(2), Dname char(10), Dean char(10) )

课程:课号C#, 课名Cname, 教师编号T#, 学时Chours,学分Credit
Course ( C# char(3), Cname char(12), Chours integer,
Credit float(1), T# char(3) )
教师:教师编号T#,教师名Tname, 所属院系D#,工资Salary
Teacher ( T# char(3), Tname char(10), D# char(2),
Salary float(2) )
选课:学号S#, 课号C#, 成绩Score
SC ( S# char(8), C# char(3), Score float(1) )

建立数据库包括两件事:

  • 定义数据库和表(使用DDL)
  • 向表中追加元组(使用DML)

创建database

语法:create database database 数据库名;
如:create database database SCT;

创建Table

语法:
Create table 表名( 列名 数据类型 [Primary key Primary key |Unique |Unique] [Not null]
[, 列名 数据类型 [Not null] , … ]) ;

  • “ [ ] ”表示其括起的内容可以省略,“ | ” 表示其隔开的两项可取其一
  • Primary key: 主键约束。每个表只能创建一个主键约束。
  • Unique: 唯一性约束(即候选键)。可以有多个唯一性约束。
  • Not null: 非空约束。是指该列允许不允许有空值出现,如选择了Not null表明该列不允许有空值出现。
  • 语法中的数据类型在SQL标准中有定义

    SQL-92标准中定义的数据类型

  • char (n) :固定长度的字符串

  • varchar (n) :可变长字符串
  • int :整数 // 有时不同系统也写作integer
  • numeric (p,q) :固定精度数字,小数点左边p位,右边p-q位
  • real :浮点精度数字 //有时不同系统也写作float(n),小数点后保留n位
  • date :日期 (如 2003-09-12)
  • time : 时间 (如 23:15:003)

例:
定义学生表 Student
Create Table Student ( S# char(8) not null , Sname char(10),
Ssex char(2), Sage integer, D# char(2), Sclass char(6) );

向表中增加元组

使用insert操作

语法:
insert into insert into 表名[ (列名 [, 列名 ]… ]
values values (值 [, 值] , …) ;

如:



Insert Into Student
Values ( ‘98030101’ , ‘张三’, ‘男’, 20, ’03’, ‘980301’);

Insert Into Student ( S#, Sname, Ssex, Sage, D# , Sclass)
Values ( ‘98030102’ , ‘张四’, ‘女’, 20, ’03’, ‘980301’);

简单查询操作

单表查询

用到select
语法:
Select Select 列名 [[, 列名] … ]
From 表名
[ Where Where 检索条件 ] ;

示例:
检索学生表中所有年龄小于等于19岁的学生的年龄及姓名

Select Sage, Sname //投影的列可以重新排定顺序
From Student
Where Sage <= 19;

去重问题

关系模型不允许出现重复元组。但现实DBMS,却允许出现重复元组,但也允许无重复元组。
在Table中要求无重复元组是通过定义Primary key或Unique来保证的;而在检索结果中要求无重复元组, 是通过DISTINCT保留字的使用来实现的。

示例:在选课表中,检索成绩大于80分的所有学号

Select S#
From SC
Where Score > 80 ;
//有重复元组出现,比如一个同学两门以上课程大于80
Select DISTINCT S#
From SC
Where Score > 80;
//重复元组被DISTINCT过滤掉,只保留一份

结果排序 Order By

仅需在前面的语法最后加上:
order by order by 列名 [asc | desc]

意义为检索结果按指定列名进行排序,若后跟asc或省略,则为升序;若
后跟desc, 则为降序。
示例:检索002号课大于80分的所有同学学号并按成绩由高到低顺序显示

Select S# From SC Where C# = ‘002’ and Score > 80
Order By Score DESC ;

模糊语言 Like

示例:检索名字不姓张的所有同学姓名

Select Sname From Student
Where Sname Not Like ‘张%’;

多表联合查询

基本操作:

Select Select 列名 [ [, 列名] … ]
From 表名1, 表名2, …
Where Where 检索条件 ;

注意:检索条件需要包含连接条件(多个表需要连接在一起)

示例:按“001”号课成绩由高到低顺序显示所有学生的姓名(二表连接)


Select Sname From Student, SC
Where Student.S# = SC.S# and SC.C# = ‘001’
Order By Score DESC;

多表连接时,如两个表的属性名相同,则需采用表名. 属性名方式来限定该属性是属于哪一个表

重命名处理

连接运算涉及到重名的问题,如两个表中的属性重名,连接的两个表重名
(同一表的连接)等,因此需要使用别名以便区分

select中采用别名的方式

Select Select 列名 as 列别名 [ [, 列名 as 列别名] … ]
From 表名1 as 表别名1, 表名2 as 表别名2, …
Where Where 检索条件 ;

上述定义中的as 可以省略
当定义了别名后,在检索条件中可以使用别名来限定属性

不等值连接

示例:求有薪水差额的任意两位教师

Select T1.Tname as Teacher1, T2.Tname as Teacher2
From Teacher T1, Teacher T2
Where T1.Salary > T2.Salary ;

示例:求年龄有差异的任意两位同学的姓名

Select S1.Sname as Stud1, S2.Sname as Stud2
From Student S1, Student S2
Where S1.Sage > S2.Sage ;

SQL的增、删、改操作

Insert

元组新增Insert命令有两种形式

1、单一元组新增命令形式:插入一条指定元组值的元组

insert into 表名 [(列名[,列名]…)]
values (值 [,值]…);

例:

Insert Into Teacher (T#, Tname, D#, Salary)
Values (“005”, “阮小七”, “03”, “1250”);

2、批数据新增命令形式:插入子查询结果中的若干条元组。待插入的元组由子查询给出。

insert into 表名 [(列名[,列名]…)]
子查询;

例:

Insert Into St (S#, Sname)
Select S#, Sname From Student
Where Sname like ‘%伟 ’ ;

查询后插入到新表中

可以将中间结果存储成表
示例:新建Table: St(S#, Sname, avgScore), 将检索到的同学的平均成
绩新增到该表中

Insert Into St (S#, Sname, avgScore) //St是新建表的操作
Select S#, Sname, Avg(Score) From Student, SC
Where Student.S# = SC.S#
Group by Student.S# ;

条件控制的删除

示例:删除有四门不及格课程的所有同学

Delete From Student Where S# in
( Select S# From SC Where Score < 60
Group by S# Having Count(*)>= 4 );

Updata

1)基础用法

元组的指定列的值

Update 表名
Set 列名 = 表达式 | (子查询)
[ [ , 列名 = 表达式 | (子查询) ] … ]
[ Where 条件表达式] ;

如果Where条件省略,则更新所有的元组。
示例:将所有教师工资上调5%

Update Teacher
Set Salary = Salary * 1.05 ;

示例:将所有计算机系的教师工资上调10%

Update Teacher
Set Salary = Salary * 1.1
Where D# in
( Select D# From Dept Where Dname = ‘计算机’);

示例:将张三同学001号课的成绩置为其班级该门课的平均成绩

Update SC
Set Score = ( Select AVG(SC2.Score)
From SC SC1, Student S1, SC SC2, Student S2
Where S1.Sclass = S2.Sclass and SC1.S# = S1.S#
and SC2.S# = S2.S# and S1.Sname=‘张三’
and SC1.C# = ‘001’ and SC1.C# = SC2.C# )
Where C# = ‘001’ and S# in ( Select S# From Student
Where Sname = ‘张三’ ) ;

撤销与修正

修正数据库的定义

修正基本表的定义

alter table tablename
[add {colname datatype, …}] 增加新列
[drop {完整性约束名}] 删除完整性约束
[modify {colname datatype, …}] 修改列定义

drop

撤消基本表
drop table 表名

撤消数据库
drop database 数据库名

指定与关闭数据库

指定当前数据库
use 数据库名;

关闭当前数据库
close 数据库名;

实操训练:

以SQL server为例

SQl server 的系统数据库:

Master :是SQL Server中最重要的系统数据库,存储SQL Server中的元数据。
Model:模板数据库,在创建新的数据库时,SQL Server将会复制此数据库作为新数据库的基础。
Msdb:代理服务数据库,提供一个存储空间。
Tempdb:临时数据库,为所有的临时表、临时存储过程及其他临时操作提供存储空间,断开连接时,临时表与存储过程自动被删除。

创建/删除数据库

CREATE DATABASE SCT
DROP DATABASE SCT

正在使用的数据库不能被删除

use SCT
DROP database SCT

这样会报错:“无法删除数据库 “SCT”,因为该数据库当前正在使用”。
解决方法:切换另一个数据库

use master
DROP database SCT

授权

语法形式:
grant 权限 on 表名 to 用户名

权限有:select, update, insert ,delete, exec, dri。
对被授权的用户,要先成为该数据库的使用者,即要把用户加到数据库里,才能授权.

用户

创建/修改table(表)

创建:

输入:

Create Table Student ( S# char(8) not null , Sname char(10), Ssex char(2), Sage integer, D# char(2), Sclass char(6) );

已经创建完成:
创建表

增加一列:

alter table student add Sadress char(40);

修改某列

ALTER TABLE table_name
ALTER COLUMN column_name datatype

ALTER TABLE Student ALTER COLUMN Ssex INT;

删除某列

alter table Student drop column Saddress

此语法在并非SQL标准语法

创建一个带主键约束的表

Create Table Course ( C# char(3) primary key , Cname char(12), Chours integer,Credit float(1), T# char(3) ) ;

向表中插入数据

Insert Into Student Values ( '98030101' , '张三', '男', 20, '03', '980301');
Insert Into Student ( S#, Sname, Ssex, Sage, D# ,Sclass) Values ('98030102','张四','女',20,'03','980301’);
Insert Into Course Values ( '001’ , '数据库’, 40, 6, ’001’);
Insert Into Course(Cname, C#, Credit, Chours, T#)
Values ('数据库', '002', 7, 30, '002');

上面的insert语句实操时各种报错。。。
暂时不细究了

tip:有时候因为数据更新不及时而报错,Ctrl+Shift+R可以刷新缓存区