❶ php可以和sql結合嗎
你說的 sql 估計是 Microsoft SQL Server
可以參考下面的文字
SQL Server 資料庫函數庫
------------------------------------------------------
本函數庫共有 16 個函數
SQL Server 是 Microsoft 從 SyBASE 取得並修改的資料庫系統,它只能在 Windows NT Server 上面執行。使用本函數只能使用 Windows NT Server 作為 PHP 的執行平台。
Microsoft SQL Server 的 query 語法為 Transact-SQL,和 SyBASE 的語法幾乎相同。本資料庫可能是所有 PHP 所支持資料庫中,中文書籍最多的資料庫了。
mssql_affected_rows: 取得最後 query 影響的記錄數。
mssql_close: 關閉與資料庫的連接。
mssql_connect: 連上資料庫。
mssql_data_seek: 移動列指標。
mssql_fetch_array: 返回數組數據。
mssql_fetch_field: 取得欄位信息。
mssql_fetch_object: 返回對象數據。
mssql_fetch_row: 返回單列的各欄位。
mssql_field_seek: 設定指標到返回值的某欄位。
mssql_free_result: 釋放返回佔用內存。
mssql_num_fields: 取得返回欄位的數目。
mssql_num_rows: 取得返回列的數目。
mssql_pconnect: 打開 MS SQL 伺服器長期連接。
mssql_query: 送出一個 query 字元串。
mssql_result: 取得查詢 (query) 的結果。
mssql_select_db: 選擇一個資料庫。
詳細資料:
-----------------------------------------------------
mssql_affected_rows
取得最後 query 影響的記錄數。
語法: int mssql_affected_rows(int [link_identifier]);
返回值: 整數
函數類型: 資料庫功能
內容說明
本函數用來取得最後一次對資料庫下 query 指令所影響的記錄數,會影響的為 INSERT、UPDATE 或 DELETE 等指令,而 SELECT 不會影響。參數 link_identifier 可省略,為打開資料庫的連接代號。返回值即為記錄數。
-----------------------------------------------------
mssql_close
關閉與資料庫的連接。
語法: boolean mssql_close(int [link_identifier]);
返回值: 布爾值
函數類型: 資料庫功能
內容說明
本函數用來關閉與 MS SQL Server 資料庫的連接,能關閉的為使用 mssql_connect() 函數打開的資料庫,若使用 mssql_pconnect() 打開的資料庫則不能以本函數關閉。參數 link_identifier 可省略,為打開資料庫的連接代號。關閉成功則返回 true 值。
參考
mssql_connect() mssql_pconnect()
-----------------------------------------------------
mssql_connect
連上資料庫。
語法: int mssql_connect(string [servername], string [username], string [password]);
返回值: 整數
函數類型: 資料庫功能
內容說明
本函數用來打開與 MS SQL Server 資料庫的連接。參數 servername 為欲連上的資料庫伺服器名稱。參數 username 及 password 可省略,分別為連接使用的帳號及密碼。使用本函數需注意早點關閉資料庫,以減少系統的負擔。連接成功則返回資料庫的連接代號,失敗返回 false 值。
參考
mssql_close() mssql_pconnect()
-----------------------------------------------------
mssql_data_seek
移動列指標。
語法: boolean mssql_data_seek(int result_identifier, int row_number);
返回值: 布爾值
函數類型: 資料庫功能
內容說明
本函數用來移動 MS SQL Server 數據文件中的列指標到指定的列上,可供 mssql_fetch_row() 等函數使用。參數 result_identifier 為查詢的代號值。參數 row_number 則為欲移往的記錄數。若失敗則返回 false 值。
參考
mssql_close() mssql_pconnect()
-----------------------------------------------------
mssql_fetch_array
返回數組數據。
語法: array mssql_fetch_array(int result);
返回值: 數組
函數類型: 資料庫功能
內容說明
本函數用來將查詢結果 result 拆到數組變數中。若 result 沒有數據,則返回 false 值。而本函數可以說是 mssql_fetch_row() 的加強函數,除可以將返回列及數字索引放入數組之外,還可以將文字索引放入數組中。
-----------------------------------------------------
mssql_fetch_field
取得欄位信息。
語法: object mssql_fetch_field(int result, int field_offset);
返回值: 對象
函數類型: 資料庫功能
內容說明
本函數返回的對象數據為 result 的欄位 (Column) 信息。返回對象的屬性如下:
name - 欄位名稱
column_source -欄位所在表格的數據文件名稱
max_length - 欄位的最大長度
numeric - 若為 1 表示本欄位為數字定義 (numeric)
參考
mssql_field_seek()
-----------------------------------------------------
mssql_fetch_object
返回對象數據。
語法: object mssql_fetch_object(int result);
返回值: 對象
函數類型: 資料庫功能
內容說明
本函數用來將查詢結果 result 拆到對象變數中。使用方法和 mssql_fetch_array() 幾乎相同,不同的地方在於本函數返回值是對象而不是數組。若 result 沒有數據,則返回 false 值。另外值得注意的地方是,取回的對象數據的索引只能是文字而不能用數字,這是因為對象的特性。對象數據的特性中所有的屬性 (property) 名稱都不能是數字,因此只好乖乖使用文字字元串當索引了。關於速度方面,本函數的處理速度幾乎和 mssql_fetch_array() 及 mssql_fetch_row() 二函數差不多,要用哪個函數還是看使用的需求決定。
參考
mssql_fetch_array() mssql_fetch_row()
-----------------------------------------------------
mssql_fetch_row
返回單列的各欄位。
語法: array mssql_fetch_row(int result);
返回值: 數組
函數類型: 資料庫功能
內容說明
本函數用來將查詢結果 result 之單列拆到數組變數中。數組的索引是數字索引,第一個的索引值是 0。若 result 沒有數據,則返回 false 值。
參考
mssql_fetch_array() mssql_fetch_object() mssql_data_seek() mssql_result()
-----------------------------------------------------
mssql_field_seek
設定指標到返回值的某欄位。
語法: int mssql_field_seek(int result, int field_offset);
返回值: 整數
函數類型: 資料庫功能
內容說明
本函數設定目前的指標到返回值的特定欄位中。參數 result 為返回值代碼。參數 field_offset 則為指定的欄位序數。
使用範例
mssql_fetch_field
-----------------------------------------------------
mssql_free_result
釋放返回佔用內存。
語法: int mssql_free_result(int result);
返回值: 整數
函數類型: 資料庫功能
內容說明
本函數可以釋放目前 MS SQL Server 資料庫 query 返回所佔用的內存。一般只有在非常擔心在內存的使用上可能會不足的情形下才會用本函數。PHP 程序會在結束時自動釋放。
-----------------------------------------------------
mssql_num_fields
取得返回欄位的數目。
語法: int mssql_num_fields(int result);
返回值: 整數
函數類型: 資料庫功能
內容說明
本函數可以得到返回欄位的數目。參數 result 為返回值代碼。
參考
mssql_query() mssql_fetch_field() mssql_num_rows()
-----------------------------------------------------
mssql_num_rows
取得返回列的數目。
語法: int mssql_num_rows(int result);
返回值: 整數
函數類型: 資料庫功能
內容說明
本函數可以得到返回列的數目。參數 result 為返回值代碼。
參考
mssql_query() mssql_fetch_field() mssql_num_fields()
-----------------------------------------------------
mssql_pconnect
打開 MS SQL 伺服器長期連接。
語法: int mssql_pconnect(string [servername], string [username], string [password]);
返回值: 整數
函數類型: 資料庫功能
內容說明
本函數和 mssql_connect() 雷同。不同的地方在於使用本函數打開資料庫時,程序會先尋找是否曾經執行過本函數,若執行過則返回先前執行的 ID。另一個不同的地方是本函數無法使用 mssql_close() 關閉資料庫。參數 servername 為欲連上的資料庫伺服器名稱。參數 username 及 password 可省略,分別為連接使用的帳號及密碼。
-----------------------------------------------------
mssql_query
送出一個 query 字元串。
語法: boolean mssql_query(string query, int plink_identifier]);
返回值: 布爾值
函數類型: 資料庫功能
內容說明
本函數送出 query 字元串供 MS SQL Server 做相關的處理或者執行。若沒有指定 link_identifier 參數,則程序會自動尋找最近打開的 ID。成功則返回 true 值。
-----------------------------------------------------
mssql_result
取得查詢 (query) 的結果。
語法: int mssql_result(int result, int row, mixed field);
返回值: 整數
函數類型: 資料庫功能
內容說明
本函數取得一格 query 的結果。參數 field 可以是欄位名稱、順序或者是 fieldname.tablename 的格式。在返回值量少時,可以使用本函數來處理。當資料庫大時,本函數的效率就有待考慮了,這時可以使用較有效率的 mssql_fetch_row()、mssql_fetch_array() 或 mssql_fetch_object() 等函數。
-----------------------------------------------------
mssql_select_db
選擇一個資料庫。
語法: boolean mssql_select_db(string database_name, int [link_identifier]);
返回值: 布爾值
函數類型: 資料庫功能
內容說明
本函數選擇 MS SQL Server 中的資料庫以供之後的數據查詢作業 (query) 處理。成功返回 true,失敗則返回 false。
-----------------------------------------------------
❷ sql怎麼統計某一課程的各分數段的人數(在php程序里)
實現上面sql查詢結果的記錄總數
$sql = select count(C.`cid`) as `c` from (select * from `ctable` group by pid) as C left join `ptable` as P on P.`pid` = C.`pid`;
詳解,此語句用到了sql子查詢,先使用子查詢對ctable進行分組查詢,然後對分組後的結果集進行統計.
❸ sql查詢語句有php變數時查詢不到
你沒有搞清楚sql語句的語法
如果你的欄位是數字類型的,比如:int bigint 等欄位類型,那值就不要加引號
你說的直接換成109可以查詢到,估計應該是這樣吧?
$sql="select*fromer_memberwheregeo_longitude<=109andgeo_longitude>=107andgeo_latitude<=35andgeo_latitude>=33";
而你所說的有變數查詢不到,而且$nowLongitude_max是一個數值,那麼,你的sql運行後,應該是會變成這樣:
$sql="select*fromer_memberwheregeo_longitude<='109'andgeo_longitude>=107andgeo_latitude<=35andgeo_latitude>=33";
你自己看看兩條sql語句有什麼不同啊?
❹ PHP獲取sql數據表並顯示在頁面上
首先計算出總條數,
$query = mysql_query("select * from my_lyb");
$maxclou = mysql_num_rows($query);
算出總頁數,
$maxpage = ceil($maxclou/5);
用get方法獲得當前頁(如果為空,默認第一頁),算出上頁 下一頁
❺ 求大神詳細講解php連接mssql
為了能讓PHP連接MSSQL,系統需要安裝MSSQL,PHP,且在PHP.ini中的配置中,將 ;extension=php_mssql.dll前面的;去掉
1.連接MSSQL
$conn=mssql_connect("實例名或者伺服器IP","用戶名","密碼");
//測試連接
if($conn)
{
echo "連接成功";
}
2.選擇要連接的資料庫
mssql_select_db("dbname");
3.執行查詢
$rs = mssql_query("select top 1 id,username from tbname",$conn);
// 或者直接執行update,insert等語句,可以不用為返回結果賦值
mssql_query("update tbname set username='niunv' where id=1");
4.獲取記錄集行數
echo mssql_num_rows($rs);
5.獲取記錄集
if($row=mssql_fetch_array($rs))
{
$id = $row[0];//獲取ID欄位值
$username = $row[1];//獲取username欄位值
}
6.獲取新增記錄的ID
將id欄位設置為IDENTITY欄位,執行insert語句以後,就會產生一個
@@IDENTITY 全局變數值,查詢出來就是最後一條新增記錄的ID了.
mssql_query("insert into tbname(username) values ('nv')",$conn);
$rs = mssql_query("select @@IDENTITY as id",$conn);
if($row=mssql_fetch_array($rs))
{
echo $row[0];
}
7.釋放記錄集
mssql_free_result($rs);
8.關閉連接
mssql_close($conn);
注:用PHP操作MSSQL比在ASP連接MYSQL要簡單,所以,當需要MSSQL與MYSQL並存時,用PHP連接MSSQL來操作MYSQL與MSSQL並存比較簡單好用.如果是ASP連接MYSQL,需要安裝一個MYSQL驅動,默認windows的ODBC沒有安裝,很遺憾...
在web伺服器上至少安裝了mssql的客戶端
打開php.ini把;extension=php_mssql.dll
前面的分號去掉
有必要話:需要制定extension_dir
推薦使用 php<=4.0.9
<=5.0.3目前 我還沒有連接成功過4.010和 5.0.3
資料庫的 連接分頁可以到phpe.net上獲取到相應的class
下面是我修改的 一個class
<?php
/**
*mssql 資料庫連接類
**/
class SQL{
var $server;
var $userName;
var $passWord;
var $dataBase;
var $linkID = 0;
var $queryResult;
var $lastInsertID;
var $pageNum = 0;//分頁用---共有幾條數據
var $ER;
/**
*構造函數
**/
function SQL($Server='',$UserName='',$PassWord='',$DataBase=''){
$this->server = $Server;
$this->userName = $UserName;
$this->passWord = $PassWord;
$this->dataBase = $DataBase;
}
/**
*資料庫連接
**/
function db_connect(){
$this->linkID = mssql_pconnect($this->server,$this->userName,$this->passWord);
if(!$this->linkID){
$this->ER = "db_connect($this->server,$this->userName,$this->passWord) error";
return 0;
}
if (!mssql_select_db($this->dataBase,$this->linkID)) {
$this->ER = "mssql_select_db($this->dataBase,$this->lastInsertID) error";
return 0;
}
return $this->linkID;
}
/**public
* function: Check the database, if exist then select
* exist: return 1
* not exist: return 0
*/
function selectDatabase(){
if(mssql_select_db($this->dataBase))
return 1;
else
return 0;
}
/**
*數據操作
**/
function query($Str){
if ($this->linkID == 0) {
$this->ER = "資料庫還沒有連接!!";
}
$this->queryResult = mssql_query($Str);
//$this->queryResult = mssql_query($Str,$this->linkID);
if (!$this->queryResult) {
$this->ER = "$Str.沒有操作成功,query error!!";
return 0;//****************對於php 4.3.9以上版本的錯誤用1
}
return $this->queryResult;
}
/**
*數據獲取
**/
function fetch_array($result){
if($result != "") $this->queryResult = $result;
$rec =mssql_fetch_array($this->queryResult);
if(is_array($rec)){
return $rec;
}
//$this->ER = "沒有獲取數據!";
return 0;
}
/**public
* function: Free the Query Result
* success return 1
* failed: return 0
*/
function freeResult($result=""){
if($result != "") $this->queryResult = $result;
return mssql_free_result($this->queryResult);
}
/**
*獲取影響的的行數
*獲取操作過的行數
**/
function num_rows($result=""){
if ($result != "") {
$this->queryResult = $result;
$row = mssql_num_rows($this->queryResult);
return $row;
}
}
/**
*獲取查詢結果---多個
**/
function result_ar($str=''){
if (empty($str)) {
return 0;
}
$back = array();
$this->queryResult = $this->query($str);
while ($row = $this->fetch_array($this->queryResult)) {
$back[] = $row;
}
return $back;
}
/**
*資料庫信息分頁
*$Result 資料庫操作
*str ==sql語句
*page ==第幾頁
*showNum ==顯示幾頁
*/
function page($Str,$Page=0,$ShowNum=5){
$back = array();//返回數據
$maxNum = 0;
if ($Str == "") {
$this->ER = "沒有數據";
return 0;
}
$this->queryResult = $this->query($Str);
if($this->queryResult){
if($Page==""){
$nopa=0;
}else{
$nopa = ($Page-1)*$ShowNum;
if ($nopa<0) {
$nopa = 0;
}
}
$maxNum=$this->num_rows($this->queryResult);
$k=0;
$i=0;
$dd=$this->fetch_array($this->queryResult);
while($dd&&$nopa<=$maxNum&&$i<$ShowNum){
if($nopa >= $maxNum) $nopa = $maxNum;
mssql_data_seek($this->queryResult,$nopa);
$row=$this->fetch_array($this->queryResult);
$nopa++;
$i++;
$back[] = $row;
if ($nopa >=$maxNum) {
break;
}
}
}
$this->pageNum = $maxNum;
return $back;
}
/**
*分頁的html頁碼
*/
function page_html($DataNum=0,$Page=1,$ShowNum=3,$web,$Post=''){
if ($DataNum == 0) {
$back = "沒有要查詢的數據";
}else {
if ($ShowNum<=0) {
$ShowNum = 3;
}
if ($Page<=0) {
$Page = 1;
}
if (empty($web)) {
$web = "#";
}
$pageNum = ceil($DataNum/$ShowNum);
if ($Page <= 1) {
$top = "首頁<<";
}else {
$top = "<a href='".$web."?page=0&".$Post."' target='_self'>首頁<< </a>";
}
if ($Page !==1) {
$upPage = "<a href='".$web."?page=".($Page-1)."&".$Post."' target='_self'>上一頁</a>";
}else {
$upPage = "上一頁";
}
if ($Page < $pageNum) {
$downPage = "<a href='".$web."?page=".($Page+1)."&".$Post."' target='_self'>下一頁</a>";
}else {
$downPage = "下一頁";
}
if ($Page == $pageNum) {
$foot = ">>尾頁";
}else {
$foot = "<a href='".$web."?page=".$pageNum."&".$Post."' target='_self'> >>尾頁</a>";
}
$back = <<<EOT
共 $pageNum 頁
第 $Page/$pageNum 頁 $top $upPage $downPage $foot
EOT;
}
return $back;
}
}//end class
?>
以上就是PHP連接MSSQL方法的總結,
❻ php sql 查詢最後一條數據
SELECT * FROM 當前表
WHERE id = ( SELECT MAX( id ) FROM 當前表 WHERE userid= '10000' )
解釋一下:首先括弧里先查出此userid登錄的所有記錄,然後去max最大的id,最後把最大的id的記錄查出來,即檢索出上次此用戶登錄的信息
❼ 什麼是PHP 什麼是SQL
PHP 是一種伺服器端的,嵌入HTML的腳本語言。PHP區別其他像客戶端Javascript的地方是它的代碼在伺服器端執行.PHP能做什麼?
最低水平,PHP可以做任何其他CGI程序所能做的事,例如收集表格數據,生成動態頁面內容,或者收發cookies.可能最強大,最有意義的特性是PHP支持大范圍的資料庫.書寫一個支持資料庫的Web 頁面是難以置信的簡單.
下面是當前支持的資料庫:
Adabas D InterBase Solid
dBase mSQL Sybase
Empress MySQL Velocis
FilePro Oracle Unix dbm
Informix PostgreSQL
PHP通過協議也支持與其他服務的"交談",像IMAP, SNMP, NNTP, POP3, 甚至是 HTTP. 你也可以打開晦澀的 網路介面和其他協議交互.
PHP的簡要歷史
1994年秋季, Rasmus Lerdorf 開始構思 PHP. 早期的非發行版本被用在他的主頁上,以追蹤誰在看他的在線簡歷. 1995年年初第一版本出台,當時PHP只被認為是個人主頁開發工具.它由一個非常單純的只能理解很少數特殊宏的分析引擎和 一些用在主頁後端通用的工具組成.如留言簿,計數器和其他一些東西.這個分析器在1995年年中被重寫並被命名為 PHP/FI 第二版. FI來自 Rasmus 寫的另外一個包, 用於解釋 html 形式的數據.他結合了個人主頁工具腳本和形式解析器,並加 上mSQL支持.這樣就產生 PHP/FI 了. PHP/FI以令人驚奇的步調成長,人們開始把自己的代碼貢獻給它.
很難給出它的硬統計表,但可以估計在1996年末,整個世界至少有15,000個網站在用PHP/FI.到1997年年中,這個 數字已經超過50,000了. 而在此時PHP的發展也發生了變化.由Rasmus自己偏愛的和幾個人開發的項目變成一個更有組織的團 體成就.Zeev Suraski和Andi Gutmans重寫了解析器.這個新的解析器成為PHP版本3的基礎.許多有用的代碼從PHP/FI 繼承到PHP3,並且很多是完全重寫的.
今天(1999年年中)不管是PHP/FI或PHP3與很多商業產品捆綁在一塊,例如C2級強度的Web伺服器和紅帽子Linux. 根據NetCraft提供的數據推斷,保守估計全世界應用PHP的網站已超過150,000個.由此看來,它比在網際網路上運行Netscape 的旗艦企業伺服器的站點還多.
PHP 是一種用來製作動態網頁的伺服器端腳本語言。你通過PHP和HTML創建頁面。當訪問者打開網頁時,伺服器端便會處理 PHP 指令,然後把其處理結果送到訪問者的瀏覽器上面,就好像 ASP 或者是 ColdFusion 一樣。然而,PHP 跟 ASP 或 ColdFusion 不一樣的地方在於,它是跨平台的開放源代碼。PHP 可以在 Windows NT 以及很多不同的 Unix 版本中執行,它也可以被編譯為一個 Apache 模塊,或者是一個CGI二進制文件。當被編譯為 Apache 模快時,PHP 尤其輕巧方便。它沒有任何繁瑣程序所產生的負擔,因此可以很快的返回結果,同時也不需為了保持較小的伺服器內存映象,而去調整mod_perl。
1. 引言
SQL是什麼?
* SQL (Structured Query Language)代表結構化查詢語言。
* 當用戶發出一項查詢,便可從資料庫檔內獲得若干資料。這項查詢是根據用戶所提供的條件 (condition) 所作出的一項檢索。而 SQL則是一個可讓用戶把條件列明的查詢語言。這樣,用戶只須列明查詢的條件,而不須要實際知道有關的檢索方法。
* 一般的資料庫管理軟體系統 (DBMS) 都包含 SQL 功能。
SQL的概念
* 通過 SQL 指令,用戶先列出資料庫檔及查詢的條件, SQL 程序便會在這資料庫檔內檢查每筆記錄是否符合這項條件,並把有關的資料顯示出來。這個過程稱為檢索。 (見例 2)
* 用戶除了直接查問各筆記錄的資料外,也可查問統計數項,例如最大值、最小值、總和及平均值。
* 查詢所得的結果會以表格的形式顯示,用戶亦可指示 SQL 程序把結果貯存成為資料庫檔。
在 FoxPro 如何使用 SQL
* 使用 SQL,必須先把有關資料庫檔開啟。
* 用戶可使用指令視窗 (Command Window) 直接把指令輸入,亦可使用對話方塊把指令輸入。
* 若用戶選用字元串的完全配對時,便須輸入 SET ANSI ON。
2. SQL檢索指令的基本結構
一般語法 SELECT, ALL / DISTINCT, *,
AS, FROM, WHERE
比較 IN, BETWEEN, LIKE "% _"
群組 GROUP BY, HAVING,
COUNT( ), SUM( ), AVG( ), MAX( ), MIN( )
顯示次序 ORDER BY, ASC / DESC
邏輯運算符 AND, OR, NOT
輸出 INTO TABLE / CURSOR
TO FILE [ADDITIVE], TO PRINTER, TO SCREEN
聯合 UNION
簡稱:
expr = 表達式 expression, groupexpr = 群組表達式 group expression
col = 欄 column, comcol = 共同欄 common column
colname = 欄名 column name
nullval = 空值 null value
實例:學生個人資料
例子: 考慮以下貯存學生數據的資料庫檔 STUDENT. DBF:
(i) hcode 表示學生的社名(即紅黃藍綠四社)。
R = Red, Y = Yellow, B = Blue, G = Green
(ii) dcode 表示學生的居住地區碼。
eg. TST = 尖沙咀(Tsim Sha Tsui), MKK = 旺角(Mong Kok)
(iii) remission 表示學生是否享有學費減免:
.T. =享有學費減免, .F. = 沒有學費減免
(iv) mtest 貯存學生數學測驗的分數,滿分為100。
欄名 類型 欄寬 內容
id 數字 4 學生編號
name 字元 10 學生名字
dob 日期 8 出生日期
sex 字元 1 性別: M / F
class 字元 2 班別
hcode 字元 1 社名: R, Y, B, G
dcode 字元 3 地區碼
remission 邏輯 1 學費減免
mtest 數字 2 數學測驗分數
I 一般語法
SELECT ...... FROM ...... WHERE ......
SELECT [ALL / DISTINCT] expr1 [AS col1], expr2 [AS col2] ;
FROM tablename WHERE condition
– SQL 程序會從資料庫檔 tablename 選取符合條件的橫列 (row) 並以表格的格式顯示。
– 表達式 expr1, expr2 可以是 (1) 欄位,或 (2) 以函數和欄位組成的表達式。
– 而 col1, col2 是表達式 expr1, expr2 在輸出結果的表格內的欄名。
– 選項 DISTINCT 會把重覆出現的橫列刪去(即只顯示一次),而選項 ALL 則會把所有重覆的保留。
– 條件 condition 可以是 (1) 等式或不等式,或 (2) 字元串的比較,並使用邏輯運算符 AND, OR, NOT。
在使用SQL之前,開啟資料庫檔:
USE student
例 1 求出所有學生的資料。
SELECT * FROM student
注意: 1) 這個指令並不提出任何條件,所以把 WHERE 部分省去。
2) 在 SELECT 部分中使用 * 來表示揀選來源表格的所有欄。
3) 查詢所得的結果將貯存於一個暫時的表格內。
id
name dob sex class mtest hcode dcode remission
9801 Peter 06/04/86 M 1A 70 R SSP .F.
9802 Mary 01/10/86 F 1A 92 Y HHM .F.
9803 Johnny 03/16/86 M 1A 91 G SSP .T.
9804 Wendy 07/09/86 F 1B 84 B YMT .F.
9805 Tobe 10/17/86 M 1B 88 R YMT .F.
: : : : : : : : :
例 2 求出 1A 班學生的名字和社名。
SELECT name, hcode, class FROM student ;
WHERE class="1A"
注意: 這例使用條件 class="1A" 揀選 1A 班學生:SQL 程序會從來源表格中的每一橫列逐一地檢查是否符合這條件。然後 SQL 程序會根據 SELECT 的選項而保留這些橫列內的三欄,即 name, hcode 及 class。最後程序會把所得的結果貯存於一個暫時的表格內。
name
hcode class
Peter R 1A
Mary Y 1A
Johnny G 1A
Luke G 1A
Bobby B 1A
Aaron R 1A
: : :
例 3 求出紅社社員的居住地區。(hcode="R")
SELECT DISTINCT dcode FROM student ;
WHERE hcode="R"
注意: 若兩個或以上的學生居住於同一地區,使用選項 DISTINCT 便可把重覆的結果省去。
dcode
HHM
KWC
MKK
SSP
TST
YMT
例 4 求出 1B 班女生的名字和年齡。(准至一位小數)
SELECT name, ROUND((DATE( )-dob)/365,1) AS age FROM student ;
WHERE class="1B" AND sex="F"
注意: 1) 「1B 班女生」的條件包括兩部分:class="1B" 和 sex="F"。而這項條件必須同時符合,所以要使用邏輯運算符 AND。
2) 在這資料庫檔裏並沒有一欄直接貯存年齡,所以我們須要使用學生的出生日期 dob 來計算。首先,DATE( )-dob 表示該生的"日歲",再除 365 就變成"年歲"。再用選項 AS age 去說明該欄的名稱。
name
age
Wendy 12.1
Kitty 11.5
Janet 12.4
Sandy 12.3
Mimi 12.2
例 5 求出 1A 班沒有學費減免的學生的名字和編號。
SELECT name, id, class FROM student ;
WHERE class="1A" AND NOT remission
注意: 1) 這裏包括兩項條件:學生必須是 1A 班,而且沒有享有學費減免。 所以在 WHERE 部分中加上運算符 AND。
2) 因 remission 是一個邏輯欄位,所以可直接在邏輯表達式中使用 。在 remission 之前加上 NOT 便把意思相反。
name
id class
Peter 9801 1A
Mary 9802 1A
Luke 9810 1A
Bobby 9811 1A
Aaron 9812 1A
Ron 9813 1A
Gigi 9824 1A
: : :
II 比較
expr IN ( value1, value2, value3)
expr BETWEEN value1 AND value2
expr LIKE "%_"
– 在 WHERE 部分中,可使用以上的比較條款:
1) 若 expr 的值是相等於 value1, value2, value3 其中的一個時,條款 expr IN ( value1, value2, value3) 便會送回邏輯值 .T.。而 expr 可以是數值或字元串。
2) 若expr 是界乎於 value1 和 value2 之間,條款
expr BETWEEN value1 AND value2 便會送回邏輯值 .T.。
3) 若字元串 expr 符合 "%_" 的樣式,條款 expr LIKE "%_" 便會送回邏輯值 .T.。在樣式中, "%" 代表任何長度的字元串,而 "_" 則代表任何的單一字元。
例 6 求出所有出生於星期三或星期六的學生。
SELECT name, class, CDOW(dob) AS bdate FROM student ;
WHERE DOW(dob) IN (4,7)
注意: 學生若在星期三星期六齣生, DOW(dob) 使會送回 數值 4 或 7,所以用 IN (4,7) 來檢查。
name
class bdate
Peter 1A Wednesday
Wendy 1B Wednesday
Kevin 1C Saturday
Luke 1A Wednesday
Aaron 1A Saturday
: : :
例 7 求出所有不是在一月、三月、六月或九月出生的學生。
SELECT name, class, dob FROM student ;
WHERE MONTH(dob) NOT IN (1,3,6,9)
注意: 我們不想 MONTH(dob) = 1, 3, 6 或 9, 所以使用 NOT IN (1,3,6,9) 來檢查。
name
class dob
Wendy 1B 07/09/86
Tobe 1B 10/17/86
Eric 1C 05/05/87
Patty 1C 08/13/87
Kevin 1C 11/21/87
Bobby 1A 02/16/86
Aaron 1A 08/02/86
: : :
例 8 求出1A 班的學生名字,其數學測驗分數界乎於 80 至 90 分之間。
SELECT name, mtest FROM student ;
WHERE class="1A" AND mtest BETWEEN 80 AND 90
注意: 1) 這裏用了兩個條件:第一個是 class="1A",第二個是測驗分數界乎於 80 至 90 分之間。這兩個條件必須同時成立,所以須用 AND。
2) 測驗分數界乎於 80 至 90 分之間可用 mtest BETWEEN 80 AND 90 來表示。
name
mtest
Luke 86
Aaron 83
Gigi 84
例 9 求出所有學生其名字是以 "T" 為起首。
SELECT name, class FROM student ;
WHERE name LIKE "T%"
注意: 這裏所用的樣式是 "T%" ,這表示第一個字元必須是 "T" 而其後可以是任何的字元串。
name
class
Tobe 1B
Teddy 1B
Tim 2A
例10 求出所有紅社社員其名字的第二個字母是"a"。
SELECT name, class, hcode FROM student ;
WHERE name LIKE "_a%" AND hcode="R"
注意: 這裏所用的樣式是 "_a%" ,而其中的 "_" 符號代表任何單一字元,亦即第一個字元是任意的。第二個字元則必須是 "a",而其後的 "%" 代表任何的字元串。
name
class hcode
Aaron 1A R
Janet 1B R
Paula 2A R
III 群組
SELECT ...... FROM ...... WHERE condition ;
GROUP BY groupexpr [HAVING requirement]
群組函數: COUNT( ), SUM( ), AVG( ), MAX( ), MIN( )
–GROUP BY groupexpr 列出群組組成所依照的表達式。一般都是資料庫檔的一欄。
– WHERE condition 列出個別橫列所須符合的條件,而 HAVING requirement 則列出個別群組須符合的條件。
– 可使用以群組函數來計算統計數項:
COUNT( ): 記錄出現的目數
SUM( ): 總和
AVG( ): 平均值
MAX( ): 最大值
MIN( ): 最小值
例11 求出每一班的人數。
SELECT class, COUNT(*) FROM student
GROUP BY class
注意: 1) 使用 GROUP BY class, SQL 程序便會先把表格裏的橫列按照 class 排列起來。
2) 然後 SQL 程序會把相連的橫列依照 class 來群組。
3) 最後使用群組函數 COUNT(*) 去算數每組的數目。
class
cnt
1A 10
1B 9
1C 9
2A 8
2B 8
2C 6
例12 求出每一班的數學測驗平均分。
SELECT class, AVG(mtest) FROM student GROUP BY class
注意: SQL 程序會先依照 class 來群組,然後在每一組中計算該組的 mtest 平均值。
class
avg_mtest
1A 85.90
1B 70.33
1C 37.89
2A 89.38
2B 53.13
2C 32.67
例13 求出每一居住地區的女生數目。
SELECT dcode, COUNT(*) FROM student ;
WHERE sex="F" GROUP BY dcode
注意: 查詢的條件為 sex="F"。而 SQL 程序會先把符合這條件的橫列選出,然後把這些橫列依照 dcode 為群組。
dcode
cnt
HHM 6
KWC 1
MKK 1
SSP 5
TST 4
YMT 8
例14 求出每一區中一學生數學測驗的最高分及最低分。
SELECT MAX(mtest), MIN(mtest), dcode FROM student ;
WHERE class LIKE "1_" GROUP BY dcode
max_mtest
min_mtest dcode
92 36 HHM
91 19 MKK
91 31 SSP
92 36 TST
75 75 TSW
88 38 YMT
注意: 這例使用條件 class LIKE "1_" 來揀選每區的中一學生。
例15 列出每一班男生數學測驗的平均分,但男生人數不及三人的班則不計算在內。
SELECT AVG(mtest), class FROM student ;
WHERE sex="M" GROUP BY class HAVING COUNT(*) >= 3
注意: SQL 程序會先把符合個別條件 sex="M" 的橫列揀選出來,然後依照 class 來群組並計算每組的 mtest 平均值。最後 SQL 程序會檢查群組條件 COUNT(*) >= 3。(這例中 2C 班男生人數不及三人,所以並沒有在結果裏顯示出來。)
avg_mtest
class
86.00 1A
77.75 1B
35.60 1C
86.50 2A
56.50 2B
IV 顯示次序
SELECT ...... FROM ...... WHERE ...... GROUP BY ..... ;
ORDER BY colname ASC / DESC
– ORDER BY colname 控制結果的顯示序。而 colname 代表結果表格的一欄。而ASC = 升冪, DESC = 降冪。
例16 列出 1A 班男生的名字,並按名字序顯示。
SELECT name, id FROM student ;
WHERE sex="M" AND class="1A" ORDER BY name
name id name id
Peter
9801 Aaron 9812
Johnny 9803 Bobby 9811
Luke 9810 Johnny 9803
Bobby 9811 Luke 9810
Aaron 9812 Peter 9801
Ron 9813 Ron 9813
例17 列出 2A 班的學生資料,並按居住地區序顯示。
SELECT name, id, class, dcode FROM student ;
WHERE class="2A" ORDER BY dcode
name id class dcode
Jimmy 9712 2A HHM
Tim 9713 2A HHM
Samual 9714 2A SHT
Rosa 9703 2A SSP
Helen 9702 2A TST
Joseph 9715 2A TSW
Paula 9701 2A YMT
Susan 9704 2A YMT
例18 求出每區居住學生的人數,並按降冪顯示。
SELECT COUNT(*) AS cnt, dcode FROM student ;
GROUP BY dcode ORDER BY cnt DESC
cnt
docode
11 YMT
10 HHM
10 SSP
9 MKK
5 TST
2 TSW
1 KWC
1 MMK
1 SHT
例19 列出每社的男社員名字並按班別序顯示。(即社和班的兩層次序)
SELECT name, hcode, class FROM student ;
WHERE sex="M" ORDER BY hcode, class
注意: 這些橫列先按 hcode 排列(即第一層排列);而相同的 hcode,再按 class 次序顯示。
name hcode class
Bobby
B 1A
Teddy B 1B
Joseph B 2A
Zion B 2B
Leslie B 2C
Johnny G 1A
Luke G 1A
Kevin G 1C
George G 1C
: : :
: : :
V 輸出
INTO TABLE tablename
把查詢所得的結果貯存成資料庫檔。
INTO CURSOR temp
把查詢所得的結果暫時貯存於電腦的工作記憶裏。
TO FILE filename [ADDITIVE]
把查詢所得的結果貯存成文字檔。(additive = 附加)
TO PRINTER 輸出到列印機。
TO SCREEN 輸出到螢幕。
例20 按學生名字的降冪,列出學生的所有資料,並把結果貯存成資料庫檔NAME.DBF。
SELECT * FROM student ;
ORDER BY name DESC INTO TABLE name.dbf
注意: 1) INTO TABLE name.dbf 要求 SQL 程序把結果貯存成檔案。
2) 這指令相等於資料庫指令 SORT。
3) SQL 程序會把結果貯存成一個新的資料庫檔 name.dbf。
id
name dob sex class mtest hcode dcode remission
9707 Zion 07/29/85 M 2B 51 B MKK .F.
9709 Yvonne 08/24/85 F 2C 10 R TST .F.
9804 Wendy 07/09/86 F 1B 84 B YMT .F.
9819 Vincent 03/15/85 M 1C 29 Y MKK .F.
9805 Tobe 10/17/86 M 1B 88 R YMT .F.
9713 Tim 06/19/85 M 2A 91 R HHM .T.
9816 Teddy 01/30/86 M 1B 64 B SSP .F.
:
: : : : : : : :
例21 按社員的班別、性別及名字的次序,把紅社社員的資料列印出來。
SELECT class, name, sex FROM student ;
WHERE hcode="R" ;
ORDER BY class, sex DESC, name TO PRINTER
注意: 1) 這指令要求程序先找出綠社社員,然後把這些橫列以 class, sex 和 name 的次序排列。
2) SQL 程序先把查詢的結果暫時貯存於工作記憶裏,然後把這結果輸出到列印機。
class
name sex
1A
Aaron M
1A
Peter M
1A Ron M
1B Tobe M
1B Janet F
1B Kitty F
1B
Mimi F
: : :
3. 資料庫聯合、相交及差分
考慮兩個結構相同的資料庫檔 A 和 B。
A 和 B 的聯合
(A B) union
檢取屬於 A 或 B 的所有橫列。
A 和 B 的相交
(A B) intersection
檢取 A 和 B 所共有的橫列。
A 和 B 的差分
(A–B) difference 檢取只屬於 A 而不屬於 B 的橫列。(即從 A 把 B 的部分排出)
SELECT ...... FROM ...... WHERE ...... ;
UNION ;
SELECT ...... FROM ...... WHERE ......
SELECT ...... FROM table1 ;
WHERE col IN ( SELECT col FROM table2 )
SELECT ...... FROM table1 ;
WHERE col NOT IN ( SELECT col FROM table2 )
實例:橋牌會和棋藝會
考慮學校橋牌會和棋藝會的會員,他們的資料分別貯存於同一結構的資料庫檔 BRIDGE.DBF 和 CHESS.DBF 內:
欄名 類型 欄寬 內容
id 數字 4 學生編號
name 字元 10 學生名字
sex 字元 1 性別: M / F
class 字元 2 班別
Bridge [A] Chess [B]
id name sex class id name sex class
1 9812 Aaron M 1A 1 9802 Mary F 1A
2 9801 Peter M 1A 2 9801 Peter M 1A
3 9814 Kenny M 1B 3 9815 Eddy M 1B
4 9806 Kitty F 1B 4 9814 Kenny M 1B
5 9818 Edmond M 1C 5 9817 George M 1C
: : : : : : : :
在使用SQL之前,開啟這兩個資料庫檔:
SELECT A
USE bridge
SELECT B
USE chess
例22 本校計劃舉行一次 "棋橋活動",所有棋藝會和橋牌會的會員必須出席。試以班別和名字的次序,列出兩會會員的名單。(即兩會的聯合)
SELECT * FROM bridge ;
UNION ;
SELECT * FROM chess ;
ORDER BY class, name INTO TABLE party
注意: 所要求的是兩會的所有會員,這便是兩會的聯合。
Party
id name sex class
1 9812 Aaron M 1A
2 9802 Mary F 1A
3 9801 Peter M 1A
4 9815 Eddy M 1B
5 9814 Kenny M 1B
6 9806 Kitty F 1B
7 9818 Edmond M 1C
8 9817 George M 1C
: : : :
例23 列印兩會的共同會員。(即兩會的相交)
SELECT * FROM bridge ;
WHERE id IN ( SELECT id FROM chess ) ;
TO PRINTER
注意: 這例須找出兩會所共通的會員。SQL 程序須檢查橋牌會的每一個會員是否也屬於棋藝會。若是屬於的話,這人便符合這個要求了。
Common
id name sex class
1 9801 Peter M 1A
2 9814 Kenny M 1B
: : : :
例24 求出只參加了橋牌會的會員名單。(即兩會之差分)
SELECT * FROM bridge ;
WHERE id NOT IN ( SELECT id FROM chess ) ;
INTO TABLE diff
注意: 1) 這例須從橋牌會中揀選那些並不屬於棋藝會的人。所以 SQL 程序須使用 FROM bridge,即從逐一檢查橋牌會的會員是否屬於棋藝會,若不屬於的話,這人便符合這個要求了。
2) "差分"不是對稱的:若想找出"只參加了棋藝會的會員名單",其結果則會完全不同。
Diff
Id name sex class
1 9812 Aaron M 1A
2 9806 Kitty F 1B
3 9818 Edmond M 1C
: : : :
4. 多個資料庫
當所查詢的資料貯放於兩個資料庫檔時,就須使用接合 (join)。 接合的作用是把一個資料庫檔內的一個橫列與另一個資料庫檔內的橫列連合起來,從而把所有不同的組合列出來。 (數學: Cartesian Proct)
自然接合
* 在接合中加上一項接合條件,要求兩檔的共通欄(common column)的值是相同,這稱為自然接合。這目的是要把這兩檔的相關資料連合起來,變成一個合一的大表格,再從這表格中執行查詢工作。
考慮以下兩個資料庫檔 T1 和 T2:
SELECT a.comcol, a.col1, b.col2, expr1, expr2 ;
FROM table1 a, table2 b ;
WHERE a.comcol = b.comcol
– 在自然接合中,這兩個資料庫檔須要有一個欄是相同的,這一欄稱為共通欄 。SQL 程序會先把這兩檔的所有組合列出,然後從中揀選共通欄的值是相同的橫列。
– a 和 b 分別是 table1 和 table2的代號,用以指明各欄所屬的檔。
– 表達式 expr1, expr2 可以使用 table1 和 table2內的各欄。
實例:樂器班
學校規定每個學生都須要學習一件樂器。現在使用資料庫檔 MUSIC.DBF 貯存學生所學的樂器名稱 (而學生的其他資料則貯存於 STUDENT.DBF 內)
欄名 類型 欄寬 內容
id 數字 4 學生編號
type 字元 10 樂器名稱
例25 列出所有學生的名字及所學習的樂器名稱。
SELECT s.class, s.name, s.id, m.type FROM student s, music m ;
WHERE s.id=m.id ORDER BY class, name
注意: 1) 這裏用了s 代表 student.dbf 而 m 代表 music.dbf。
2) 接合條件是 s.id=m.id,表示兩檔的橫列須要依照 id 而接合。
class
name id type
1A Aaron 9812 Piano
1A Bobby 9811 Flute
1A Gigi 9824 Recorder
1A Jill 9820 Piano
1A Johnny 9803 Violin
1A Luke 9810 Piano
1A Mary 9802 Flute
: : : :
例26 求出每班學習鋼琴的學生數目。
SELECT s.class, COUNT(*) FROM student s, music m ;
WHERE s.id=m.id AND m.type="Piano" ;
GROUP BY class ORDER BY class
注意: 1) 裏先首先用了接合條件 s.id=m.id 把兩檔自然接合起來。
2) SQL 程序然後從接合的結果(表格形式)中再揀選去符合條件 m.type="Piano" 的橫列。
3) 最後 SQL 程序會依照 class 而群組,並數算每班的數目。
class cnt
1A 4
1B 2
1C 1
外接合
* 外接合是自然接合再加上沒有配合的部分。
SELECT a.common, a.column1, b.column2, expr1, expr2 ;
FROM table1 a, table2 b ;
WHERE a.comcol = b.comcol ;
UNION ;
SELECT comcol, col1, nullval, nullval, nullval ;
FROM table1 ;
WHERE a.comcol NOT IN ( SELECT comcol FROM table2 )
– 外接合的指令包括兩個 SELECT 部分,再以 UNION 聯會起來。
– 第一部分是自然接合(即成功接合),第二部分則是沒有配合(即是在第一部分不能自然接合的橫列)。
– 為了使第二部分與第一部分的結構一樣,第二部分中沒有數值的位置須填上空值 (null value),即空字元串""、數值零、 邏輯值 .F. 或空日期 { / / } 。
例27 列出尚未選擇樂器的學生名字。(即沒有相配)
SELECT class, name, id FROM student ;
WHERE id NOT IN ( SELECT id FROM music ) ;
ORDER BY class, name
注意: 1) 這指令會從 student.dbf 中選出那些在另一檔 music.dbf 沒有配合的橫列。
2) ( SELECT id FROM music) 選出那些在資料庫檔 music.dbf 出現的 id,所以條件 id NOT IN (...) 能檢索出沒有配對的橫列。
class
name id
1A Mandy 9821
1B Kenny 9814
1B Tobe 9805
1C Edmond 9818
1C George 9817
: : :
例28 列出一份名單,去查核所有學生學習的樂器。名單須包括尚未參加樂器班的學生名字。(即外接合)
SELECT s.class, s.name, s.id, m.type ;
FROM stu