sql左起
⑴ sql左外連接和右外連接的區別
一、數據集合不同
1、左外連接:是A和B的交集再並上A的所有數據。
2、右外連接:是A和B的交集再並上B的所有數據。
二、語法不同
1、左外連接:SELECT *FROM aLEFT OUTER JOIN bON a.`ageId` = b.`id`。
2、右外連接:SELECT *FROM aright OUTER JOIN bON a.`ageId` = b.`id`。
三、運算方式不同
1、左外連接:其運算方式為:A左連接B的記錄=圖3公共部分記錄集C+表A記錄集A1。
2、右外連接:其運算方式為:A右連接B的記錄=圖3公共部分記錄集C+表B記錄集B1 。
⑵ SQL中統計字元串長度的函數是什麼
SQL中統計字元串長度的函數是:函數len(string)。
比如:
select len('abc')輸出3
select len('abcde')輸出5
字元串函數對二進制數據、字元串和表達式執行不同的運算。此類函數作用於CHAR、VARCHAR、 BINARY、 和VARBINARY 數據類型以及可以隱式轉換為CHAR 或VARCHAR的數據類型。可以在SELECT 語句的SELECT 和WHERE 子句以及表達式中使用字元串函數。
常用的字元串函數有:
ASCII():返回字元表達式最左端字元的ASCII 碼值。在ASCII()函數中,純數字的字元串可不用『』括起來,但含其它字元的字元串必須用『』括起來使用,否則會出錯。
CHAR():將ASCII 碼轉換為字元。如果沒有輸入0 ~ 255 之間的ASCII 碼值,CHAR() 返回NULL 。
LOWER()和UPPER():LOWER()將字元串全部轉為小寫;UPPER()將字元串全部轉為大寫。
STR():把數值型數據轉換為字元型數據。
STR (<float_expression>[,length[, <decimal>]])
length 指定返回的字元串的長度,decimal 指定返回的小數位數。如果沒有指定長度,預設的length 值為10, decimal 預設值為0。
當length 或者decimal 為負值時,返回NULL;
當length 小於小數點左邊(包括符號位)的位數時,返回length 個*;
先服從length ,再取decimal ;
當返回的字元串位數小於length ,左邊補足空格。
LTRIM() 把字元串頭部的空格去掉。
RTRIM() 把字元串尾部的空格去掉。
left():LEFT (<character_expression>, <integer_expression>)返回character_expression 左起 integer_expression 個字元。
RIGHT():RIGHT (<character_expression>, <integer_expression>)返回character_expression 右起 integer_expression 個字元。
SUBSTRING():SUBSTRING (<expression>, <starting_ position>, length)返回從字元串左邊第starting_ position 個字元起length個字元的部分。
CHARINDEX():返回字元串中某個指定的子串出現的開始位置。CHARINDEX (<』substring_expression』>, <expression>)
其中substring _expression 是所要查找的字元表達式,expression 可為字元串也可為列名表達式。如果沒有發現子串,則返回0 值。
此函數不能用於TEXT 和IMAGE 數據類型。
PATINDEX():返回字元串中某個指定的子串出現的開始位置。PATINDEX (<』%substring _expression%』>, <column_ name>)其中子串表達式前後必須有百分號「%」否則返回值為0。與CHARINDEX 函數不同的是,PATINDEX函數的子串中可以使用通配符,且此函數可用於CHAR、 VARCHAR 和TEXT 數據類型。
QUOTENAME():返回被特定字元括起來的字元串。QUOTENAME (<』character_expression』>[, quote_ character]) 其中quote_ character 標明括字元串所用的字元,預設值為「[]」。
REPLICATE():返回一個重復character_expression 指定次數的字元串。REPLICATE (character_expression integer_expression) 如果integer_expression 值為負值,則返回NULL 。
REVERSE():將指定的字元串的字元排列順序顛倒。REVERSE (<character_expression>) 其中character_expression 可以是字元串、常數或一個列的值。
REPLACE():返回被替換了指定子串的字元串。REPLACE (<string_expression1>, <string_expression2>, <string_expression3>) 用string_expression3 替換在string_expression1 中的子串string_expression2。
SPACE():返回一個有指定長度的空白字元串。SPACE (<integer_expression>) 如果integer_expression 值為負值,則返回NULL 。
STUFF():用另一子串替換字元串指定位置、長度的子串。
STUFF (<character_expression1>, <start_ position>, <length>,<character_expression2>):如果起始位置為負或長度值為負,或者起始位置大於character_expression1 的長度,則返回NULL 值。如果length 長度大於character_expression1 中 start_ position 以右的長度,則character_expression1 只保留首字元。
拓展資料:
SQL語言,是結構化查詢語言(Structured Query Language)的簡稱。SQL語言是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統;同時也是資料庫腳本文件的擴展名。
是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以具有完全不同底層結構的不同資料庫系統可以使用相同的結構化查詢語言作為數據輸入與管理的介面。SQL語言語句可以嵌套,這使他具有極大的靈活性和強大的功能。
⑶ sql中左連接是什麼意思啊,有什麼作用啊能否給個例子,謝謝大家
左連接:Left Join 或 Left Outer Join
--Student表
--
1張三25
2李四26
3無名氏27
--BorrowBook表
--
1馬克思主義政治經濟學電子工業出版社
2***思想概論高等教育出版社
--SQL語句
Select
Student.StudentName,
Student.StudentAge,
BorrowBook.BorrowBookName,
BorrowBook.BorrowBookPublish
FromStudent
LeftJOINBorrowBook
OnStudent.StudentID=BorrowBook.StudentID
--運行的結果如下:
---------------------------------------------------------------------------------
--張三25馬克思主義政治經濟學電子工業出版社
--李四26***思想概論高等教育出版社
--無名氏27NULLNULL
查詢的結果是以左表Student為主,Student對應的StudentID在右表BorrowBook如果不存在的話,就會用NULL值來代替。
⑷ SQL:左連接,右連接是什麼概念啊
SQL中左連接和右連接都屬於外連接。
左連接是LEFT JOIN或LEFT OUTER JOIN,左向外聯接的結果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。
右連接是RIGHT JOIN 或 RIGHT OUTER JOIN,右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
舉例:要查詢所有學生的選課情況,包括已經選課的和還沒有選課的學生,查詢語句為SELECT學生表.學號,姓名,班級,課程號,成績 FROM學生表LEFT OUTER JOIN選課表ON學生表.學號=選課表.學號,左外連接查詢中左端表中的所有元組的信息都得到了保留。
(4)sql左起擴展閱讀
連接查詢是關系資料庫中最主要的查詢,主要包括內連接、外連接和交叉連接等。聯接條件可在FROM或WHERE子句中指定,建議在FROM子句中指定聯接條件。WHERE和HAVING子句也可以包含搜索條件,以進一步篩選聯接條件所選的行。
內連接是INNERJOIN簡寫成JOIN,是典型的聯接運算,使用像 = 或 <> 之類的比較運算符。包括相等聯接和自然聯接。內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。
外聯接除了左右連接外,還有完整外部聯接FULL JOIN 或 FULL OUTER JOIN,完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。
交叉聯接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積。FROM 子句中的表或視圖可通過內聯接或完整外部聯接按任意順序指定;但是,用左或右向外聯接指定表或視圖時,表或視圖的順序很重要。
⑸ SQL中的左外連接和+號的用法
SQL中的左外連接和+號的用法
Oracle 左連接、右連接、全外連接、(+)號作用
Oracle 外連接
(1)左外連接 (左邊的表不加限制)
(2)右外連接(右邊的表不加限制)
(3)全外連接(左右兩表都不加限制)
外連接(Outer Join)
outer join則會返回每個滿足第一個(頂端)輸入與第二個(底端)輸入的聯接的行。它還返回任何在第二個輸入中沒有匹配行的第一個輸入中的行。外連接分為三種: 左外連接,右外連接,全外連接。 對應SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我們省略outer 這個關鍵字。 寫成:LEFT/RIGHT/FULL JOIN。
在左外連接和右外連接時都會以一張表為基表,該表的內容會全部顯示,然後加上兩張表匹配的內容。 如果基表的數據在另一張表沒有記錄。 那麼在相關聯的結果集行中列顯示為空值(NULL)。
對於外連接, 也可以使用「(+) 」來表示。 關於使用(+)的一些注意事項:
1.(+)操作符只能出現在where子句中,並且不能與outer join語法同時使用。
2. 當使用(+)操作符執行外連接時,如果在where子句中包含有多個條件,則必須在所有條件中都包含(+)操作符
3.(+)操作符只適用於列,而不能用在表達式上。
4.(+)操作符不能與or和in操作符一起使用。
5.(+)操作符只能用於實現左外連接和右外連接,而不能用於實現完全外連接。
在做實驗之前,我們先將dave表和bl里加一些不同的數據。 以方便測試。
SQL> select * from bl;
ID NAME
---------- ----------
1 dave
2 bl
3 big bird
4 exc
9 懷寧
SQL> select * from dave;
ID NAME
---------- ----------
8 安慶
1 dave
2 bl
1 bl
2 dave
3 dba
4 sf-express
5 dmm
2.1 左外連接(Left outer join/ left join)
left join是以左表的記錄為基礎的,示例中Dave可以看成左表,BL可以看成右表,它的結果集是Dave表中的數據,在加上Dave表和BL表匹配的數據。換句話說,左表(Dave)的記錄將會全部表示出來,而右表(BL)只會顯示符合搜索條件的記錄。BL表記錄不足的地方均為NULL.
示例:
SQL> select * from dave a left join bl b on a.id = b.id;
ID NAME ID NAME
--------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm -- 此處B表為null,因為沒有匹配到
8 安慶 -- 此處B表為null,因為沒有匹配到
SQL> select * from dave a left outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安慶
用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在右表,左表就是全部顯示,故是左連接。
SQL> Select * from dave a,bl b where a.id=b.id(+); -- 注意: 用(+) 就要用關鍵字where
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安慶
2.2 右外連接(right outer join/ right join)
和left join的結果剛好相反,是以右表(BL)為基礎的, 顯示BL表的所以記錄,在加上Dave和BL 匹配的結果。 Dave表不足的地方用NULL填充.
示例:
SQL> select * from dave a right join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧 --此處左表不足用Null 填充
已選擇7行。
SQL> select * from dave a right outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧 --此處左表不足用Null 填充
已選擇7行。
用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在左表,右表就是全部顯示,故是右連接。
SQL> Select * from dave a,bl b where a.id(+)=b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧
2.3 全外連接(full outer join/ full join)
左表和右表都不做限制,所有的記錄都顯示,兩表不足的地方用null 填充。 全外連接不支持(+)這種寫法。
示例:
SQL> select * from dave a full join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安慶
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
9 懷寧
已選擇9行。
SQL> select * from dave a full outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安慶
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
最初由 ghc_x 發布
[B]有兩個表T1和T2,兩個表除了主鍵索引外均無其他索引,這兩個表由T1.F1(主鍵),T2.F2(主鍵)進行左連接,SQL語句有兩種寫法:
1. SELECT * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
當查看1的執行計劃時發現T1為全表掃描,T2為索引掃描。
當查看2的執行計劃時發現兩個表均為全表掃描。
有人知道這是為什麼嗎? [/B]
我一直以來也是認為這兩種寫法是一樣的,沒想到樓主特意去看了它們的執行計劃,而且發現了它們的不同,這使得我比較驚訝。
按照書上的講法,這兩種寫法是沒有什麼區別的,後一種寫法只不過是前一種寫法的新版本。
為什麼兩者的執行計劃會不一樣呢?
我仔細看了一下兩者的執行計劃,發現了為什麼後一種要兩個表都全表 掃描,而前一個表有一個索引掃描。
原來前者選擇的優化器是RULE,而後者選擇的優化器是CBO的ALL ROWS。
不過,似乎要後者的效率高。
1. SELECT /*+RULE*/ * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT /*+RULE*/ * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
這樣再看下執行計劃吧