mysql連線查詢
連線查詢
交叉連線
交叉連線會返回被連線的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積。
交叉連線語法:
SELECT * FROM TABLE_A CROSS JOIN TABLE_B
SELECT * FROM TABLE_A JOIN TABLE_B
SELECT * FROM TABLE_A , TABLE_B
三種格式是等效的.
省略連線條件、連線條件無效、所有表中的所有行互相連線的情況下會產生笛卡兒積,為了避免笛卡爾集, 可以在 WHERE 加入有效的連線條件。
在表中有相同列時,在列名之前加上表名字首以明確區分。
表的別名
AS 可以省略
使用別名可以簡化查詢。
使用表名字首可以提高執行效率。
連線多個表
連線 n個表,至少需要 n-1個連線條件。
內連線:
合併具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行。
SELECT <列名>
FROM 表1 INNER JOIN 表2
ON 表1.列名 條件運算子 表2.列名
[WHERE 條件]
[ORDER BY 排序列]
其中“ON 表1.列名 條件運算子 表2.列名” 中,條件運算子常用的是:=、<>,>,<,>=,<=。
表1.列名和表2.列名,分別是兩個表的公共列。
外連線
——左外聯結 (LEFT JOIN)
——右外聯結 (RIGHT JOIN)
外連線與普通連線的區別
普通連線操作只輸出滿足連線條件的元組
外連線操作以指定表為連線主體,將主體表中不滿足連線條件的元組一併輸出:
左外連線:
左外連線使用LEFT JOIN連線兩表,連線時左表為主表,獲取左表所有記錄,左表中的每條記錄必定出現在結果集中,而在右表中沒有對應的記錄,將以NULL值進行填充。
SELECT * FROM TABLE_A
LEFT JOIN TABLE_B
ON 連線條件
[WHERE 條件]
算符常用的是:=、<>,>,<,>=,<=。
右外連線:
右外連線與與外連線相似,不同的是右表為主表,獲取右表所有記錄,右表中的每條記錄必定出現在結果集中,而在左表中沒有對應的記錄,將以NULL值進行填充。
SELECT * FROM TABLE_A
RIGHT JOIN TABLE_B
ON 連線條件
[WHERE 條件]
算符常用的是:=、<>,>,<,>=,<=。
內連線時,得到的結果是公有資料集C。
左外連線時,得到的是A1+C。
右外連線時,得到的是B1+C。
limit
限制由 SELECT 語句返回的資料數量,limit [offset,N]
offset可選,表示初始位置,預設為0
N,限制結果取N條 。 用法: limit [初始位置],取出條目
幾個常用的埠:
web 的埠 80,FTP的埠是 21,HTTP通訊用的埠號是80,mysql預設埠是3306,tomcat預設埠是8080。
JDBC
全稱為:Java DataBase Connectivity(java資料庫連線)。是訪問資料庫的一種技術
SUN公司為了簡化、統一對資料庫的操作,定義了一套jdbc介面,這套介面由資料庫廠商去實現,這樣,開發人員只需要學習jdbc介面,並通過jdbc載入具體的驅動,就可以操作資料庫。簡單的說,JDBC的意義在於在Java程式中執行SQL語句。
JDBC程式設計步驟:
1.載入註冊驅動類Driver
Class.forName(“com.mysql.jdbc.Driver”);
2.建立連線
Connection connection = DriverManager.getConnection(
“jdbc:mysql://localhost:3306/test“,”root”,”root”);
3操作資料
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT A_NAME FROM A”);
while (rs.next()) {
String name = rs.getString("A_NAME");
System.out.println(“name is:”+ name);
}
4.釋放資源
rs.close();
stmt.close();
connection.close();
注意新增try-catch-finally。
JDBC訪問資料庫的流程
載入註冊驅動程式Driver;
通過DriverManager類獲得表示資料庫連線的Connection類物件;
通過Connection物件繫結要執行的語句,生成Statement類物件;
執行SQL語句,接收執行結果集ResultSet;
可選的對結果集ResultSet類物件的處理;
必要的關閉ResultSet、Statement和Connection
Connection
常用方法:
createStatement():建立向資料庫傳送sql的statement物件
prepareStatement(sql) :建立向資料庫傳送預編譯sql的PreparedSatement物件
--- 儲存過程
setAutoCommit(boolean autoCommit):設定事務是否自動提交。
commit() :在連結上提交事務。 ---與事務相關!!
rollback() :在此連結上回滾事務。
Statement
executeQuery(String sql) :用於向資料傳送查詢語句。
executeUpdate(String sql):用於向資料庫傳送insert、update或delete語句
execute(String sql):用於向資料庫傳送任意sql語句
Jdbc中的statement物件用於向資料庫傳送SQL語句,想完成對資料庫的增刪改查,只需要通過這個物件向資料庫傳送增刪改查語句即可。
Statement物件的executeUpdate方法,用於向資料庫傳送增、刪、改的sql語句,executeUpdate執行完後,將會返回一個整數(即增刪改語句導致了資料庫幾行資料發生了變化)。
Statement.executeQuery方法用於向資料庫傳送查詢語句,executeQuery方法返回代表查詢結果的ResultSet物件。
SQL 注入是使用者利用某些系統沒有對輸入資料進行充分檢查,從而進行惡意破壞的行為。
1、statement存在sql注入攻擊問題:例如登陸密碼採用xxx' or '1'='1
2、對於防範 SQL 注入,可以採用PreparedStatement取代Statement。prepareCall(sql):建立執行儲存過程的callableStatement物件。)
PreparedStatement是Statement的子介面,它的例項物件可以通過呼叫Connection.preparedStatement(sql)方法獲得,相對於Statement物件而言:
PreperedStatement可以避免SQL注入的問題。
Statement會使資料庫頻繁編譯SQL,可能造成資料庫緩衝區溢位。PreparedStatement 可對SQL進行預編譯,從而提高資料庫的執行效率。
並且PreperedStatement對於sql中的引數,允許使用佔位符的形式進行替換,簡化sql語句的編寫。
ResultSet (結果集)
Jdbc程式中的ResultSet用於代表Sql語句的執行結果。Resultset封裝執行結果時,採用的類似於表格的方式。ResultSet 物件維護了一個指向表格資料行的遊標cursor,初始的時候,遊標在第一行之前,呼叫ResultSet.next() 方法,可以使遊標指向具體的資料行,進而呼叫方法獲取該行的資料。
ResultSet既然用於封裝執行結果的,所以該物件提供的大部分方法都是用於獲取資料的get方法
釋放資源
Jdbc程式執行完後,切記要釋放程式在執行過程中,建立的那些與資料庫進行互動的物件,這些物件通常是ResultSet, Statement和Connection物件。
特別是Connection物件,它是非常稀有的資源,用完後必須馬上釋放,如果Connection不能及時、正確的關閉,極易導致系統宕機。Connection的使用原則是儘量晚建立,儘量早的釋放。
為確保資源釋放程式碼能執行,資源釋放程式碼也一定要放在finally語句中。、
JavaEE模式-DAO 模式
Data Access Object 抽象並封裝了對底層資料來源的操作
封裝對於資料來源的操作
資料來源可能是檔案、資料庫等任意儲存方式
負責管理與資料來源的連線
負責資料的存取(CRUD)
不包含任何業務