sql優化的操作

2021-09-29 19:36:56 字數 4175 閱讀 9118

今天公司開了個會,具體的是乙個技術交流會,主要針對的sql優化這方面的,還真是讓學到了不少:主要有下面這些

left join 是left outer join的簡寫,它的全稱是左外連線,是外連線中的一種。

左(外)連線,左表(a_table)的記錄將會全部表示出來,而右表(b_table)只會顯示符合搜尋條件的記錄。右表記錄不足的地方均為null

1.用左表的第一行分別和右表的所有行進行聯接,  如果有匹配的行,則一起輸出,如果右表有多行匹配,則結果集輸出多行,如果沒有匹配行,則結果集中只輸出一行,該輸出行左邊為左表第一行內容,右邊全部輸出null

2.然後再用左表第二行和右邊所有行進行聯接,如果有匹配的行,則一起輸出,如果右表有多行匹配,則結果集輸出多行,  如果沒有匹配行,則結果集中只輸出一行,該輸出行左邊為左表第二行內容,右邊全部輸出null

3.以此類推,直至左邊所有行連線完畢

4.因為右邊很可能出現有多行和左邊的某一行匹配,所以左聯接產生的結果集的行數很可能大於left join左邊表的記錄的總數

select

agencies.*,

from

authentication_user au

left join agencies_agencyuser ag on ag.userid = au.id

left join agencies_agency agencies on agencies.id = ag.agencyid

where

au.email = '[email protected]'

//結果:

​2019-08-06 11:22:26.497 1bce1865-970c-4e60-9ce9-63d2d6941f01 0 北大西洋教育 0 9b075bfc-4475-45a5-b6b3-878c3bbed701 2019-08-06 11:22:26.497

可以理解為在在左表+包含的為左連線的即綠色+黃色的模組,即為左連線的結果

right join是right outer join的簡寫,它的全稱是右外連線,是外連線中的一種。

與左(外)連線相反,右(外)連線,左表(a_table)只會顯示符合搜尋條件的記錄,而右表(b_table)的記錄將會全部表示出來。左表記錄不足的地方均為null

select

agencies.*

from

authentication_user au

right join agencies_agencyuser ag on ag.userid = au.id

right join agencies_agency agencies on agencies.id = ag.agencyid

where

au.email = '[email protected]'

//結果:

​2019-08-06 11:22:26.497 1bce1865-970c-4e60-9ce9-63d2d6941f01 0 北大西洋教育 0 9b075bfc-4475-45a5-b6b3-878c3bbed701 2019-08-06 11:22:26.497

這樣的結果和左連線的結果一樣。

說明:組合兩個表中的記錄,返回關聯字段相符的記錄,也就是返回兩個表的交集(陰影)部分。

select * from a_table a inner join b_table bon a.a_id = b.b_id;

//右連線

select column_name(s)

from table_name1

right join table_name2

on table_name1.column_name=table_name2.column_name

//左連線

select column_name(s)

from table_name1

left join table_name2

on table_name1.column_name=table_name2.column_name

// 內連線

select column_name(s)

from table_name1

inner join table_name2

on table_name1.column_name=table_name2.column_name

//select into 語句從乙個表中選取資料,然後把資料插入另乙個表中。

//select into 語句常用於建立表的備份復件或者用於對記錄進行存檔。

select persons.lastname,orders.orderno

into persons_order_backup

from persons

inner join orders

on persons.id_p=orders.id_p

在表中,可能會包含重複值。這並不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。

select distinct 列名稱 from 表名稱
優化思路:

•優化後的確認

繫結變數形式:

preparedstatement pstmt = con.preparestatement("update employees set salay = ? where id = ?"); pstmt.setbigdecimal(1, 15.00);

pstmt.setint(2, 110592);

//result statmement:   update employees set salay = 15.00 where id = 110592 pstmt.executequery();

//其實使用 mybatis 我們在不知不覺中就使用量繫結變數的方式執行 sql。這涉及 mybatis 中 『#』 和 『$ 『的區別。mybatis 在對 sql 語句進行預編譯之前,會對 sql 進行動態解析,解析為乙個 boundsql 物件,也是在此處對動態 sql 進行處理的。在動態 sql 解析階段, # 和 $ 會有不同的表現。比如同一條 sql

select * from dual where t = #

// #{} 在動態解析的時候, 會解析成乙個引數標記符。就是解析之後的語句是:

select * from dual where t = ?

//這就和 jdbc 繫結變數的方式一樣了。而

select * from dual where t = $

//${}在動態解析的時候,會將我們傳入的引數當做string字串填充到我們的語句中,就會變成下面的語句

select * from dual where t = '引數'

//預編譯之前的 sql 語句已經不包含變數了,完全已經是常量資料了。相當於我們普通沒有變數的sql了。

//綜上所得, $ 變數的替換階段是在動態 sql 解析階段,而 #變數的替換是在 dbms 中。

什麼時候不用繫結變數:在使用時,select sname,from student where exists (select * from sc where sno=student.sno and cno='1'),這裡使用了exists字句,若內層的查詢結果為空,則外層的where字句返回真值,否則為假,這裡引出子查詢用了*因為exists的子查詢只返回真與假給出列無實際意義。

union 操作符用於合併兩個或多個 select 語句的結果集。

請注意,union 內部的 select 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每條 select 語句中的列的順序必須相同。

預設地,union 操作符選取不同的值。如果允許重複的值,請使用 union all。

union all 命令和 union 命令幾乎是等效的,不過 union all 命令會列出所有的值,並且允許重複

有了以上的這些的規範相信在以後的開發中會少走一些彎路,這是其中的一則後序如果有會繼續更新。

sql優化操作

insert優化 1,當同乙個使用者插入很多行的時候,應該盡量使用多個表的insert語句,這種方式將大大減少客戶端與資料庫之間的連線,關閉等等消耗,因為每一次插入資料都會執行連線資料庫,關閉資料庫等等操作 如下 insert into test valus 1,2 3,4 5,6 7,8 2,如果...

SQL操作符的優化

in 操作符 用in寫出來的sql的優點是比較容易寫及清晰易懂,這比較適合現代軟體開發的風格。但是用in的sql效能總是比較低的,從oracle執行的步驟來分析用in的sql與不用in的sql有以下區別 oracle試圖將其轉換成多個表的連線,如果轉換不成功則先執行in裡面的子查詢,再查詢外層的表記...

SQL優化的具體操作

1 在表中建立索引,優先考慮where group by使用到的字段。2 盡量避免使用select 返回無用的字段會降低查詢效率。如下 select from t 優化方式 使用具體的字段代替 只返回使用到的字段。3 盡量避免使用in 和not in,會導致資料庫引擎放棄索引進行全表掃瞄。如下 se...