數據庫SQL的基礎知識
【補充數據庫基本知識點】
數據庫是按照一定的數據結構來組織、存儲和管理數據的倉庫
數據庫管理系統是一種操縱和管理數據庫的大型軟件,用於建立、使用和維護數據庫
1、數據庫表的完整性約束:域約束(表中字段取值范圍)、主碼約束(主鍵,唯一確定一條記錄)、外碼約束(表中一個字段,確實另外一張表的主碼)
用SQL語句生成外鍵:
//為foods表的CategoryId字段生成外鍵fk_Foods_Category
alter table foods add constraint fk_Foods_Category foreign key(CategoryId) references Category(id);
####-----增加外鍵的方法------#####
#######alter table 需加外鍵的表 add constraint 外鍵名 foreign key(需加外鍵表的字段名) referencnes 關聯表名(關聯字段名);#####
2、SQL語句補充
在描述SQL有關語句格式時,常常用到一些符號
[ ] :表示可選項,即方括號中內容可以根據需要進行選擇
{ } :表示必選項
<> :表示尖括號中的內容是用戶必須要提供的參數
| : 表示有多個選項時只能選擇一項,多個選項之間用 ‘ | ’隔開
[ , …n] : 表示前面的項可重復n次,相互之間用‘ ,’隔開
A、 創建數據庫的SQL命令
CREATE DATABASE<數據庫名>
Eg: CREATE DATABASE Student;//創建Student數據庫
B、 表的操作
(1)sql語句創建表
CREATE TABLE<表名>(<字段名><數據類型>[<字段完整性約束>],<字段名><數據類型>[<字段完整性約束>]…,<字段名><數據類型>[<字段完整性約束>]);
Eg:CREATE TABLE Students(sno CHAR(9) NOT NULL PRIMARY KEY,
sName CHAR(12) NOT NULL , sex CHAR(2) , age INT);
(2) 刪除表
DROP TABLE<表名>
(3)修改表結構
ALTER TABLE<表名>[ALTER COLUMN <字段名><數據類型>] |
ADD COLUMN 子句—增加新字段及相應的完整性約束條件
DROP COLUMN 子句 –刪除表中字段
DROP CONSTRAINT 子句—刪除完整性約束
Eg:
ALTER TABLE Student ADD COLUMN phone CHAR(11);
C、 表數據操作
(1) 插入數據:
INSERT INTO<表名>[(<字段名>[,<字段名>]…)] VALUES(<值>[,<值>]…)
Eg:
Insert into Student(sNO,sName,sex,age) values(‘201201009’,’隔壁老王’,‘男’,18);
(2) 修改數據
UPDATE <表名> SET <字段名>=<表達式>[,<字段名>==<表達式>[WHERE <條件>];
Eg:update Student set age=20 where sNO=‘201201009’;
(3) 刪除數據
DELETE FROM <表名>[WHERE <條件>]
Eg:delete from Student where sNo=’201201009’;
(4) 查詢數據
SELECT [ALL | DISTICT][TOP n [PERCENT]]{ * | {<字段名>|<表達式>|}
[[AS <別名>]|<字段名>[[AS] <別名>]][ , …n]}
FROM <表名>[WHERE <查詢條件表達式>]
[GROUP BY <字段名>[HAVING<分組條件>]]
[ORDER BY <次序表達式>[ASC | DESC]];
參數說明:
ALL—顯示結果集中的所有數據,包括重復行,ALL是默認設置
DISTINCT—顯示結果集中不重復的所有行
GROUP BY 子句—按照<字段名>進行分組,該字段值相同的分為一個組,分組后每組只顯示一個結果;如果GROUP BY子句帶HAVING 子句,則只有滿足HAVING指定條件的組才會輸出,有過GROUP BY 有多個字段名,則按照第一個字段分組,再按照第二個字段分組,以此類推
HAVING 子句---分組條件與WHERE 子句中的條件格式類似
ORDER By 子句---只有兩個結果一個是ASC升序(系統默認),一個DESC降序;ORDER BY子句需要放到查詢語句的最后
A、 簡單查詢
Eg:Select sNO as 學號,sName as 姓名 from Student where age betwwen 18 and 20 ;
將年齡在18到20及之間滿足條件的結果返回
【注】v1 betwwen v2 and V3 相當於v1>=v2 and v1<=v3
v1 not betwwen v2 and V3 相當於v1<v2 and v1>v3
Where 常用的運算符及功能 |
|
運 算 符 |
功 能 |
=、>、<、>=、<=、!=、<> |
比較范圍 |
betwwen and、not betwwen and |
在某個范圍之間(包含兩端) |
In 、not in |
數據在某一個集合 |
Like 、not like |
字符模糊匹配 |
Is null、is not null |
判斷空值 |
and、or、not |
邏輯運算(與或非) |
B、 多重條件查詢
Eg:select * from Student where dep=’計算機’ and sex=‘男’;
C、 模糊查詢
<字段名>[not] like <匹配串>
模糊查詢時<匹配串>中可以含有的通配符 |
||
通配符 |
功能 |
實例 |
% |
代表0個或多個字符 |
‘ab%‘ 表示’ab’后可接任意字符串 |
_(下划線) |
代表一個字符 |
‘a_b’表示‘a’與‘b‘之間可為任意單個字符 |
[ ] |
代表在某一范圍的字符 |
[0-9]表示0~9之間的字符 |
[^ ] |
表示不在某一范圍的字符 |
[^0-9]表示不在0~9之間的字符 |
Eg:select * from student where sName Like ’李%’;
D、 常用的統計函數匯總查詢
常用的統計函數及功能 |
|
函 數 名 |
功 能 |
AVG(<字段名>) |
求字段名所在列的平均值(必須是數值型) |
SUM(<字段名>) |
求字段名所在列的總和(必須是數值型) |
MAX(<字段名>) |
求字段名所在列的最大值 |
MIN(<字段名>) |
求字段名所在列的最小值 |
COUNT(*) |
統計個數 |
COUNT([DISTINCT])<字段名> |
統計不重復列的個數 |
Eg:select AVG(grade) as 平均成績 from score;
E、 OEDER BY 子句
Eg:select sNo,grade from Score where cNo=‘c001‘ ORDER BY grade DESC;
F、 分組數據
GROUP BY子句可以按照關鍵字段的值來組織數據,關鍵字段相同的為一組,一般情況之下可以根據表中的某一個字段進行分組,並且要求使用統計函數,這樣每一個分組就只有一個記錄
Eg:
Select cNO,COUNT(*) as 人數 from Score GROUP BY cNO;
java連接數據庫的基本操作過程
1、 JDBC是java程序中訪問數據庫的標准API,jdbc給java程序員提供訪問和操縱眾多關系數據庫的一個統一的接口。
2、 JDBC的分類:
SQL Server JDBC、MySQL JDBC、Oracle JDBC、JDBC-ODBC(連接ACCESS)
3、 JDBC中主要的類與接口(有顏色的代表接口)
JDBC中主要的類與接口 |
|
類與接口 |
功 能 說 明 |
DriverManager |
負責加載各種不同的驅動程序,根據不同的請求返回相應的 |
SQLException |
代表數據庫連接的建立、關閉或SQL語句的執行過程中發生的異常 |
Connection |
數據庫連接,負責與數據庫間通訊 |
Statement |
用以執行不含參數的靜態SQL查詢和更新,並返回執行結果 |
PreparedStatement |
用以執行包含參數的動態SQL查詢和更新 |
CallableStatement |
用以獲得數據庫的存儲過程 |
ResultSet |
獲得SQL查詢結果 |
【注】使用JDBC訪問數據庫的基本步驟為:加載驅動程序、建立與數據庫的連接、創建執行方式語句、執行SQL語句、處理返回結果和關閉創建的各種對象。
4、 建立與數據庫的連接
(1) 加載JDBC驅動程序:利用Class.forName(JDBCDriverClass);
forName()是Class的靜態方法,參數JDBCDriverClass是要加載的JDBC驅動程序類的名稱,它是以字符串形式表達的類長名。
數據庫的常用驅動程序類 |
|
數據庫 |
驅動程序類 |
Access |
sun.jdbc.odbc.JdbcOdbcDriver |
SQL Server |
com.microsoft.sqlserver.jdbc.SQLServerDriver |
MySQL |
com.mysql.jdbc.Driver |
Oracle |
oracle.jdbc.driver.OracleDriver |
Eg:
Class.froName(“com.mysql.jsbd.Driver”);//加載MySQL數據庫驅動
【注】創建數據庫連接時Driver Manager類的常用方法
Public static Connection getConnection(String url,String user,String password);
url為鏈接數據庫的url連接,用戶名和密碼為登錄數據庫的用戶名和密碼
DriverManager類的getConnection()是實現建立JDBC驅動程序到數據庫連接的方法一般格式如下:
Connection conn=DriverManager.getConnection(url,user,password);
JDBC的URL |
|
數據庫 |
URL模式 |
Access |
jdbc:odbc:dataSource |
SQL Server |
jdbc:sqlserver://hostname:port#;DatabaseName=dbname |
MySQL |
jdbc:mysql://hostname:3306/dbname |
Oracle |
jdbc:oracle:thin:@hostname:port#:oracleDBSID |
例如連接MySQL數據庫的操作:
Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/Student”,”root”,”123456”);
簡單操作數據庫的實例代碼
package com.database;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class dataBaseConnection {
//要加載的驅動類型
private static String driver="com.mysql.jdbc.Driver";
//連接數據庫的URl
private static String url="jdbc:mysql://localhost:3306/foods";
//登錄數據庫的用戶名
private static String user="root";
//登錄數據庫的密碼
private static String password="root";
public static void main(String[] args) {
Connection conn=null;
Statement stm=null;
ResultSet rs=null;
String selectsql ="select * from foods where CategoryId=1";
try {
//加載驅動,同時需要在項目中add libraries連接驅動程序mysql-connector-java-5.1.26-bin.jar
Class.forName(driver);
//創建數據庫連接
//conn=DriverManager.getConnection(url);這是錯誤方式,數據庫登錄用戶名和密碼沒有添加
conn=DriverManager.getConnection(url,user,password);
//利用連接對象conn創建Statement接口對象,類似於游標的作用
stm=conn.createStatement();
//將sql語句作為參數傳遞給Statement的查詢方法
rs=stm.executeQuery(selectsql);
//遍歷查詢結果集中的元素
while(rs.next()){
//利用集合中的getXXX(Colum)方法獲得數據庫表中Colum的內容
int foodsId=rs.getInt("FoodsId");
int CategoryId=rs.getInt("CategoryId");
String ChineseName=rs.getString("ChineseName");
String English=rs.getString("English");
String Description=rs.getString("Discription");
System.out.println(foodsId+" "+CategoryId+" "+ChineseName+" "+English+" "+Description);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//關閉結果集對象
if(rs!=null) rs.close();
//關閉Statement對象
if(stm!=null) stm.close();
//關閉JDBC與數據庫的連接對象
if(conn!=null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}