PHP+mysql真题

来自《PHP程序员面试笔试宝典》,涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知识也涵盖在了本书。

【真题215】 按要求写出SQL实现。

1)创建新闻发布系统,表名为message,有如下字段:

id 文章id

title 文章标题

content 文章内容

category_id 文章分类id

hits 点击量

参考答案:

CREATE TABLE 'message'(

'id' int(10) NOT NULL auto_increment,

'title' varchar(200) default NULL,

'content' text,

'category_id' int(10) NOT NULL,

'hits' int(20),

PRIMARY KEY('id');

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

2)同样上述新闻发布系统:表comment记录用户回复内容,字段如下:

comment_id 回复id

id 文章id,关联message表中的id

comment_content 回复内容

现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面。

文章id 文章 标题 点击量 回复 数量

用一个SQL语句完成上述查询,如果文章没有回复,则回复数量显示为0。

参考答案:

SELECT message.id id,message.title title,IF(message.'hits' IS NULL,0,message. 'hits') hits,

IF(comment. 'id' is NULL,0,count(*)) number FROM message LEFT JOIN

comment ON message.id=comment.id GROUP BY message. 'id';

上述内容管理系统,表category保存分类信息,字段如下:

category_id int(4) not null auto_increment;

category_name varchar(40) not null;

3)用户输入文章时,通过选择下拉菜单选定文章分类,写出如何实现这个下拉菜单。

参考答案:

function categoryList()

{

$result=mysql_query("select category_id,categroy_name from category")

or die("Invalid query: " . mysql_error());

print("<select name='category' value=''>/n");

while($rowArray=mysql_fetch_array($result))

{

print("<optionvalue='".$rowArray['category_id']."'>".$rowArray['categroy_name']."</ option>/n");

}

print("</select>");

}

【真题216】 使用PHP写一段简单查询,查出所有姓名为“张三”的内容并打印出来。

表名User

Name    Tel      Content      Date

张三 13333663366 大专毕业 2006-10-11

张三 13612312331 本科毕业 2006-10-15

张四 021-55665566 中专毕业 2006-10-15

参考答案:根据上面的题目完成代码:

$mysql_db=mysql_connect("local","root","pass");

@mysql_select_db("DB",$mysql_db);

$result = mysql_query("SELECT * FROM 'user' WHERE name='张三'");

while($rs = mysql_fetch_array($result)){

echo $rs["tel"].$rs["content"].$rs["date"];

}

【真题217】 考虑如下SQL语句,哪个选项能对返回记录的条数进行限制?(    )(双选)

SELECT * FROM MY_TABLE

A.如果可能,那么把查询转换成存储例程

B.如果程序允许,那么给查询指定返回记录的范围

C.如果可能,那么添加 where 条件

D.如果DBMS允许,那么把查询转换成视图

参考答案:B、C。

分析:有两个方法能限制返回记录的条数——使用 where 条件或limit关键字指定查询返回的记录的范围。

通常情况下,如果没有特殊需要,那么尽量不要用 select *,这会浪费大量的数据缓存。

【真题218】 执行以下 SQL 语句后将发生(    )。

BEGIN TRANSACTION

DELETE FROM MYTABLE WHERE ID=1

DELETE FROM OTHERTABLE

ROLLBACK TRANSACTION

A.OTHERTABLE 中的内容将被删除

B.OTHERTABLE 和 MYTABLE 中的内容都会被删除

C.OTHERTABLE 中的内容将被删除,MYTABLE 中 ID 是 1 的内容将被删除

D.数据库没有变化

参考答案:D。

分析:这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化。

【真题219】 以下查询的输出结果是(    )。

SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.ID <> TABLE2.ID

A.TABLE1 和 TABLE2 不相同的记录

B.两个表中相同的记录

C.TABLE1 中的记录条数乘以 TABLE2 中的记录条数再减去两表中相同的记录条数

D.两表中不同记录的条数

参考答案:C。

分析:本题描述了一种在使用JOIN时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有 ID 非共有的记录”。DBMS将读取左边表中所有的记录加上右边表中 ID 非共有的记录。因此,该查询将读取TABLE1 中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。

【真题222】 以下说法正确的是(    )。

A.使用索引能加快插入数据的速度

B.良好的索引策略有助于防止跨站攻击

C.应当根据数据库的实际应用合理设计索引

D.删除一条记录将导致整个表的索引被破坏

参考答案:C。

分析:索引的作用主要是帮助数据库快速查找到对应的数据,并不能加快插入数据的速度,所以,选项A错误。

索引不能够帮助防止跨站攻击,所以,选项B错误。

创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。索引是占用物理空间的,所以在实际的应用中是要合理设计使用索引的。所以,选项C正确。

索引是一种表结构,删除一条数据也不会影响到整个表的索引,并且索引不一定是数字,也可以是字符串。所以,选项D错误。

【真题223】 下列关于全文检索技术的说法中,不正确的是(    )。

A.Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL做全文搜索,它可以提供比数据库本身更专业的搜索功能

B.Solr是新一代的全文检索组件,它比Lucene的搜索效率高很多,还能支持HTTP的访问方式,PHP调用Solr也很方便

C.MySQL中把一个字段建立FULLTEXT索引,就可以实现全文检索,目前MyISAM和InnoDB的table都支持FULLTEXT索引

D.Lucene附带的二元分词分析器CJKAnalyzer切词速度很快,能满足一般的全文检索需要

参考答案:B。

分析:Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL、PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

Solr是一个独立的企业级搜索应用服务器,用户可以通过HTTP请求访问,它是采用JAVA5开发,基于Lucene的全文搜索服务器,同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。并且Solr比Lucene的搜索效率高很多,但是PHP调用Solr并不方便,选项B的说法错误。

MySQL中的MyISAM和InnoDB都是支持FULLTEXT全文索引的。全文搜索引擎可以在不使用模板匹配操作的情况下查找单词或短语。

真题153:PHP连接MySQL的方法

1.建立连接MySQL服务器

在PHP中,首先要与MySQL服务器建立连接后才能连接数据库,用于连接MySQL服务器的函数是mysql_connect()函数,语法格式如下:

resource mysql_connect([string $server [, string $username [, string $password [, bool $new_link [, int $client_flags ]]]]])

如果使用同样的参数第二次调用mysql_connect()函数,那么将不会建立新连接,而将返回已经打开的连接标志。参数$new_link指定在这种情况下是否建立新的连接,值为TRUE表示建立新的连接,值为FALSE时返回已经建立连接的句柄,默认值为FALSE。

PHP还提供了另外一个用于连接MySQL服务器的函数:mysql_pconnect()。该函数用于建立一个与MySQL服务器的持久连接。

2.选择数据库

连接到服务器后,可以选择需要使用的数据库,使用mysql_select_db()函数,语法格式如下:

bool mysql_select_db(string $database_name [, resource $ link_identifier ])

说明:$database_name参数为要选择的数据库名,可选参数$lin_identifier 为一个连接标志符,如果没有指定,则使用上一个打开的连接。如果之前没有已经打开的连接,则本函数尝试调用一个无参数的 mysql_connect()函数来打开一个连接并使用。本函数运行成功返回TRUE,否则返回FALSE。

3.关闭连接

当一个已经打开的连接不再需要时,可以使用mysql_close()函数将其关闭,语法格式如下:

bool mysql_close([ resource $link_identifier ])

可选参数$link_identifier为指定的连接标志符,如果省略,则关闭上一个打开的连接。

【真题227】 以下代码的运行结果为(    )。

<?php

mysql_connect('localhost','root',"");

$result = mysql_query("SELECT id,name FROM tb1");

while($row = mysql_fetch_array($result,MySQL_ASSOC)){

echo' ID:' .$row[0].' Name:' .$row[];

}

?>

A.报错    B.循环换行打印全部记录

C.无任何结果 D.只打印第一条记录

参考答案:A。

分析:因为代码中没有指明要操作的数据库名,所以会报错。

所以,本题的答案为A。

问题:如何进行MySQL优化?

SQL优化

执行缓慢的SQL语句能消耗数据库的70%~90%的CPU资源,而SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低。SQL语句可以有不同的写法,下面分别介绍。

(1)在MySQL 5.5及其以下版本中避免使用子查询

例如,在MySQL 5.5版本里,若执行下面的SQL语句,则内部执行计划器是这样执行的:先查外表再匹配内表,而不是先查内表T2。所以,当外表的数据很大时,查询速度就会非常慢。

SELECT * FROM T1 WHERE ID IN (SELECT ID FROM T2 WHERE NAME='xiaomaimiao');

在MySQL 5.6版本里,采用JOIN关联方式对其进行了优化,这条SQL会自动转换为

SELECT T1.* FROM T1 JOIN T2 ON T1.ID = T2.ID;

需要注意的是,该优化只针对SELECT有效,对UPDATE或DELETE子查询无效,故生产环境应避免使用子查询。

(2)避免函数索引

例如,下面的SQL语句会走全表扫描:

SELECT * FROM T WHERE YEAR(D) >= 2016;

由于MySQL不像Oracle那样支持函数索引,即使D字段有索引,也会直接全表扫描。应改为如下的SQL语句:

SELECT * FROM T WHERE D >= '2016-01-01';

(3)用IN来替换OR

低效查询:

SELECT * FROM T WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;

高效查询:

SELECT * FROM T WHERE LOC_IN IN (10,20,30);

(4)在LIKE中双百分号无法使用到索引

SELECT * FROM t WHERE name LIKE '%de%';

SELECT * FROM t WHERE name LIKE 'de%';

在以上SQL语句中,第一句SQL无法使用索引,而第二句可以使用索引。目前只有MySQL 5.7及以上版本支持全文索引。

(5)读取适当的记录LIMIT M,N

SELECT * FROM t WHERE 1;

SELECT * FROM t WHERE 1 LIMIT 10;

(6)避免数据类型不一致

SELECT * FROM T WHERE ID = '19';

由于以上SQL中ID为数值型,所以应该去掉过滤条件中数值19的双引号:

SELECT * FROM T WHERE ID = 19;

(7)分组统计可以禁止排序

SELECT GOODS_ID,COUNT(*) FROM T GROUP BY GOODS_ID;

默认情况下,MySQL会对所有GROUP BY col1,col2...的字段进行排序。如果查询包括GROUP BY,那么想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序,如下:

SELECT GOODS_ID,COUNT(*) FROM T GROUP BY GOODS_ID ORDER BY NULL;

(8)避免随机取记录

SELECT * FROM T1 WHERE 1=1 ORDER BY RAND() LIMIT 4;

由于MySQL不支持函数索引,所以以上SQL会导致全表扫描,可以修改为如下的SQL语句:

SELECT * FROM T1 WHERE ID >= CEIL(RAND()*1000) LIMIT 4;

(9)禁止不必要的ORDER BY排序

SELECT COUNT(1) FROM T1 JOIN T2 ON T1.ID = T2.ID WHERE 1 = 1 ORDER BY T1.ID DESC;

由于计算的是总量,所以没有必要去排序,可以去掉排序语句,如下:

SELECT COUNT(1) FROM T1 JOIN T2 ON T1.ID = T2.ID;

(10)尽量使用批量INSERT插入

下面的SQL语句可以使用批量插入:

INSERT INTO t (id, name) VALUES(1,'xiaolu');

INSERT INTO t (id, name) VALUES(2,'xiaobai');

INSERT INTO t (id, name) VALUES(3,'xiaomaimiao');

修改后的SQL语句:

INSERT INTO t (id, name) VALUES(1,'xiaolu'), (2,'xiaobai'),(3,'xiaomaimiao');

购买链接:京东购买

题目来自《PHP程序员面试笔试宝典》,里面涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知识也涵盖在了本书。

更多PHP面试笔试真题可以浏览:www.shuaiqi100.com  

更多有趣有料的PHP面试笔试资料可以关注:“琉忆编程库”

或者浏览:www.shuaiqi100.com 获取。

PHP程序员面试笔试宝典下载:https://pan.baidu.com/s/1-ES2ZI3z5Lhv-zTKFmJDSQ

PHP+mysql真题的更多相关文章

  1. 2019年京东Java研发岗社招面经(面试经历+真题总结+经验分享)!

    本篇先以日历形式回顾秋招之路,方便各位参考某厂的处理进度:然后是总结归纳春秋招Java面试题库:最后做个总结还有展望,开始新的征程~ 面试经历京东面试真题面试经验分享1.面试经历 2018年的冬季特别 ...

  2. 阿里技术专家十五问,真题面试刀刀见肉,快来和阿里面试官battle

    引言 2020阿里巴巴专家组出题,等你来答: 题目:如何判断两个链表是否相交 出题人:阿里巴巴新零售技术质量部 参考答案: $O(n^2)$: 两层遍历,总能发现是否相交 $O(n)$: 一层遍历,遍 ...

  3. 《PHP程序员面试笔试真题解析》——新书上线

    你好,是我--琉忆.很高兴可以跟你分享我的新书. 很高兴,在出版了PHP程序员面试笔试宝典后迎来了我的第二本书出版--<PHP程序员面试笔试真题解析>. 如果你是一个热爱PHP的程序员,刚 ...

  4. 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附答案

    2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...

  5. 2016.1.4~2016.1.7真题回顾!-- HTML5学堂

    2016.1.4~2016.1.7真题回顾!-- HTML5学堂 2015悄然而逝,崭新的2016随即而行!生活需要新鲜感,学习JavaScript的过程需要有成就感!成就感又是来自于每一天的不断练习 ...

  6. 2015.12.29~2015.12.30真题回顾!-- HTML5学堂

    2015.12.29~2015.12.30真题回顾!-- HTML5学堂 吃饭,能够解决饥饿,提供身体运作机能.练习就像吃饭,强壮自己,提升编程技能,寻求编程技巧的最佳捷径!吃饭不能停,练习同样不能停 ...

  7. 2015.12.21~2015.12.24真题回顾!-- HTML5学堂

    2015.12.21~2015.12.24真题回顾!-- HTML5学堂 山不在高,有仙则名!水不在深,有龙则灵!千里冰封,非一日之寒!IT之路,须厚积薄发!一日一小练,功成不是梦!小小技巧,尽在HT ...

  8. 网易实习笔试真题C/C++

    刚做的时候根本就没有想到解题思路,刚好看到了别人的思路,自己写了一下.里面对unordered_map及vector二维数组的建立很灵活,另外区别了一下map,unordered_map,hash_m ...

  9. 你只是看起来很努力(只是做了一遍真题,草草的对了一遍答案,然后冲出自习室继续她学生会的事情了,骗自己更容易)good——想起了自己在六大时候的无奈

    (转)你只是看起来很努力一次上课,一个女孩子垂头丧气的跟我说,老师,我考了四次四级,还没过,究竟是为什么. 我说,你真题做了吗?单词背了吗?她拿出已经翻破了的真题,跟我说,你讲的所有的题目我连答案都记 ...

随机推荐

  1. Flask_Flask-Migrate数据迁移扩展(十二)

    在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据.更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中. ...

  2. golang strings.Split函数

    golang strings.Split函数 https://play.studygolang.com/ package main import ( "fmt" "str ...

  3. [Docker] 在CentOS6.8 安装 Docker

    运行docker Linux内核版本需要在3.8以上,针对centos6.5 内核为2.6的系统需要先升级内核.不然会特别卡,退出容器. # 查看当前版本: cat /etc/issue # 导入pu ...

  4. spring-data-jpa -hibernate --specificationExecutor

    Specifications动态查询 在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecu ...

  5. 智能集成接口:I3 ISA-95 的应用

    介绍 多年来,使用基于制造运营管理 (MOM) 的应用程序的制造 IT 顾问试图说服制造商这些类型的应用的高价值.实时 MOM 解决方案是唯一一组能够精确优化工厂日常运营的 IT 应用程序,可为其可用 ...

  6. linux开放端口关闭防火墙

    linux开放端口关闭防火墙 systemctl status firewalld查看当前防火墙状态. 开启防火墙      systemctl start firewalld开放指定端口       ...

  7. windows server 服务器安装jenkins 并通过git拉取代码实现自动发布到IIS

    Jenkins是一个开源软件,可以通过一定的配置进行自动构建,测试,部署等功能. 首先,服务器应安装好 .NET Core环境和JDK, 下载Jenkins安装包 https://www.jenkin ...

  8. Ubuntu下使用VS Code创建Spring Boot工程

    目的 我们将在Ubuntu桌面系统下,使用VS Code(Visual Studio Code)编辑器从零开始创建一个Spring Boot工程,并实现一个简单的RESTful风格接口.使用这套流程的 ...

  9. Javascript中常用事件集合和事件使用方法

    Javascript中常用事件集合和事件使用方法 一.事件绑定 格式: 事件源 . on事件类型=事件处理函数 事件绑定三要素 1.事件源:和谁绑定 2.事件类型:什么事件 3.事件处理函数:触发了要 ...

  10. python 中 *args he **kwargs的区别

    ''' 一 *args 和 **kwargs 的区别? *args 表示任意个 无名参数, 类型是元祖 tuple. **kwargs 表示的是关键字的参数 传入的参数是 dict 类型. 当*和** ...