数据库-面试题

数据库系统,基础知识

这段代码错了怎么改,求大神
String sql="insert into student(stuId,stuName,stuPwd)**valuse('"**
+student.getStuId()+"','"+student.getStuName()+"'+'"+student.getStuPwd()+"')";
st.execute(sql);

String sql=”insert into student(stuId,stuName,stuPwd) values (student.getStuId(),student.getStuName(),student.getStuPwd())”;

这里的student应该是一个java实例,上面是正确答案,但是有SQL注入风险。

1.具体怎么注入?

2. SQL ALTER TABLE 语句

alter Table 详细介绍

ALTER TABLE 语句用于在已有的表中添加、修改或删除列。

SQL ALTER TABLE 语法
如需在表中添加列,请使用下列语法:

    ALTER TABLE table_name
    ADD column_name datatype

要删除表中的列,请使用下列语法:

    ALTER TABLE table_name 
    DROP COLUMN column_name

注释:某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。
要改变表中列的数据类型,请使用下列语法:

    ALTER TABLE table_name
    ALTER COLUMN column_name datatype

3. CREATE INDEX 语句用于在表中创建索引。

在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
索引

您可以在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

SQL CREATE INDEX 语法

在表上创建一个简单的索引。允许使用重复的值:

CREATE INDEX index_name
ON table_name (column_name)

注释:”column_name” 规定需要索引的列。

SQL CREATE UNIQUE INDEX 语法

在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。

    CREATE UNIQUE INDEX index_name
    ON table_name (column_name)

4. grant & revoke

我对scott用户授予了创建任何方案下表、视图、过程的权限(语句如下)!!现在想要取消授予的权限,语句怎么样写?

mysql

 GRANT (Select,delete,…) ON (对象) TO USER_NAME [WITH GRANT OPTION];//授权
oracle 授予权限的语句:

grant create any table,create any view,select any table,drop any table to scott

oracle 撤销权限的语句:

SQL> revoke create any table,create any view,select any table,drop any table from scott;

视图是可视化的表。

5. SQL CREATE VIEW 语句

什么是视图?
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。

视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。

INSERT INTO Viewname {column1,column2,…} values(exp1,exp2,…);//插入视图实际影响表

注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。

SQL CREATE VIEW 语法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。

SQL CREATE VIEW 实例

可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。通过向视图添加函数、join 等等,我们可以向用户精确地提交我们希望提交的数据。

样本数据库 Northwind 拥有一些被默认安装的视图。视图 “Current Product List” 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No

我们可以查询上面这个视图:
SELECT * FROM [Current Product List]

Northwind 样本数据库的另一个视图会选取 Products 表中所有单位价格高于平均单位价格的产品:

CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products) 

我们可以像这样查询上面这个视图:

SELECT * FROM [Products Above Average Price]

另一个来自 Northwind 数据库的视图实例会计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 “Product Sales for 1997” 的视图那里选取数据:

CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName 

我们可以像这样查询上面这个视图:

SELECT * FROM [Category Sales For 1997]

我们也可以向查询添加条件。现在,我们仅仅需要查看 “Beverages” 类的全部销量:

SELECT * FROM [Category Sales For 1997]
WHERE CategoryName='Beverages'

SQL 更新视图
您可以使用下面的语法来更新视图:
SQL CREATE OR REPLACE VIEW Syntax

CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

现在,我们希望向 “Current Product List” 视图添加 “Category” 列。我们将通过下列 SQL 更新视图:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No

SQL 撤销视图
您可以通过 DROP VIEW 命令来删除视图。
SQL DROP VIEW Syntax

DROP VIEW view_name

6. 完整性约束


  • 实体完整性约束

就是说,表中每一个记录都要有主键


  • 参照完整性约束

就是说,表中所有的外键,在另外一个表中都要有对应的值,否则更新不成功。或者成功(通过设置on delete cascade, on update cascade)等 操作。

create table course(
    ...
    foreign key (dept_name) references department
    on delete cascade 
    on update cascade
)

这种级联操作可以保证。

还有婚姻数据库,外键到自己。如果AB是夫妻,AB都没有在夫妻数据库中,则上述办法也不可能达到这样的效果。
婚姻数据库有两个字段
marrage
===name姓名
===spouse配偶姓名

则可以设置 set constraints constraint-list deferred ,作为事物的一部分。这种在 操作全部结束以后 才会检查约束,而不是sql默认的立即检查约束是否满足。


  • 用户定义完整性约束

用户自定义完整性指针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。例如某个属性必须取唯一值,某个非主属性也不能取空值,某个属性的取值范围在0-100之间等


7. mysql的范式

范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。下面就简单介绍下这三个范式。


◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
考虑这样一个表:【联系人】(姓名,性别,电话)
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨别,但是 2NF 和 3NF 就容易搞混淆。


◆ 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。
因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。
可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中UnitPrice,ProductName多次重复的情况。


◆ 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。
其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。
通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。

这里的意思也就是说,主键只有一个OrderID,但是不是完全依赖,因为CustomerName,CustomerAddr,CustomerCity是直接依赖于CustomerID的。

第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。


BC范式

1NF消去对主码的部分函数依赖后=2NF。

2NF消去对主码的传递函数依赖后=3NF。

3NF消去对候选码(注意是候选码)的部分函数依赖和传递函数依赖后 = BCNF

鲍依斯-科得范式(BCNF):

在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。

假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

(仓库ID, 存储物品ID) →(管理员ID, 数量)

(管理员ID, 存储物品ID) → (仓库ID, 数量)

管理员id和仓库id不是一一对应的关系。
上面两种都可以作为候选码。

所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选码,随便选一个都可以作为主键,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

(仓库ID) → (管理员ID)

(管理员ID) → (仓库ID)

即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下异常情况:

(1) 删除异常:

当仓库被清空后,所有”存储物品ID”和”数量”信息被删除的同时,”仓库ID”和”管理员ID”信息也被删除了。

(2) 插入异常:

当仓库没有存储任何物品时,无法给仓库分配管理员。

(3) 更新异常:

如果仓库换了管理员,则表中所有相应行(仓库)的管理员ID都要修改。

把仓库管理关系表分解为二个关系表:

仓库管理:StorehouseManage(仓库ID, 管理员ID);

仓库:Storehouse(仓库ID, 存储物品ID, 数量)。

这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。


MySQL导入导出命令
1.导出整个数据库
  mysql > dump -u 用户名 -p 数据库名 > 导出的文件名
  mysql > dump -u wcnc -p smgp_apps_wcnc > wcnc.sql
2.导出一个表
  mysql > dump -u 用户名 -p 数据库名 表名> 导出的文件名
  mysql > dump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

3.导出一个数据库结构
  mysql > dump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql
  -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table

4.导入数据库
  常用source 命令
  进入mysql数据库控制台,
  如mysql -u root -p
  mysql>use 数据库
  然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
  mysql >source d:wcnc_db.sql (注:如果写成source d:/wcnc_db.sql,就会报语法错误)
注意:使用导入数据库命令的数据库文件必须在mysql的bin目录下才可以

什么叫事务,有哪些特性

  • 原子性
  • 隔离性
  • 持久性
  • 一致性
  • 锁:共享锁、互斥锁

    两段锁协议:阶段1:加锁阶段 阶段2:解锁阶段

    触发器: 当满足触发器条件,则系统自动执行触发器的触发体。

    触发时间:有before,after.触发事件:有insert,update,delete三种。触发类型:有行触发、语句触发

    后期接着学习
    http://blog.csdn.net/hectorhua/article/details/13767361

    先放着吧~。2016.09.01

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值