数据库原理知识点.docx
《数据库原理知识点.docx》由会员分享,可在线阅读,更多相关《数据库原理知识点.docx(12页珍藏版)》请在冰点文库上搜索。
![数据库原理知识点.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/d6e7132b-4ee7-4e40-b589-5d056b546922/d6e7132b-4ee7-4e40-b589-5d056b5469221.gif)
数据库原理知识点
候选码的求解理论和算法
首先对于给定的R(U)和函数依赖集F,可以将它的属性划分为4类:
L类,仅出现在F的函数依赖左部的属性。
R类,仅出现在F的函数依赖右部的属性。
N类,在F的函数依赖左部和右部均未出现的属性。
LR类,在F的函数依赖左部和右部两部均出现的属性。
根据以下定理和推论来求解候选码。
定理1:
对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,则X必为R的任一候选码的成员。
推论1:
对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,且X+包含了R的全部属性,则X必为R的唯一候选码。
定理2:
对于给定的关系模式R及其函数依赖集F,若X(X∈R)是R类属性,则X不在任何候选码中。
定理3:
设有关系模式R及其函数依赖集F,如果X是R的N类属性,则X必包含在R的任一候选码中。
设有关系模式R(A,B,C,D),F是R上成立的FD集,F={D→A,D→B},试写出关系模式R的候选
①R的候选键是CD
②理由:
从已知的F,可导出D→ABD,
再根据扩展律,可得出CD→ABCD,
即CD值可决定全部属性值。
规范命名:
表名,列名都必须要首字母大写
eg.Course Sno
1.SQLSELECTDISTINCT语句
在表中,可能会包含重复值。
这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
关键词DISTINCT用于返回唯一不同的值。
语法:
SELECTDISTINCT列名称FROM表名称
如需从Company"列中仅选取唯一不同的值,我们需要使用SELECTDISTINCT语句:
SELECTDISTINCTCompanyFROMOrders
2.引号的使用
请注意,我们在例子中的条件值周围使用的是单引号。
SQL使用单引号来环绕文本值(大部分数据库系统也接受双引号)。
如果是数值,请不要使用引号。
文本值:
这是正确的:
SELECT*FROMPersonsWHEREFirstName='Bush'这是错误的:
SELECT*FROMPersonsWHEREFirstName=Bush
数值:
这是正确的:
SELECT*FROMPersonsWHEREYear>1965这是错误的:
SELECT*FROMPersonsWHEREYear>'1965'
3.ORDERBY语句
ORDERBYXXDESC
ORDERBY语句用于根据指定的列对结果集进行排序。
ORDERBY语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用DESC关键字。
以字母顺序显示公司名称:
SELECTCompany,OrderNumberFROMOrdersORDERBYCompany
结果:
Company
OrderNumber
Apple
4698
IBM
3532
W3School
6953
W3School
2356
4.插入新的行
INSERTINTO。
。
VALUES9('','')
"Persons"表:
LastName
FirstName
Address
City
Carter
Thomas
ChanganStreet
Beijing
SQL语句:
INSERTINTOPersonsVALUES('Gates','Bill','Xuanwumen10','Beijing')
在指定的列中插入数据
"Persons"表:
LastName
FirstName
Address
City
Carter
Thomas
ChanganStreet
Beijing
Gates
Bill
Xuanwumen10
Beijing
SQL语句:
INSERTINTOPersons(LastName,Address)VALUES('Wilson','Champs-Elysees')
结果:
LastName
FirstName
Address
City
Carter
Thomas
ChanganStreet
Beijing
Gates
Bill
Xuanwumen10
Beijing
Wilson
Champs-Elysees
5.Update语句
Update语句用于修改表中的数据。
语法:
UPDATE表名称SET列名称=新值WHERE列名称=某值
Person:
LastName
FirstName
Address
City
Gates
Bill
Xuanwumen10
Beijing
Wilson
Champs-Elysees
更新某一行中的一个列
我们为lastname是"Wilson"的人添加firstname:
UPDATEPersonSETFirstName='Fred'WHERELastName='Wilson'
结果:
LastName
FirstName
Address
City
Gates
Bill
Xuanwumen10
Beijing
Wilson
Fred
Champs-Elysees
更新某一行中的若干列
我们会修改地址(address),并添加城市名称(city):
UPDATEPersonSETAddress='Zhongshan23',City='Nanjing'WHERELastName='Wilson'
结果:
LastName
FirstName
Address
City
Gates
Bill
Xuanwumen10
Beijing
Wilson
Fred
Zhongshan23
Nanjing
6.LIKE操作符语法
SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameLIKEpattern
原始的表(用在例子中的):
Persons表:
Id
LastName
FirstName
Address
City
1
Adams
John
OxfordStreet
London
2
Bush
George
FifthAvenue
NewYork
3
Carter
Thomas
ChanganStreet
Beijing
LIKE操作符实例
例子1
现在,我们希望从上面的"Persons"表中选取居住在以"N"开始的城市里的人:
我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityLIKE'N%'
提示:
"%"可用于定义通配符(模式中缺少的字母)。
结果集:
Id
LastName
FirstName
Address
City
2
Bush
George
FifthAvenue
NewYork
例子2
接下来,我们希望从"Persons"表中选取居住在以"g"结尾的城市里的人:
我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityLIKE'%g'
结果集:
Id
LastName
FirstName
Address
City
3
Carter
Thomas
ChanganStreet
Beijing
例子3
接下来,我们希望从"Persons"表中选取居住在包含"lon"的城市里的人:
我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityLIKE'%lon%'
结果集:
Id
LastName
FirstName
Address
City
1
Adams
John
OxfordStreet
London
例子4
通过使用NOT关键字,我们可以从"Persons"表中选取居住在不包含 "lon"的城市里的人:
我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityNOTLIKE'%lon%'
结果集:
Id
LastName
FirstName
Address
City
2
Bush
George
FifthAvenue
NewYork
3
Carter
Thomas
ChanganStreet
Beijing
7.BETWEEN操作符
操作符BETWEEN...AND会选取介于两个值之间的数据范围。
这些值可以是数值、文本或者日期。
BETWEEN操作符实例
如需以字母顺序显示介于"Adams"(包括)和"Carter"(不包括)之间的人,请使用下面的SQL:
SELECT*FROMPersonsWHERELastNameBETWEEN'Adams'AND'Carter'
结果集:
Id
LastName
FirstName
Address
City
1
Adams
John
OxfordStreet
London
2
Bush
George
FifthAvenue
NewYork
重要事项:
不同的数据库对BETWEEN...AND操作符的处理方式是有差异的。
某些数据库会列出介于"Adams"和"Carter"之间的人,但不包括"Adams"和"Carter";某些数据库会列出介于"Adams"和"Carter"之间并包括"Adams"和"Carter"的人;而另一些数据库会列出介于"Adams"和"Carter"之间的人,包括"Adams",但不包括"Carter"。
所以,请检查你的数据库是如何处理BETWEEN....AND操作符的!
引用两个表
我们可以通过引用两个表的方式,从两个表中获取数据:
谁订购了产品,并且他们订购了什么产品?
SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersons,OrdersWHEREPersons.Id_P=Orders.Id_P
方法二:
SQLJOIN-使用Join
除了上面的方法,我们也可以使用关键词JOIN来从两个表中获取数据。
如果我们希望列出所有人的定购,可以使用下面的SELECT语句:
SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersonsINNERJOINOrdersONPersons.Id_P=Orders.Id_PORDERBYPersons.LastName
8.GROUPBY实例
我们拥有下面这个"Orders"表:
O_Id
OrderDate
OrderPrice
Customer
1
2008/12/29
1000
Bush
2
2008/11/23
1600
Carter
3
2008/10/05
700
Bush
4
2008/09/28
300
Bush
5
2008/08/06
2000
Adams
6
2008/07/21
100
Carter
现在,我们希望查找每个客户的总金额(总订单)。
我们想要使用GROUPBY语句对客户进行组合。
我们使用下列SQL语句:
SELECTCustomer,SUM(OrderPrice)FROMOrdersGROUPBYCustomer
结果集类似这样:
Customer
SUM(OrderPrice)
Bush
2000
Carter
1700
Adams
2000
很棒吧,对不对?
让我们看一下如果省略GROUPBY会出现什么情况:
SELECTCustomer,SUM(OrderPrice)FROMOrders
结果集类似这样:
Customer
SUM(OrderPrice)
Bush
5700
Carter
5700
Bush
5700
Bush
5700
Adams
5700
Carter
5700
上面的结果集不是我们需要的。
那么为什么不能使用上面这条SELECT语句呢?
解释如下:
上面的SELECT语句指定了两列(Customer和SUM(OrderPrice))。
"SUM(OrderPrice)"返回一个单独的值("OrderPrice"列的总计),而"Customer"返回6个值(每个值对应"Orders"表中的每一行)。
因此,我们得不到正确的结果。
不过,您已经看到了,GROUPBY语句解决了这个问题。
GROUPBY一个以上的列
我们也可以对一个以上的列应用GROUPBY语句,就像这样:
SELECTCustomer,OrderDate,SUM(OrderPrice)FROMOrdersGROUPBYCustomer,OrderDate
9.HAVING子句
在SQL中增加HAVING子句原因是,WHERE关键字无法与合计函数一起使用。
eg。
HAVINGSUM(OrderPrice)<2000
现在,我们希望查找订单总金额少于2000的客户。
我们使用如下SQL语句:
SELECTCustomer,SUM(OrderPrice)FROMOrdersGROUPBYCustomerHAVINGSUM(OrderPrice)<2000
结果集类似:
Customer
SUM(OrderPrice)
Carter
1700
索引
您可以在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
注释:
更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。
因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
10.CHECK约束
CHECK约束用于限制列中的值的范围。
如果对单个列定义CHECK约束,那么该列只允许特定的值。
如果对一个表定义CHECK约束,那么此约束会在特定的列中对值进行限制。
SQLCHECKConstraintonCREATETABLE
下面的SQL在"Persons"表创建时为"Id_P"列创建CHECK约束。
CHECK约束规定"Id_P"列必须只包含大于0的整数。
MySQL:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),CHECK(Id_P>0))
如果需要命名CHECK约束,以及为多个列定义CHECK约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),CONSTRAINTchk_PersonCHECK(Id_P>0ANDCity='Sandnes'))
SQLCHECKConstraintonALTERTABLE
如果在表已存在的情况下为"Id_P"列创建CHECK约束,请使用下面的SQL:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersonsADDCHECK(Id_P>0)
如果需要命名CHECK约束,以及为多个列定义CHECK约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersonsADDCONSTRAINTchk_PersonCHECK(Id_P>0ANDCity='Sandnes')
撤销CHECK约束
如需撤销CHECK约束,请使用下面的SQL:
SQLServer/Oracle/MSAccess:
ALTERTABLEPersonsDROPCONSTRAINTchk_Person
MySQL:
ALTERTABLEPersonsDROPCHECKchk_Person
问题:
视图的使用
函数max,min的使用
scx的使用
子查询的运用
SQLDML和DDL
可以把SQL分为两个部分:
数据操作语言(DML)和数据定义语言(DDL)。
SQL(结构化查询语言)是用于执行查询的语法。
但是SQL语言也包含用于更新、插入和删除记录的语法。
查询和更新指令构成了SQL的DML部分:
∙SELECT -从数据库表中获取数据
∙UPDATE -更新数据库表中的数据
∙DELETE -从数据库表中删除数据
∙INSERTINTO -向数据库表中插入数据
SQL的数据定义语言(DDL)部分使我们有能力创建或删除表格。
我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL中最重要的DDL语句:
∙CREATEDATABASE -创建新数据库
∙ALTERDATABASE -修改数据库
∙CREATETABLE -创建新表
∙ALTERTABLE -变更(改变)数据库表
∙DROPTABLE -删除表
∙CREATEINDEX -创建索引(搜索键)
∙DROPINDEX -删除索引
RDBMS
RDBMS指的是关系型数据库管理系统。
RDBMS是SQL的基础,同样也是所有现代数据库系统的基础RDBMS中的数据存储在被称为表(tables)的数据库对象中。
表是相关的数据项的集合,它由列和行组成。
在您的网站中使用SQL
要创建发布数据库中数据的网站,您需要以下要素:
∙RDBMS数据库程序(比如MSAccess,SQLServer,MySQL)
∙服务器端脚本语言(比如PHP或ASP)
∙SQL
∙HTML/CSS
比如 MSAccess、DB2、Informix、MSSQLServer、Oracle、Sybase 以及其他数据库系统。
不幸地是,存在着很多不同版本的SQL语言,但是为了与ANSI标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(比如SELECT、UPDATE、DELETE、INSERT、WHERE等等)。
注释:
除了SQL标准之外,大部分SQL数据库程序都拥有它们自己的私有扩展!
什么是SQL?
∙SQL指结构化查询语言
∙SQL使我们有能力访问数据库
∙SQL是一种ANSI的标准计算机语言
编者注:
ANSI,美国国家标准化组织
删除多个表的语句
mysql>showdatabases;
+--------------------+
|Database |
+--------------------+
|information_schema|
|qdm155063477_db |
+--------------------+
2rowsinset
mysql>useqdm155063477_db;
Databasechanged
mysql>showtables;
+---------------------------+
|Tables_in_qdm155063477_db|
+---------------------------+
|user |
+---------------------------+
1rowinset
mysql>descuser;
+----------+--------------+------+-----+---------+-------+
|Field |Type |Null|Key|Default|Extra|
+----------+--------------+------+-----+---------+-------+
|id |varchar(255)|NO |PRI|NULL | |
|username|varchar(64) |NO | |NULL | |
|password|varchar(64) |NO | |NULL | |
|desc |varchar(255)|YES | |NULL | |
+----------+--------------+------+-----+---------+-------+
4rowsinset
、