本文目錄一覽:
- 1、資料庫中的笛卡爾積,有A{name,age,salary},B{number,custname,Aname,amount}兩個表,如何實現笛卡爾積
- 2、哪裡有php測試題?帶答案的
- 3、2個表的笛卡爾積怎麼用sql語句表示
- 4、mysql 怎麼才能做到rownumber序號
- 5、left join 一對多,左表怎麼只取一行?
- 6、資料庫笛卡爾積
資料庫中的笛卡爾積,有A{name,age,salary},B{number,custname,Aname,amount}兩個表,如何實現笛卡爾積
笛卡爾積不需要關係。比如這個有AB倆個表,A有3列B有4列,如果用笛卡爾積運算的話結果就有12列。笛卡爾積一般實際用不到,做測試數據用的多。
哪裡有php測試題?帶答案的
1、用PHP列印出前一天的時間,格式是2006-5-10 22:21:21
?php
//echo date(‘Y-m-d H:i:s’,time()-60*60*24
echo date(“Y:m:d H:i:s”,strtotime(“-1 day”));
?
2、echo(),print(),print_r()的區別
echo是語言結構,無返回值;print功能和echo基本相同,不同的是print是函數,有返回值;print_r是遞歸列印,用於輸出數組對象
3、能夠使HTML和PHP分離開使用的模板
so much,其實PHP本身就是一種模版引擎,我用過的是smarty,常見的還有PHPLib,FastTemplate,Savant這裡有個模板引擎列表:
4.如何實現PHP、JSP交互?
題目有點含糊不清,SOAP,XML_RPC,Socket function,CURL都可以實現這些,如果是考PHP和Java的整合,PHP內置了這種機制(如果考PHP和.NET的整合,也可以這麼回答),例如$foo = new Java(‘java.lang.System’);
5.使用哪些工具進行版本控制?
CVS和SVN,SVN號稱下一代CVS,功能強大,不過CVS是老牌,市佔率很高.我一直用SVN,題目是問用什麼工具,呃,這個可能需要這麼回答:CVS Server on Apache作服務端,WinCVS作客戶端;Subversion on Apache/DAV 做服務端,TortoiseSVN做客戶端,或者Subclipse做客戶端
6.如何實現字元串翻轉?
?php
function reverse($var)
{
$res=””;
for($i=0,$j=strlen($var);$i$j;$i++)
{
$res=$var[$i].$res;
}
return $res;
}
$tmpvar=”wofang”;
$res=reverse($tmpvar);
echo $res;
?
7、優化MYSQL資料庫的方法。
(1).資料庫設計方面,這是DBA和Architect的責任,設計結構良好的資料庫,必要的時候,去正規化(英文是這個:denormalize,中文翻譯成啥我不知道),允許部分數據冗餘,避免JOIN操作,以提高查詢效率
(2).系統架構設計方面,表散列,把海量數據散列到幾個不同的表裡面.快慢表,快表只留最新數據,慢表是歷史存檔.集群,主伺服器Read write,從伺服器read only,或者N台伺服器,各機器互為Master
(3).(1)和(2)超越PHP Programmer的要求了,會更好,不會沒關係.檢查有沒有少加索引
(4).寫高效的SQL語句,看看有沒有寫低效的SQL語句,比如生成笛卡爾積的全連接啊,大量的Group By和order by,沒有limit等等.必要的時候,把資料庫邏輯封裝到DBMS端的存儲過程裡面.緩存查詢結果,explain每一個sql語句
(5).所得皆必須,只從資料庫取必需的數據,比如查詢某篇文章的評論數,select count(*) … where article_id = ? 就可以了,不要先select * … where article_id = ?然後msql_num_rows.
只傳送必須的SQL語句,比如修改文章的時候,如果用戶只修改了標題,那就update … set title = ? where article_id = ?不要set content = ?(大文本)
(6).必要的時候用不同的存儲引擎.比如InnoDB可以減少死鎖.HEAP可以提高一個數量級的查詢速度
8、談談事務處理
A給B的賬戶轉賬50美元的例子
9、apache+mysql+php實現最大負載的方法
見7
10.實現中文字串截取無亂碼的方法。
mb_substr()
11.
?php
$empty = ”;
$null = NULL;
$bool = FALSE;
$notSet;
$array = array();
//以下是問題
$a = “hello”;
$b = $a;
unset($b);
$b = “world”;
//答案為:hello
echo $a;
?
12.
?php
$empty = ”;
$null = NULL;
$bool = FALSE;
$notSet;
$array = array();
//以下是問題
$a = 1;
$x = $a;
$b = $a++;
//以下為答案:1
echo $b;
?
13
?php
$empty = ”;
$null = NULL;
$bool = FALSE;
$notSet;
$array = array();
//以下是問題
$x = empty($array);
//以下為答案:true
echo $x?”true”:”false”;
?
14、用PHP寫出顯示客戶端IP與伺服器IP的代碼:
?php
$ip=gethostbyname (“”);
echo $ip;
?
2個表的笛卡爾積怎麼用sql語句表示
第一個表的行數乘以第二個表的行數等於笛卡爾積結果集的大小
SELECT * FROM table1 CROSS JOIN table2
select a.*,b.* from table1 a ,table2 b
笛卡爾乘積是指在數學中,兩個 集合 X和 Y的笛卡尓積(Cartesian product),又稱 直積。
表示為 X × Y,第一個對象是 X的成員而第二個對象是 Y的所有可能 有序對的其中一個成員。
假設集合A={a, b},集合B={0, 1, 2},則兩個集合的笛卡爾積為{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
類似的例子有,如果A表示某學校學生的集合,B表示該學校所有課程的集合,則A與B的笛卡爾積表示所有可能的選課情況。A表示所有聲母的集合,B表示所有韻母的集合,那麼A和B的笛卡爾積就為所
mysql 怎麼才能做到rownumber序號
1. 直接在程序中實現;
這應該算是效率最高的一種,也極為方便。直接在你的開發程序中(PHP/ASP/C/…)等中,直接初始化一個變數nRowNum=0,然後在while 記錄集時,nRowNum++; 然後輸出即可。
2. 使用MySQL變數;在某些情況下,無法通過修改程序來實現時,可以考慮這種方法。
缺點,@x 變數是 connection 級的,再次查詢的時候需要初始化。一般來說PHP等B/S應用沒有這個問題。但C/S如果connection一隻保持則要考慮 set @x=0
mysql select @x:=ifnull(@x,0)+1 as rownum,id,col
– from tbl
– order by col;
+——–+—-+——+
| rownum | id | col |
+——–+—-+——+
| 1 | 1 | 26 |
| 1 | 3 | 35 |
| 1 | 2 | 46 |
| 1 | 4 | 68 |
| 1 | 6 | 92 |
| 1 | 5 | 93 |
+——–+—-+——+
6 rows in set (0.00 sec)
3. 使用聯接查詢(笛卡爾積)
缺點,顯然效率會差一些。
利用表的自聯接,代碼如下,你可以直接試一下 select a.*,b.* from tbl a,tbl b where a.col=b.col 以理解這個方法原理。
mysql select a.id,a.col,count(*) as rownum
– from tbl a,tbl b
– where a.col=b.col
– group by a.id,a.col;
+—-+——+——–+
| id | col | rownum |
+—-+——+——–+
| 1 | 26 | 1 |
| 2 | 46 | 3 |
| 3 | 35 | 2 |
| 4 | 68 | 4 |
| 5 | 93 | 6 |
| 6 | 92 | 5 |
+—-+——+——–+
6 rows in set (0.00 sec)
4. 子查詢
缺點,和聯接查詢一樣,具體的效率要看索引的配置和MySQL的優化結果。
mysql select a.*,
– (select count(*) from tbl where col=a.col) as rownum
– from tbl a;
+—-+——+——–+
| id | col | rownum |
+—-+——+——–+
| 1 | 26 | 1 |
| 2 | 46 | 3 |
| 3 | 35 | 2 |
| 4 | 68 | 4 |
| 5 | 93 | 6 |
| 6 | 92 | 5 |
+—-+——+——–+
6 rows in set (0.06 sec)
做為一款開源的資料庫系統,MySQL無疑是一個不做的產品。它的更新速度,文檔維護都不遜於幾大商業資料庫產品。估計在下一個版本中,我們可以看到由MySQL自身實現的ROWNUM。
left join 一對多,左表怎麼只取一行?
簡單說明問題出現的原因:MySQL left join 語句格式為:left join 是以A表為基礎,A表即左表,B表即右表。左表(A)的記錄會全部顯示,而右表(B)只會顯示符合條件表達式的記錄,如果在右表(B)中沒有符合條件的記錄,則記錄不足的地方為NULL。使用left join, A表與B表所顯示的記錄數為 1:1 或 1:0,A表的所有記錄都會顯示,B表只顯示符合條件的記錄。但如果B表符合條件的記錄數大於1條,就會出現1:n的情況,這樣left join後的結果,記錄數會多於A表的記錄數。所以解決辦法 都是從一個出發點出發,使A表與B表所顯示的記錄數為 1:1對應關係。解決方法:使用非唯一標識的欄位做關聯1?DISTINCTDISTINCT查詢結果是 第一個表唯一的數據 重複的結果沒顯示出來2 GROUP BY拿出b表的一條數據關聯 使A表與B表所顯示的記錄數為 1:1對應關係。3 max取唯一拿出b表的最後一條數據關聯4 IN巧用相信對於熟悉SQL的人來說,LEFT JOIN非常簡單,採用的時候也很多,但是有個問題還是需要注意一下。假如一個主表M有多個從表的話A B C …..的話,並且每個表都有篩選條件,那麼把篩選條件放到哪裡,就得注意嘍。比如有個主表M,卡號是主鍵。有個從表A,客戶號、聯繫方式是聯合主鍵,其中聯繫方式,1-座機,2-手機號碼如果想要查詢所有卡號對應的手機號碼兩個欄位,很簡單,SQL語句如下:相信很多人這樣寫,估計實際工作中也會看到這樣的語句,並不是說這麼寫一定會錯誤,實際SQL表達的思想一定是要符合業務邏輯的。前面已經說清楚,所有卡號對應的手機號碼。所有卡號,所以首先肯定以A表作為主表,並且左關聯B表,這樣A表所有的卡號一定會顯示出來,但是如果B表的篩選條件放到最外層,這樣就相當於將A表關聯B表又做了一遍篩選,結果就是就會篩選出來這麼一條數據,丟失了A表中其他的卡號。實際工作中表結構肯定沒這麼簡單,關聯的表也會很多,當有很多條件時,最好這麼寫這麼寫的話,A表中的數據肯定會完全保留,又能與B表的匹配,不會丟失數據。PS:表結構Left JoinRight JoinInner Join表的關聯修改和刪除笛卡爾積1、表結構表A
2、Left Join示例:2.1
left join是以A表的記錄為基礎的,A可以看成左表,B可以看成右表,left join是以左表為準的。換句話說,左表A的記錄將會全部表示出來,而右表B只會顯示符合搜索條件的記錄(例子中為: A.aid = B.bid),B表記錄不足的地方均為NULL.A表所有記錄都會顯示,A表中沒有被匹配的行(如aid=5、6的行)相應內容則為NULL。返回的記錄數一定大於A表的記錄數,如A表中aid=7行被B表匹配了3次(因為B表有三行bid=7)。注意:在Access中A.aid、B.bid不能縮寫成aid、bid,否則會提示「不支持鏈接表達式」,這一點不同於Where查詢。3、Right Join示例:3.1
仔細觀察一下,就會發現,和left join的結果剛好相反,這次是以右表(B)為基礎的,A表不足的地方用NULL填充。4、Inner Join示例:4.1這裡只顯示出了 A.aid = B.bid的記錄.這說明inner join並不以誰為基礎,它只顯示符合條件的記錄。inner join 等同於Where查詢如:5、表的關聯修改和刪除5.1修改示例:5.1.1
上述SQL實際操作的表為”Select * From A left join B on A.aid = B.bid”,因此Access會提示更新13條記錄(Select查詢出的記錄就是13條)。對比「示例:2.1」返回的結果,分析update後的A表:aid=5、6的記錄,被更新為NULLaid=7的記錄,被更新了3次,依次是「b1997-1」、「b1997-2」、「b1997-3」,因此其結果為最後一次更新「b1997-3」對於上述SQL同樣可以將「A.aname = B.bname」改成「B.bname = A.aname」,執行後B表將會被修改,但是執行後B表會增加三行「0, a2005-1;0, a2005-2;0, a2006」,這也不難理解,因為Left Join執行後,B表會出現三行空值。示例:5.1.2Where條件查詢在上面的SQL中同樣可以使用,其作用的表也是Select查詢出的關聯表。如下SQL執行後A表的結果:
對比第一次update可以發現,aid=5的並沒有被更新。這裡只講述left join,因為right join 和 inner join的處理過程等同於left join。另外Access中update語句中不能含有From關鍵字,這一點不同於其他資料庫。5.2刪除在Access中是不可以通過Left Join、Right Join、Inner Join來刪除某張表的記錄示例:5.2.2上述SQL的本意是刪除A表中aid=1的記錄,但執行後表A和表B均未發生任何變化。若想實現此目的,下述SQL可以實現6、笛卡爾積如果A表有20條記錄,B表有30條記錄,則二者關聯後的笛卡爾積工條記實錄。也就是說A表中的每條記錄都會於B表的所有記錄關聯一次,三種關聯方式實際上就是對「笛卡爾積」的處理方式不同。ENDPHP開源社區掃描關注? 進入」PHP資料「免費獲取進階面試、文檔、視頻資源? ?
資料庫笛卡爾積
所謂笛卡爾積,通俗點說就是指包含兩個集合中任意取出兩個元素構成的組合的集合.
舉例子,假設R中有元組M個,S中有元組N個,則R和S的笛卡爾積中包含的元組數量就是M*N.這個規則可以向多個關係擴展.
上面的例子的笛卡爾積結果就是tj_angela給出的(ac,ad,bc,bd)
屬於的含義就是R是d1*d2*……*dn子集,這裡其實是相等的.
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/231712.html