1. 程式人生 > >mysql連線查詢

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物件。)

PreparedStatementStatement的子介面,它的例項物件可以通過呼叫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)

不包含任何業務