数据库原理与开发.docx
《数据库原理与开发.docx》由会员分享,可在线阅读,更多相关《数据库原理与开发.docx(12页珍藏版)》请在冰豆网上搜索。
数据库原理与开发
1:
数据模型=信息结构+数据
2数据结构,数据操作(操作规则)
3数据库系统作用:
组织存取,定义数据结构,增删改,
4drop删除alter修改index索引
5select(目标,多个可用逗号并列。
或者用*表示全部)。
6distinct用于选取唯一不同的值。
是列名称的修饰符。
Selectdistinctcompanyfromorder结果会自动去掉重复的
后面可以再加上where列运算符值
Selectdistinctcompanyfromorderwherecity=‘beijing’
SELECT*FROMPersonsWHEREfirstname='Thomas'ORlastname='Carter'多个条件并列方式
对于文本值用单引号围起来数值的话不要做处理
操作符
描述
=
等于
<>
不等于
>
大于
<
小于
>=
大于等于
<=
小于等于
BETWEEN
在某个范围内
LIKE
搜索某种模式
注释:
在某些版本的SQL中,操作符<>可以写为!
=。
7SELECTCompany,OrderNumberFROMOrdersORDERBYCompany用于默认的生序排序多个条件用逗号并列,条件尾部加上desc为降序排列加asc为升序排列
8INSERTINTOPersons(LastName,Address)VALUES('Wilson','Champs-Elysees')
列名称表示当信息不全的时候插入一部分数据不加列名称表示插入整行
9UPDATEPersonSETFirstName='Fred'WHERELastName='Wilson'定点更新数据。
同样更新内容多个时用逗号并列
10DELETEFROMPersonWHERELastName='Wilson'删除整行也可直接delete*from表名称。
表示删除所有行但是表的结构还在
11SELECTTOPnumber|percentcolumn_name(s)(条数或者百分率)
FROMtable_name选择上限
12SELECT*FROMPersonsWHERECityLIKE'N%'主要是通配符的用法前后均可通配。
另外LIKE的否定形式NOTLIKE
附:
通配符大全
通配符
描述
%
替代一个或多个字符
_
仅替代一个字符
[charlist]
字符列中的任何单一字符
[^charlist]
或者
[!
charlist]
不在字符列中的任何单一字符
13SELECT*FROMPersonsWHERELastNameIN('Adams','Carter')在一定的范围内选择对象
另外betweenand也可实现类似功能。
但是一定要搞清楚所用编译器对于本条语法的处理方式主要是对于首尾的包含问题
14别名问题SELECTcolumn_name(s)FROMtable_nameASalias_name表的别名SELECTcolumn_nameASalias_nameFROMtable_name列的别名
SELECTpo.OrderID,p.LastName,p.FirstName
FROMPersonsASp,Product_OrdersASpo
WHEREp.LastName='Adams'ANDp.FirstName='John'别名的话并不是必须的因为默认的话搜索结果是不变名称的。
(不用的话直接省略就好)并列的话AND还是逗点区分
15通过key(键值)绑定两个表就是在表一中的一套键值在表二中进行数据绑定,然后在两个表中按照键值进行搜索SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersons,OrdersWHEREPersons.Id_P=Orders.Id_P(一套两份键值)
16表连接SELECTPersons.LastName,Persons.FirstName,Orders.OrderNo(连接项)FROMPersonsINNERJOINOrdersONPersons.Id_P=Orders.Id_P(连接条件)
ORDERBYPersons.LastName
其他连接选项
JOIN:
如果表中有至少一个匹配,则返回行同JOINON只要有至少一个匹配就返回可以返回多个但是没有的话就不会再返回
LEFTJOIN:
即使右表中没有匹配,也从左表返回所有的行
RIGHTJOIN:
即使左表中没有匹配,也从右表返回所有的行(区别上表中至少一个)
FULLJOIN:
只要其中一个表中存在匹配,就返回行(只要在任意一个表中存在该id就返回这一行)
17表的结合,,UNION操作符选取不同的值。
如果允许重复的值,请使用UNIONALL
SELECTcolumn_name(s)FROMtable_name1
UNIONALL
SELECTcolumn_name(s)FROMtable_name2
18SELECTLastName,Firstname
INTOPersons_backup
FROMPersons
WHERECity='Beijing'充分表现出语法的扩展性。
INNERJOINOrdersONPersons.Id_P=Orders.Id_p也可以加上查出新表然后备份
19创建数据库
CREATETABLE表名称
(列名称1数据类型,
列名称2数据类型,
列名称3数据类型,....)
数据类型
描述
integer(size)
int(size)
smallint(size)
tinyint(size)
仅容纳整数。
在括号内规定数字的最大位数。
decimal(size,d)
numeric(size,d)
容纳带有小数的数字。
"size"规定数字的最大位数。
"d"规定小数点右侧的最大位数。
char(size)
容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。
在括号中规定字符串的长度。
varchar(size)
容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。
在括号中规定字符串的最大长度。
date(yyyymmdd)
容纳日期。
CREATETABLEPersons
(Id_Pint,
LastNamevarchar(255),NOTNULL,作为修饰符表明接受限制
FirstNamevarchar(255),
Addressvarchar(255),
Cityvarchar(255))
注意:
创建表时MySQL一般把额外属性加在表的最下方(另开一行加UNIQUE(lastname)或者primarykey(lastname))其他类型数据库直接在列后面加上额外属性(lastnamevarchar(255)UNIQUEPrimarykey)
1Unique约束:
如果需要命名UNIQUE约束,以及为多个列定义UNIQUE约束,请使用下面的SQL语法:
CONSTRAINTuc_PersonIDUNIQUE(Id_P,LastName)
当表已被创建时,如需在"P_Id"列创建UNIQUE约束,请使用下列SQL:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersonsADDUNIQUE(P_Id)多个的话逗号并列前面类似的加上?
?
为什么?
CONSTRAINTuc_PersonID(命名Unique约束在撤销的时候用)
撤销UNIQUE约束
MySQL:
ALTERTABLEPersons
DROPINDEXuc_PersonID
SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
DROPCONSTRAINTuc_PersonID
2:
PrimaryKey属性用法同Unique(数据库之间差异性依然存在)
3:
ForeignKey用法(均为在Order中定义person的一个属性为外键)
MySQL:
FOREIGNKEY(Id_P)REFERENCESPersons(Id_P)定义属性在声明之后
SQLServer/Oracle/MSAccess:
Id_PintFOREIGNKEYREFERENCESPersons(Id_P)定义属性在声明的时候
如果在"Orders"表已存在的情况下为"Id_P"列创建FOREIGNKEY约束,请使用下面的SQL:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEOrders
ADDFOREIGNKEY(Id_P)
REFERENCESPersons(Id_P)
如果需要命名FOREIGNKEY约束,以及为多个列定义FOREIGNKEY约束,请使用下面的SQL语法:
MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEOrders
ADDCONSTRAINTfk_PerOrders
FOREIGNKEY(Id_P)
REFERENCESPersons(Id_P)
撤销的话和其他一样撤销掉定义的别名
MySQL:
ALTERTABLEOrders
DROPFOREIGNKEYfk_PerOrders
SQLServer/Oracle/MSAccess:
ALTERTABLEOrders
DROPCONSTRAINTfk_PerOrders
5:
check属性限定值的取值范围用法和其他一样,是一个外加属性
CONSTRAINTchk_PersonCHECK(Id_P>0ANDCity='Sandnes')
6:
default约束创建表的时候可以直接加上Cityvarchar(255)DEFAULT'Sandnes'
如果在表已存在的情况下为"City"列创建DEFAULT约束,请使用下面的SQL:
MySQL:
ALTERTABLEPersons
ALTERCitySETDEFAULT'SANDNES'
SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
ALTERCOLUMNCitySETDEFAULT'SANDNES'
撤销DEFAULT约束
如需撤销DEFAULT约束,请使用下面的SQL:
MySQL:
ALTERTABLEPersons
ALTERCityDROPDEFAULT
SQLServer/Oracle/MSAccess:
ALTERTABLEPersons
ALTERCOLUMNCityDROPDEFAULT
7:
创建Index索引
CREATEINDEX实例
本例会创建一个简单的索引,名为"PersonIndex",在Person表的LastName列:
CREATEINDEXPersonIndex
ONPerson(LastName)
如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字DESC:
CREATEINDEXPersonIndex
ONPerson(LastNameDESC)
假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
CREATEINDEXPersonIndex
ONPerson(LastName,FirstName)
8:
系列的撤销
用于MySQL的语法:
撤销索引
ALTERTABLEtable_nameDROPINDEXindex_name
SQLDROPTABLE语句
DROPTABLE语句用于删除表(表的结构、属性以及索引也会被删除):
DROPTABLE表名称
SQLDROPDATABASE语句
DROPDATABASE语句用于删除数据库:
DROPDATABASE数据库名称
SQLTRUNCATETABLE语句
如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?
请使用TRUNCATETABLE命令(仅仅删除表格中的数据):
TRUNCATETABLE表名称
8:
修改表
ALTERTABLEtable_name
ADDcolumn_namedatatype添加列(类似于修改列的类型ALTERCOLUMNcolumn_namedatatype(ALTERCOLUMNBirthdayyear把类型便成年)
)删除列类似(DROPCOLUMNBirthday)
9:
自动插入主键的键值
AUTOINCREMENT字段
我们通常希望在每次插入新纪录时,自动地创建主键字段的值。
我们可以在表中创建一个auto-increment字段。
用于MySQL的语法
下列SQL语句把"Persons"表中的"P_Id"列定义为auto-increment主键:
CREATETABLEPersons
(
P_IdintNOTNULLAUTO_INCREMENT,(额外属性直接加在列的后面)
LastNamevarchar(255)NOTNULL,
FirstNamevarchar(255),
Addressvarchar(255),
Cityvarchar(255),
PRIMARYKEY(P_Id)
)
MySQL使用AUTO_INCREMENT关键字来执行auto-increment任务。
默认地,AUTO_INCREMENT的开始值是1,每条新纪录递增1。
要让AUTO_INCREMENT序列以其他的值起始,请使用下列SQL语法:
ALTERTABLEPersonsAUTO_INCREMENT=100
要在"Persons"表中插入新纪录,我们不必为"P_Id"列规定值(会自动添加一个唯一的值):
INSERTINTOPersons(FirstName,LastName)
VALUES('Bill','Gates')
上面的SQL语句会在"Persons"表中插入一条新纪录。
"P_Id"会被赋予一个唯一的值。
"FirstName"会被设置为"Bill","LastName"列会被设置为"Gates"。
9函数
MySQLDate函数
下面的表格列出了MySQL中最重要的内建日期函数:
函数
描述
NOW()
返回当前的日期和时间
CURDATE()
返回当前的日期
CURTIME()
返回当前的时间
DATE()
提取日期或日期/时间表达式的日期部分
EXTRACT()
返回日期/时间按的单独部分
DATE_ADD()
给日期添加指定的时间间隔
DATE_SUB()
从日期减去指定的时间间隔
DATEDIFF()
返回两个日期之间的天数
DATE_FORMAT()
用不同的格式显示日期/时间
10函数集;
我们使用如下SQL语句:
SELECTAVG(OrderPrice)ASOrderAverageFROMOrders
结果集类似这样:
OrderAverage
950
以此求的一列的平均值
SQLCOUNT()语法
SQLCOUNT(column_name)语法
COUNT(column_name)函数返回指定列的值的数目(NULL不计入):
SELECTCOUNT(column_name)(加上as语句是结果出现在另外一个表中)FROMtable_name(后面还可以加上条件语句)
MAX函数SELECTMAX(OrderPrice)ASLargestOrderPriceFROMOrders同理类似min函数
Groupby
SELECTCustomer(结果咧),SUM(OrderPrice)(组合列)FROMOrders
GROUPBYCustomer(结果咧)后面可以加HAVING函数进行结果筛选
相信大家在自己的笔记本上装的是MySQL数据库,而教学时是ORACLE
下面是我网上找的一些他们的区别处。
。
希望对同学有帮助
1.自动增长的数据类型处理
MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。
ORACLE没有自动增长的
数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。
CREATESEQUENCE序列号的名称(最好是表名+序列号标记)INCREMENTBY1STARTWITH1MAXVALUE
99999CYCLENOCACHE;
其中最大的值按字段的长度来定,如果定义的自动增长的序列号NUMBER(6),最大值为999999
INSERT语句插入这个字段值为:
序列号的名称.NEXTVAL
2.单引号的处理
MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。
在插入和修改字符串前必须做
单引号的替换:
把所有出现的一个单引号替换成两个单引号。
3.翻页的SQL语句的处理
MYSQL处理翻页的SQL语句比较简单,用LIMIT开始位置,记录个数;PHP里还可以用SEEK定位到结果集的
位置。
ORACLE处理翻页的SQL语句就比较繁琐了。
每个结果集只有一个ROWNUM字段标明它的位置,并且只
能用ROWNUM<100,不能用ROWNUM>80。
以下是经过分析后较好的两种ORACLE翻页SQL语句(ID是唯一关键字的字段名):
语句一:
SELECTID,[FIELD_NAME,...]FROMTABLE_NAMEWHEREIDIN(SELECTIDFROM(SELECTROWNUMAS
NUMROW,IDFROMTABLE_NAMEWHERE条件1ORDERBY条件2)WHERENUMROW>80ANDNUMROW<100
)ORDERBY条件3;
语句二:
SELECT*FROM((SELECTROWNUMASNUMROW,c.*from(select[FIELD_NAME,...]FROMTABLE_NAME
WHERE条件1ORDERBY条件2)c)WHERENUMROW>80ANDNUMROW<100)ORDERBY条件3;
4.长字符串的处理
长字符串的处理ORACLE也有它特殊的地方。
INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单
字节,如果要插入更长的字符串,请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。
插
入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回
上次操作。
5.日期字段的处理
MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的
系统时间为SYSDATE,精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD
’)年-月-日24小时:
分钟:
秒的格式YYYY-MM-DDHH24:
MI:
SSTO_DATE()还有很多种日期格式,可以参看
ORACLEDOC.日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DDHH24:
MI:
SS’)
日期字段的数学运算公式有很大的不同。
MYSQL找到离当前时间7天用DATE_FIELD_NAME>SUBDATE(NOW
(),INTERVAL7DAY)ORACLE找到离当前时间7天用DATE_FIELD_NAME>SYSDATE-7;
MYSQL中插入当前时间的几个函数是:
NOW()函数以`'YYYY-MM-DDHH:
MM:
SS'返回当前的日期时间,可以直
接存到DATETIME字段中。
CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中
。
CURTIME()以’HH:
MM:
SS’的格式返回当前的时间,可以直接存到TIME字段中。
例:
insertinto
tablename(fieldname)values(now())
而oracle中当前时间是sysdate
6.空字符的处理
MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。
按MYSQL的NOTNULL来定
义ORACLE表结构,导数据的时候会产生错误。
因此导数据时要对空字符进行判断,如果为NULL或空字符,
需要把它改成一个空格的字符串。
7.字符串的模糊比较
MYSQL里用字段名like'%字符串%',ORACLE里也可以用字段名like'%字符串%'但这种方法不能使用
索引,速度不快,用字符串比较函数instr(字段名,'字符串')>0会得到更精确的查找结果。
8.程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。