数据库知识个人总结

关系数据库的范式:

第一范式:数据库表中的所有字段值都是不可分解的原子值。

第二范式:确保数据库表中的每一列都和主键相关,而不能只和主键的某一部分相关(主要针对联合主键),也就是说在一个数据库表中,一个表只能保存一种数据。

第三范式:确保数据表中每一列数据都和主键直接相关,而不能间接相关。(一般数据库满足)

数据完整性分为4类:实体完整性(设计时指定主键,并且主键不能为空值),域完整性(列满足特定的数据类型或者约束,如取值范围,精度等),参照完整性(两个表的主键和外键的数据对应一致),用户定义完整性。

insert(向数据库表中插入数据)

用values子句为一行指定数据值:insert into 地址表(编号,描述)values (101,'市区')

用select子句为一行或者多行指定数据值

insert into 地址表(编号,描述) select 地址号,说明 from 客户表

update(更新数据)

将Medicine数据库中的药品的价格进行调整,幅度为原来的90%:update Medicine set showprice=showprice*0.9

在Medicine数据库中将使用急速快递物流的订单修改为货到付款,且无物流费用:update SaleOrderSummary

set Freight=0,RayMain='货到付款' where FreighterName='极速快递'

top (更新指定更新的行数或者行数的百分比):对MedicinieDetail表的前5条条药品的价格增加:update top(5) MedicineDetail set showprice=showprice+5

对MrdicineDetail的前30%的药品价格增加5:update top(30) percent MedicineDetail set showprice=showprice+5

delete(删除数据库表的单行数据,多行数据或者所有数据):删除ClientInfo表中职称为"业务代表”的所有客户信息:

delete ClientInfo Where Compost=‘业务代表’

删除ClientInfo表中的所有数据:delete from ClientInfo

列表条件:in:查询MedicineInfo表中查询出分类编号为31,80或者91的药品信息,查询结果包含编号,药品名称和所属分类编号

Select MedicineId '编号',MedicineName '药品名称',TypeId '所属分类编号' from MedicineInfo where TypeId IN(31,80,91)

要从药品信息表MedicineDetail中统计每个厂家生产的药品的数量,就可以使用group by子句对ProviderName列进行分组,然后统计结果集的个数

select ProviderName '上产厂家', count(*) '药品数量' from MedicineDetail group by ProviderName

要从药品信息表中获取每个厂家长产药品的最高价格:select ProviderName '生产厂家', Max(showprice) '价格' from MedicineDetail group by ProviderName

筛选药品信息表中MedicineDetail中数量多于10个的药品生产厂家以及的该厂家的药品数量就可以使用having子句进行过滤

select ProviderName '生产厂家', count(*) '药品数量’ from MedicineDetail group by ProivderName Having count (*) >10

内连接:将两个表中满足条件的记录组合在一起。

外连接:返回所有匹配的行和不匹配的行。

外连接分为左外链接:left outer join LEFT返回所有匹配的行并从关键字join左边的表中返回所有不匹配的行,

right outer join RIGHT返回所有匹配的行并从关键字join邮编的表中返回所有不匹配的行。

例如:左外链接:select 列名列表 from 表名1 LEFT [OUTER] join 表名2 on 表名1.列名=表名2.列名

使用子查询

1.使用比较运算符 any和some表示相比较的两个数据集中,至少有一个值的比较为真,满足搜索条件,若子查询结果集为空,则不满足搜索条件。

all与结果集中所有的值比较都为真, 才能满足搜索条件。

在Personnel_Sys数据库中查询包含女性员工的部门编号和部门名称。

select did '编号' , dname '部门名称'

from Departments where did=ANY(select did from Employees where sex='女')

2.使用in关键字

in关键字可以判断指定的值是否包含在另外一个查询结果集中。

select e.eid '编号',e.ename '姓名',e.sex '性别',e.hometown '籍贯',c.salary2 '调整后工资' from salary_changes c inner join employees e on c.eid=e.eid where e.eid in(select eid from employees where married='已婚')

3.使用exists关键字

exists关键字的作用是在where子句中测试子查询返回的数据行是否存在,不会返回任何行只会产生逻辑值true或者false

在Personnel_Sys数据库中如果存在一个部门没有员工的情况,那么就显示所有部门的信息

select * from Departments where exists(select e.eid '编号',e.ename '姓名',d.dname '部门名称' from employees e right outer join departments d on e.eid=d.did where e.eid is null)

4.单值查询

子查询的查询结果就返回一个值:在Personnel_sys数据库中输出编号为100401员工所在部门的编号,部门名称以及部门人数

select * from departments where did=(select did from employees where eid=100401)

5.嵌套子查询

在查询语句中包含一个或者多个子查询:查询并显示调整过薪资的员工的信息,包含员工编号,姓名,性别和籍贯

select eid '编号',ename '姓名',sex '性别',hometown '籍贯' from employees where eid in(select eid from salary_changes)

使用create view语句创建一个名为V_employee_department的视图,要求视图可以查询每个员工的编号,姓名,职称以及所在部门名称:create view V_employee_department

(

编号,姓名,职称,所在部门)

as select e.eid,e.ename,e.post,d.dname from employees e inner join departments d on e.eid=d.did