本文中的存储过程示例 预计的循环次数是yh表行数 由于SELECT IID INTO PINT FROM YH WHERE = 不返回任何行 所以at_end后会立刻等于 (只循环一次就退出)
lishixinzhi/Article/program/DB2/201311/21926
、等级查询
题目:员工信息表中有员工ID、姓名、上级员工ID字段,现要求用一条语句,查询出全部员工的ID、姓名及级别——最高为1级,其下依次为2、3、4等,如下图所示:
员工信息表为Oracle数据库hr用户下的employees表,员工ID的字段名为employee_id,姓名为first_name || ' ' || last_name,上级员工ID为manager_id。在创建Oracle实例时,hr用户及该表自动生成。
通过对员工信息表的分析,发现如下线索:
1、本级员工的manager_id即为上一级员工的employee_id;
2、其中最高级员工的上级员工为空,其他级别都不为空。
如果一张数据库表中存在等级数据,则应使用START WITH … CONNECT BY [PRIOR] …关键字,进行等级查询,其中:
1、START WITH关键字标识数据表中最高等级的特征;
2、CONNECT BY关键字标识上下级行的关系;
3、PRIOR关键字标识此行是上一级行(原文是In a hierarchical query, one expression in condition must be qualified with the PRIOR operator to refer to the parent row.);
4、使用LEVEL伪列显示层级关系。
综上,查询语句为:
SELECT EMPLOYEE_ID,
FIRST_NAME || ' ' || LAST_NAME AS NAME,
LEVELFROM EMPLOYEESSTART WITH MANAGER_ID IS NULLCONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID
二、排序
题目:员工信息表中有员工ID、姓名、部门ID、工资字段,现要求用一条语句,查询出每个员工在整个公司以及本部门工资的排名(升序或降序排列均可),如下图所示:
对于排序,我原来只知道利用ROWNUM伪列:
SELECT E.*,
ROWNUM
FROM (SELECT *
FROM EMPLOYEES
ORDER BY SALARY DESC) E
然后再用这个结果集和其他表关联,针对本题,这种方法可以查出每个员工在整个公司以及本部门工资的排名,但在我看来有如下两个问题:
1、一张事实表关联两次,效率低下;
2、无法查询出每个员工在整个公司以及本部门工资的排名,除非用循环,但又不是一条语句了。
数据库表中对数值字段进行排名,应使用RANK函数,该函数的作用就是计算一个值在一组值中的排名,返回值为数值型,形式为RANK() OVER (PARTITION BY … ORDER BY …),其中:
1、PARTITION BY关键字为用于排序的分组,也就是说如果查询全部数据中的排名,则该关键字可省略;
2、ORDER BY关键字即为按哪个字段进行排序,空或ASC为升序,DESC为降序,与标准SQL没区别;
3、如果两行数据用于排序的字段值完全相同,则二者的RANK返回值(序号)也相同,序号不连续(英文是Identical salary values receive the same rank and cause nonconsecutive ranks),还有类似的DENSE_RANK()函数,相同值的序号相同,序号连续;ROW_NUMBER()函数,每个值的序号唯一,相同值有可能按照ROWNUM的次序编号(这个不确定,官方文档没说,我推测的-_-),这三个函数的使用方法相同。
本文实例讲述了PHP使用pdo连接access数据库并循环显示数据 *** 作。分享给大家供大家参考,具体如下:PDO连接与查询:
try
{
$conn
=
new
PDO("odbc:driver={microsoft
access
driver
(*.mdb)}
dbq=".realpath("MyDatabase.mdb"))
or
die("链接错误!")
//echo
"链接成功!"
}
catch(PDOException
$e){
echo
$e->getMessage()
}
$sql
=
"select
*
from
users"
1.
foreach()方法
foreach
($conn->query($sql)
as
$row)
{
$row["UserID"]
$row["UserName"]
$row["UserPassword"]
}
2.
while()方法
$rs
=
$conn->query($sql)
$rs->setFetchMode(PDO::FETCH_NUM)
while($row=$rs->fetch()){
$row[0]
$row[1]
$row[2]
}
php使用PDO抽象层获取查询结果,主要有三种方式:
(1)PDO::query()查询。
看下面这段php代码:
<?php
//PDO::query()查询
$res
=
$db->query('select
*
from
user')
$res->setFetchMode(PDO::FETCH_NUM)
//数字索引方式
while
($row
=
$res->fetch()){
print_r($row)
}
?>
(2)PDO->exec()处理sql
<?php
//PDO->exec()处理sql
$db->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION)
$res
=
$db->exec("insert
into
user(id,name)
values('','php点点通')")
echo
$res
?>
(3)PDO::prepare()预处理执行查询
<?php
//PDO::prepare()预处理执行查询
$res
=
$db->prepare("select
*
from
user")
$res->execute()
while
($row
=
$res->fetchAll())
{
print_r($row)
}
?>
setAttribute()
方法是设置属性,常用参数如下:
PDO::CASE_LOWER
--
强制列名是小写
PDO::CASE_NATURAL
--
列名按照原始的方式
PDO::CASE_UPPER
--
强制列名为大写
setFetchMode方法来设置获取结果集的返回值的类型,常用参数如下:
PDO::FETCH_ASSOC
--
关联数组形式
PDO::FETCH_NUM
--
数字索引数组形式
PDO::FETCH_BOTH
--
两者数组形式都有,这是默认的
PDO::FETCH_OBJ
--
按照对象的形式,类似于以前的
mysql_fetch_object()
对上面总结如下:
查询 *** 作主要是PDO::query()、PDO::exec()、PDO::prepare()。
PDO->query()
—
处理一条SQL语句,并返回一个“PDOStatement”
PDO->exec()
—
处理一条SQL语句,并返回所影响的条目数
PDO::prepare()主要是预处理 *** 作,需要通过$rs->execute()来执行预处理里面的SQL语句
最后介绍两个常用的函数:
(1)fetchColumn()获取指定记录里一个字段结果,默认是第一个字段!
<?php
$res
=
$db->query('select
*
from
user')
//获取指定记录里第二个字段结果
$col
=
$res->fetchColumn(1)
echo
$col
?>
(2)fetchAll(),从一个结果集中获取数据,然后存放在关联数组中
<?php
$res
=
$db->query('select
*
from
user')
$res_arr
=$res->fetchAll()
print_r($res_arr)
?>
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP基于pdo *** 作数据库技巧总结》、《php+Oracle数据库程序设计技巧总结》、《PHP+MongoDB数据库 *** 作技巧大全》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库 *** 作入门教程》及《php常见数据库 *** 作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
您可能感兴趣的文章:PHP使用PDO连接ACCESS数据库PHP数据库链接类(PDO+Access)实例分享php中mysql连接方式PDO使用详解关于php连接mssql:pdo
odbc
sql
serverPhp中用PDO查询Mysql来避免SQL注入风险的方法php中在PDO中使用事务(Transaction)全新的PDO数据库 *** 作类php版(仅适用Mysql)php使用pdo连接并查询sql数据库的方法php使用pdo连接mssql
server数据库实例PHP实现PDO的mysql数据库 *** 作类
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)