数据库语言-SQL

Posted 计算机小白的爬坑之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库语言-SQL相关的知识,希望对你有一定的参考价值。

数据库语言-SQL

一、概述

SQL语言是集DDL、DML、DCL于一体的数据库语言。

  1. DDL语句引导词:Create(建立)、Alter(修改)、Drop(撤销)。
    模式的定义和删除,包括定义Database, Table,View,Index,完整性约束条件等,也包括定义对象(RowType行对象,Type列对象)

  2. DML语句引导词:Insert,Delete,Update,Select
    各种方式的更新与检索操作,如直接输入记录,从其他Table(由SubQuery建立)输入。
    各种复杂条件的检索,如连接查找,模糊查找,分组查找,嵌套查找等。
    各种聚集操作,求平均、求和、…等,分组聚集,分组过滤等。

  3. DCL语句引导词: Grant,Revoke
    安全性控制:授权和撤消授权

二、利用SQL建立数据库

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

1、创建Database

简单语法形式:create database 数据库名;

2、创建Table

简单语法形式create table 表名(列名 数据类型[Primary key|Unique] [Not null][,列名数据类型[Not null] ,...]);

“[]”表示其括起的内容可以省略,“|”表示其隔开的两项可取其一。

  1. Primary key:主键约束。每个表只能创建一个主键约束
  2. Unique:唯一性约束(即候选键)。可以有多个唯一性约束。
  3. Not null:非空约束。是指该列允许不允许有空值出现,如选择了Not null表明该列不允许有空值出现。

语法中的数据类型在SQL标准中有定义

3、追加元组

简单语法形式insert into 表名[(列名[列名]...] values(值[,值],.….);

values后面值的排列,须与into子句后面的列名排列一致.
若表名后的所有列名省略,则values后的值的排列,须与该表存储中的列名排列一致.

三、利用SQL进行简单查询

1、单表查询

简单语法形式Select 列名 [,列名].….] From 表名 [ Where 检索条件];
语义:从表名所给出的表中,查询出满足检索条件的元组,并按给定的列名及顺序进行投影显示。
Select语句中的select … , from… , where…,等被称为子句,在以上基本形式基础上会增加许多构成要素,也会增加许多新的子句,满足不同的需求。

2、检索条件之去重复记录

结果唯一性问题:关系模型不允许出现重复元组。但现实DBMS,却允许出现重复元组,但也允许无重复元组。

在Table中要求无重复元组是通过定义Primary key或Unique来保证的;而在检索结果中要求无重复元组,是通过DISTINCT保留字的使用来实现的。

示例∶在选课表中,检索成绩大于80分的所有学号
select S# From sc Where Score > 80;
// 有重复元组出现,比如一个同学两门以上课程大于80

Select DISTINCT S# From sc Where score > 80;
// 重复元组被DISTINCT过滤掉,只保留一份

3、检索结果之排序

Select语句中结果排序是通过增加order by子句实现的:order by 列名 [asc | desc]

意义为检索结果按指定列名进行排序,若后跟asc或省略,则为升序;若后跟desc,则为降序。

示例:按学号由小到大的顺序显示出所有学生的学号及姓名:
Select S#, Sname From Student Order By S# ASC ;
示例:检索002号课大于80分的所有同学学号并按成绩由高到低顺序显示:
Select S# From sc Where C# =‘002’and Score > 80 Order By Score DESC ;

4、模糊查询

含有like运算符的表达式:列名 [not] like “字符串”

找出匹配给定字符串的字符串。其中给定字符串中可以出现%, _等匹配符.

匹配规则:

  1. “%”:匹配零个或多个字符
  2. “_”:匹配任意单个字符
  3. “l”:转义字符,用于去掉一些特殊字符的特定含义,使其被作为普通字符看待,如用“1%”去匹配字符%,用_去匹配字符_

示例:检索所有姓张的学生学号及姓名
Select S#, Sname From Student Where Sname Like ‘张%’;
示例:检索名字为张某某的所有同学姓名
Select Sname From Student Where Sname Like ‘张_ _’;
示例:检索名字不姓张的所有同学姓名
Select Sname From Student Where Sname Not Like ‘张%’;

四、利用SQL语言进行多表联合查询

多表联合检索可以通过连接运算来完成,而连接运算又可以通过广义笛卡尔积后再进行选择运算来实现。
Select的多表联合检索语句Select 列名 [[列名].….] From 表名1, 表名2,…. Where 检索条件;

检索条件中要包含连接条件,通过不同的连接条件可以实现等值连接、不等值连接及各种θ-连接

1、θ-连接之等值连接

示例:按“001”号课成绩由高到低顺序显示所有学生的姓名(二表连接)
Select Sname From Student, sc Where Student.S# = sc.s# and sC.C# =‘001’ Order By Score DESC;

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

示例:按‘数据库’课成绩由高到低顺序显示所有同学姓名(三表连接)
Select Sname From Student, sC, Course Where Student.S# = sc.s# and sC.c# = Course.C# and Cname =‘数据库’ Order By Score DESC;

2、表更名与表别名

连接运算涉及到重名的问题,如两个表中的属性重名,连接的两个表重名(同一表的连接)等,因此需要使用别名以便区分。
select中采用别名的方式Select 列名 as 列别名 [[列名 as 列别名]...] From 表名1 as 表别名1, 表名2 as 表别名2, … Where 检索条件;

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

3、θ-连接之不等值连接

示例:求有薪水差额的任意两位教师
Select T1.Tname as Teacher1,T2.Tname as Teacher2 From Teacher T1,Teacher T2 Where T1.Salary > T2.Salary;
示例:求年龄有差异的任意两位同学的姓名
Select S1.Sname as Stu1, S2.Sname as Stu2 From Student S1, Student s2 Where S1.Sage > s2.Sage ;

五、利用SQL语言进行增、删、改

1、新增操作

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

  1. 单一元组新增命令形式:插入一条指定元组值的元组:insert into 表名 列名 [,列名].….)] values (值 [,值].….);
  2. 批数据新增命令形式:插入子查询结果中的若干条元组。待插入的元组由子查询给出:insert into 表名 [列名[,列名].….)] 子查询;

示例:单一元组新增
Insert Into Teacher (T#,Tname, D#, Salary) Values ("005", “阮小七”, "03", “1250");

Insert Into Teacher Values ("006”,“李小虎”,“03", “950");

示例:批元组新增
新建立Table: St(S#, Sname),将检索到的满足条件的同学新增到该表中:
Insert Into st (S#, Sname) Select S#, Sname From Student Where Sname like ‘%伟’;

lnsert Into St (s#, Sname) Select S#, Sname From Student Order By Sname;

2、删除操作

元组删除Delete命令:删除满足指定条件的元组:Delete From 表名 [ Where 条件表达式 ];

如果Where条件省略,则删除所有的元组。

示例:删除SC表中所有元组
Delete From sc ;

示例:删除98030101号同学所选的所有课程
Delete From sC Where s# =‘98030101’;

示例:删除自动控制系的所有同学
Delete From Student Where D# in (Select D# From Dept Where Dname = ‘自动控制);

3、更新操作

元组更新Update命令:用指定要求的值更新指定表中满足指定条件的元组的指定列的值
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=‘计算机);

六、利用SQL语言修正与撤销数据库

1、修正数据库

修正数据库的定义,主要是修正表的定义

修正基本表的定义
alter table tablename [add colname datatype,…] [drop 完整性约束名) [modify colname datatype,.…]]
// 增加新列 删除完整性约束 修改列定义

示例:在学生表Student(S#,Sname,Ssex,Sage,D# ,Sclass)基础上增加二列Saddr, PID
Alter Table Student AddSaddr char[40],PID char[18];

示例:将上例表中Sname列的数据类型增加两个字符
Alter Table student Modify Sname char(10) ;

示例:删除学生姓名必须取唯一值的约束
Alter Table student Drop Unique( Sname );

2、撤销基本表

撤消基本表drop table 表名

示例:撤消学生表Student
Drop Table Student;

注意,SQL-delete语句只是删除表中的元组,而撤消基本表drop table的操作是撤消包含表格式、表中所有元组、由该表导出的视图等相关的所有内容。

撤消数据库drop database 数据库名;

示例:撤消SCT数据库
Drop database SCT;

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

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

七、备注

  1. FROM子句对应的是关系代数的笛卡尔积操作。
  2. SELECT子句对应关系代数的投影操作。
  3. GROUP BY子句是分组操作。
  4. WHERE子句对应关系代数的选择操作。

以上是关于数据库语言-SQL的主要内容,如果未能解决你的问题,请参考以下文章

数据库原理实验指导使用SQL语言进行简单查询

数据库原理实验指导使用SQL语言进行简单查询

VFP中SQL语言的几个问题

请问:如何用sql语句来查询有多少学生选修课呢?

sql语言多表查询

怎样编写SQL语句求平均成绩