php面试题集-数据库技术题

数据库技术题


某内容管理系统中,表message有如下字段
id 文章id
title 文章标题
content 文章内容
category_id 文章分类id
hits 点击量
创建上表,写出MySQL语句
暂无答案


2.同样上述内容管理系统:表comment记录用户回复内容,字段如下
comment_id 回复id
id 文章id,关联message表中的id
comment_content 回复内容
现通过查询数据库需要得到以下格式的文章标题列表, 并按照回复数量排序,回复最高的排在最前面
文章id 文章标题 点击量 回复数量
用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0
暂无答案


3.上述内容管理系统,表category保存分类信息,字段如下
category_id int(4) not null auto_increment;
categroy_name varchar(40) not null;
用户输入文章时,通过选择下拉菜单选定文章分类
写出如何实现这个下拉菜单
暂无答案


写出发贴数最多的十个人名字的SQL,利用下表:
members(id, username, posts, pass, email)


mysql_fetch_row() 和 mysql_fetch_array()之间有什么区别?
前者是从结果集取出一行数组,作为枚举;
后者是从结果集取出一行数组作为关联数组或数字数组,两者兼得。


取得查询结果集总数的函数是?
mysql_num_rows($result);


Mysql 的存储引擎,myisam和innodb的区别。
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。
基本的差别为:
MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
详情:http://www.php100.com/html/webkaifa/database/Mysql/2011/0326/7789.html


写出三种以上MYSQL数据库存储引擎的名称(提示:不区分大小写)
MyISAM、InnoDB、DBD(Berkeley DB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB等等


说出你所知道的三种以上开源数据库的名称(提示:想想目前国外流行的开源数据库)
MySQL、SQLite、BDB(Berkeley DB)、PostgreSQL、Firebird


MYSQL数据库中字段类型varchar和char的主要区别是多少?哪种字段的查找效率要高,为什么?
varchar是变长,节省存储空间;char是定长。查找效率char型快,
因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型要多了一个步骤。
varchar保存的值是可变长度;char是固定长度,如果保存的值不足你定义的长度,SQL会在后面追加空格,直到你定义的字段长度.


说出MYSQL4.0和4.1版本的最主要的两个区别。如果你使用过MYSQL5,请说说MYSQL5和4的主要区别
4.1比4.0主要多了子查询和字符编码的支持这两点;
5增强的功能比4更多,包括存储过程‘视图、事务等等。


MYSQL数据库基本的三个优化法则是什么?(提示:从服务配置、应用、开发角度考虑)
(1)系统服务优化,把Mysql的key_buffer、cache_buffer|“query_cache等增加容量;
(2)给所有经常查询的字段增加适当的索引;
(3)优化SQL语句,减少ditinct、group、join等等语句的操作。


写出发贴数最多的十个人名字的SQL,利用下表:members(id,username,posts,pass,email)(2分)
答:SELECT * FROM `members` ORDER BY posts DESC limit 0,10;


根据题目要求,用php写出代码。
表名user
ID    name      tel       content          date
1     张三    13333663366 大专毕业      2006-10-11
3     张四    020-5566556 中专毕业      2006-10-15
4     王五    13521212125 大专毕业      2006-12-25
2    ……
6    ……
假设数据库连接如下:
$mysql_db = mysql_connect(‘local‘, ‘root‘, ‘pass‘);
@mysql_select_db(‘DB‘, $mysql_db);
(1)查询出所有name等于‘张三’的记录,并输出;
<?php
    $sql = ‘select * from user where name="张三"‘;
    $result = mysql_query($sql);
    while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
      echo $row[‘name‘];
    }
?>


(2)按ID升序查询,指返回排序后的前3条记录,并输出。
<?php
    $sql = ‘select * from user order by ID asc limit 0,3‘;
    $result = mysql_query($sql);
    while( $row = mysql_fetch_array($result, MYSQL_ASSOC) ){
      print_r($row);
    }
?> 


数据库中的事务是什么?
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。
如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。


优化MYSQL数据库的方法。(4分,多写多得)
答:
1、选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如‘省份,性别‘,最好设置为ENUM
2、使用连接(JOIN)来代替子查询:
a.删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
b.提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
c.提高b的速度优化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL
3、使用联合(UNION)来代替手动创建的临时表
a.创建临时表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`
4、事务处理:
a.保证数据完整性,例如添加和修改同时,两者成立则都执行,一者失败都失败
mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES (‘$name1‘)";
mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
mysql_query("COMMIT");
5、锁定表,优化事务处理:
a.我们用一个 SELECT 语句取出初始数据,通过一些计算,用 UPDATE 语句将新值更新到表中。
包含有 WRITE 关键字的 LOCK TABLE 语句可以保证在 UNLOCK TABLES 命令被执行之前,
不会有其它的访问来对 inventory 进行插入、更新或者删除的操作
mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE");
mysql_query("SELECT customerid FROM `customerinfo` where id=".$id);
mysql_query("UPDATE `orderinfo` SET ordertitle=‘$title‘ where customerid=".$id);
mysql_query("UNLOCK TABLES");
6、使用外键,优化锁定表
a.把customerinfo里的customerid映射到orderinfo里的customerid,
任何一条没有合法的customerid的记录不会写到orderinfo里
CREATE TABLE customerinfo
(
customerid INT NOT NULL,
PRIMARY KEY(customerid)  
)TYPE = INNODB;
CREATE TABLE orderinfo
(
orderid INT NOT NULL,
customerid INT NOT NULL,
PRIMARY KEY(customerid,orderid),
FOREIGN KEY (customerid) REFERENCES customerinfo
(customerid) ON DELETE CASCADE   
)TYPE = INNODB;
注意:‘ON DELETE CASCADE‘,该参数保证当customerinfo表中的一条记录删除的话同时也会删除order
表中的该用户的所有记录,注意使用外键要定义事务安全类型为INNODB;
7、建立索引:
a.格式:
(普通索引)->
创建:CREATE INDEX <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段)) 
(唯一索引)->
创建:CREATE UNIQUE <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段)) 
(主键)->
它是唯一索引,一般在创建表是建立,格式为:
CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])
8、优化查询语句
a.最好在相同字段进行比较操作,在建立好的索引字段上尽量减少函数操作
例子1:
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
例子2:
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)
例子3:
SELECT * FROM order WHERE title like "%good%";
SELECT * FROM order WHERE title>="good" and name<"good";

php面试题集-数据库技术题,布布扣,bubuko.com

php面试题集-数据库技术题

上一篇:ps给图片中的室内物体添加阳光光线特效


下一篇:[转]Oracle connection strings