MySQL資料庫基礎(必備技能)
第一章:資料庫的設計
1.第一正規化:
第一正規化的目標是確保每列的原子性,如果每列(或者每個屬性值)都是不可再分的最小資料單元(也成為最小的原子單元),則滿足第一正規化
2.第二正規化:
第二正規化其目標是確保表中的每列都和主鍵相關,並且除了主鍵以外的其他列都全部依賴於該主鍵
3.第三正規化:
第三正規化的目標是確保每列都和主鍵列直接相關,而不是間接相關,並且除了主鍵以外的其他列都只能依賴於主鍵列,列與列之間不能存在相互依賴關係
第二章:初始MySQL
1.埠設定(預設啟用TCP/IP網路,預設埠為3306)
2.預設字符集設定(預設值為utf8)
3.MySQL資料夾
* bin資料夾:該資料夾下存放著可執行檔案
* include資料夾:該資料夾下存放著標頭檔案
* lib資料夾:該資料夾下存放著庫檔案
* share資料夾:該資料夾下存放著字符集,語言等資訊
4.修改MySQL配置檔案來手動配置資料庫伺服器MySQL時,常用引數:
* default - character - set:客戶端預設字符集
* character - set - setver:伺服器端預設字符集
* port:客戶端和伺服器端的埠號
* delault - storage - engine:MySQL預設儲存引擎
5.開服務:(net start mysql)
6.關服務:(net stop mysql)
7.命令列方式連線資料庫
語法:
mysql -h 伺服器主機地址 -u 使用者名稱 -p 密碼 (如果是本機可省略 -h)
8.操作資料庫
1.建立資料庫
語法:
create database 資料庫名;
2.檢視資料庫列表 語法: show databases; 3.選擇資料庫 語法: use 資料庫名; 4.刪除資料庫 語法: drop database 資料庫名; 5.建立表 語法: create table if not exists 表名( 欄位1 資料型別 欄位屬性 約束 索引 註釋, ... )表型別 表字符集 註釋; 6.單欄位主鍵 語法: create table if not exists 表名( 欄位1 資料型別 primary key, ... ); 7.查看錶 語法: show tables; 8.查看錶的定義 語法: describe 表名; 或 desc 表名; 9.刪除表 語法: drop table if exists 表名;
9.如果需要以0填充不足的位置,需要在型別後新增zerofill關鍵字
10.各資料型別都包含有符號數和無符號數兩類,預設為有符號數,既可以保持負數,如該欄位為非負數,則需新增unsigned屬性
11.資料型別
常用數值型別
資料型別 位元組數
tinyint[(m)] 1
smallint[(m)] 2
mediumint[(m)] 3
int[(m)] 4
float[(m,d)] 4
double[(m,d)] 8
decimal[m([,d])] m+2
bit bit稱為位資料型別,其資料有兩種取值:0和1 長度為1位,用來表示真假,是否
12.字串型別
字串型別
資料型別 位元組 說明
char[(m)] m 固定長字串,M為0-255的整數
varchar[(m)] 可變長度 可變長度,M為0-65535的整數
tinytext 0-255 微型文字串
text 0-65535 文字串
decimal(m,d) 該型別一般用於金額方面,m表示要顯示的長度,d表示保留的小數位數
13.日期型別
日期型別
資料型別 格式
date yyyy-mm-dd
datetime yy-mm-dd hh:mm:ss:
time hh:mm:ss:
timestamp yyyymmddhhmmss
year yyyy
14.欄位的約束及屬性
常用的屬性約束
欄位屬性,約束名 關鍵字
非空約束 not null
預設約束 default
唯一約束 unique key(uk)
主鍵約束 primary key(pk)
外來鍵約束 foreign key(fk)
自動增長 auto_increment
15.MySQL的儲存引擎
常用的儲存引擎
InnoDB 和 MyISQM儲存引擎比較
功能 InnoDB MyISAM
支援事物 支援 不支援
支援全文索引 不支援 支援
外來鍵約束 支援 不支援
表空間大小 較大 較小
資料行鎖定 支援 不支援
作業系統的預設儲存引擎是 InnoDB
檢視儲存引擎的語法:
show variables like 'storage_engine%';
16.指定表中的儲存引擎
語法:
create table 表名(
…
)engine=儲存引擎;
第三章:高階查詢(一)
1.修改表
1.修改表名
語法:
alter table 原表名 rename 新表名
2.新增欄位
語法:
alter table 表名 add 欄位 資料型別 屬性
3.修改欄位
語法:
alter table 表名 change 原欄位名 新欄位名 資料型別 屬性
4.刪除欄位
語法:
alter table 表名 drop 欄位名
2.新增主外來鍵
1.新增主鍵約束
語法:
alter table 表名 add constraint 主鍵名 primary key 表名(主鍵欄位)
2.新增外來鍵約束
語法:
alter table 表名 add constraint 外來鍵名 foreign key(外來鍵欄位) references 關聯表名 (關聯欄位)
3.插入資料記錄
1.插入單行資料
語法:
insert into 表名 (欄位列表) values(值列表)
2.插入多行資料
語法:
insert into 表名 (欄位列表) values(值列表1),(值列表2),...
3.將查詢結果插入到新表中
語法1:
insert into 新表 (欄位1,欄位2...)
select 欄位1,欄位2...
from 表名
語法2:
create table 新表 (select 欄位1,欄位2,...from 表名)
3.資料更新記錄
語法:
update 表名 set 欄位1=值1,欄位2=值2,… where 條件
4.刪除資料記錄
語法1:
delete from 表名 where 條件
語法2:
truncate table 表名
5.資料查詢
語法:
select <欄位列表>
from <表名或檢視>
where <查詢條件>
group by <分組的欄位名>
having <條件>(注意:該位置的條件是 篩選組)
order by <排序的欄位名> asc或desc
6.limit子句
語法:
select <欄位列表>
from <表名或檢視>
where <查詢條件>
group by <分組的欄位名>
order by <排序的欄位名> asc或desc
limit 位置偏移量,行數
7.常用函式
1.聚合函式
常用聚合函式
函式名 作用
avg() 返回某欄位的平均值
count() 返回某欄位的行數
max() 返回某欄位的最大值
min() 返回某欄位的最小值
sum() 返回某欄位的和
2.字串函式
常用字串函式
函式名 作用 舉例
concat(str1,str2,...strn) 連線完整字串 select concat('My','S','QL')
返回:MySQL
insert(str,pos,len,newstr) 替換 select insert('這是SQL Server資料庫',3,10,'MySQL')
返回: 這是MySQL資料庫 lower(str) 變小寫 select lower('MySQL') 返回:mysql
upper(str) 變大寫 select upper('mysql')
返回:MYSQL
substring(str,num,len) 擷取 select substring('JavaMySQLOracle',5,5)
返回:MySQL
3.時間日期函式
常用日期函式
函式名 作用 舉例
curdate() 獲取當前日期 select curdate()
curtime() 獲取當前時間 select curtime()
now() 獲取當前日期和時間 select now()
week(date) 返回日期date為一年中的第幾周 select week(date)
year(date) 返回日期date的年份 selct year(date)
hour(time) 返回時間time的小時值 select hour(now())
minute(time) 返回時間time的分鐘值 select minute(now())
datediff(date1,date2) 返回日期引數date1和date2相隔天數 select datediff(now(),'2008-8-8')
adddate(date,n) 計算日期引數date加上n天后的日期 select adddate(now(),5)
4.數學函式
常用數學函式
函式名 作用
ceil(x) 返回大於或等於x的最小整數
floor(x) 返回小於或等於x的最大整數
and() 返回0-1間的隨機數
8.子查詢
語法:
select …
from 表1
where 欄位1比較運算子(子查詢)
9.in和not in子查詢
1.in子查詢
注意:如果條件後面是用等號跟的子查詢,那麼該查詢就不能返回多個值
使用in則相反
2.not in子查詢
注意:in前面加not就是結果的反向值
事列:
#巢狀子查詢事列
SELECT re.`studentNo`
FROM `result` re
WHERE re.`subjectNo`NOT IN(
SELECT su.`subjectNo` FROM `subject` su
WHERE su.`subjectName`='HTML'
) AND re.`examDate` IN(
SELECT MAX(r.`examDate`) FROM `result` r
WHERE r.`subjectNo`NOT IN(
SELECT s.`subjectNo` FROM `subject` s
WHERE s.`subjectName`='HTML'
)
);
第四章:高階查詢(二)
1.exists 和 not exists子查詢
1.exists 子查詢
語法:
select … from 表名 where exists(子查詢)
2.not exists子查詢
exists 和 in一樣,同樣允許新增not關鍵字實現取反操作,not exists表示不存在
3.巢狀在select語句的from子句中的子查詢語法:
select * from (子查詢) as 表的別名
注意:表的別名一定要寫
4.建立臨時表
語法:
create temporary table 表名 (查詢語句)
5.聯合查詢
語法:
union
6.把時間區分為季度的函式
QUARTER()
注意:括號裡面存放想要區分的時間
第五章:事務,檢視,索引,備份和恢復
1.事務
事務是指將一系列資料操作捆綁成為一個整體進行統一管理
1.事務特性
1.原子性
事務是一個完整的操作,事務的各元素是不可分的(原子性)
2.一致性
在事務開始之前,資料庫中儲存的資料處於一致狀態
3.隔離性
對資料進行修改的所有併發事務是彼此隔離的,這表明事務必須是獨立的,它不應以任何方式依賴於或影響其他事務
4.永續性
事務的永續性指不管系統是否發生了故障,事務處理的結果都是永久的
2.如何執行事務
支援事務的儲存引擎有InnoDB和BDB,InnoDB儲存引擎事務主要通過UNDO日誌和REDO日誌實現
* UNDB 日誌:複製事務執行前的資料,用於在事務發生異常是回滾資料
* REDO 日誌:記錄在事務執行中,每條對資料進行更新的操作,當事務提交時,該內容將被重新整理到磁碟
3.執行事務的語法:
1.開始事務
語法:
begin 或 start transaction
2.提交事務
語法:
commit
3.回滾(撤銷)事務
語法:
rollback
4.設定自動提交關閉或開啟
語法:
set autocommit=0|1
* 值為0:關閉自動提交
* 值為1:開啟自動提交
2.檢視
檢視是儲存在資料庫中的select查詢
檢視是一種虛擬表,通常 是作為來自一個或多個表的行或列的子集建立的
1.使用sql語句建立檢視
語法:
create view 檢視名
as
<select語句>
2.使用sql語句刪除檢視
語法:
drop view if exists 檢視名
3.使用sql語句檢視檢視資料
語法:
select 欄位 from 檢視名
3.索引
1.索引的分類:
1.普通索引
普通索引是mysql中的基本索引型別,允許在定義索引的列中插入重複值和空值,它的唯一任務是加快對資料的訪問速度
2.唯一索引
唯一索引不允許兩行具有相同的索引值
3.主鍵索引
在資料庫關係圖中為表定義一個主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特殊型別
4.複合索引
在建立索引時,並不是只能對其中一列建立索引,與建立主鍵一樣,可以將多個列合作為索引
5.全文索引
全文索引的作用是在定義索引的列上支援值的全文查詢,允許在這些索引列中插入重複值和空值,主要用於在大量文字文字中搜索字串
6.空間索引
空間索引是對空間資料型別的列建立的索引
2.建立索引
語法:
create unique|fulltext|spatial index 索引名
on 建立索引的表名 (建立索引的表名的列名)
* unique|fulltext|spatial:分別表示唯一索引,全文索引和空間索引
3.刪除索引
語法:
drop index 索引名 on 建立索引的表名
4.檢視索引
語法:
show index from 建立索引的表名
4.資料庫的備份和恢復
1.使用mysqldump命令備份資料庫
語法:
mysqldump -u 使用者名稱(一般為root) -h 主機名(一般不寫) -p 密碼 要備份的資料庫名 要備份的資料庫中的表名 > 路徑(例如:d:\1\java.sql)
2.使用mysql命令恢復資料庫
語法:
mysql -u 使用者名稱(一般為root) -h 主機名(一般不寫) -p 密碼 要給恢復的資料庫名 < 路徑(例如:d:\1\java.sql)
注意:1和2一定記住是在dos命令下寫的
3.mysql命令是在dos環境下的恢復資料庫命令,如果已經登入列MySQL伺服器,也可以使用source命令恢復資料庫
語法:
source 資料庫備份檔案(所謂的路徑)
4.將所有資料寫入到資料檔案中
語法:
flush tables
5.表資料匯出到文字檔案
語法:
select 查詢的列
from 表名
where 條件
into outfile 路徑(列如:'d:/1/java.txt')
6.文字檔案寫入到資料表
語法:
load data infile 路徑(列如:'d:/1/java.txt') into table 要匯入的表名(注意:要匯入的表名要提前建立好)
7.知識擴充套件
* fields
terminated by 'string':用來設定欄位的分割符為字串物件,預設為“\t”
* fields
optionally | enclosed by'char':用來設定括上欄位值的字元符號,如果使用了optionally,則只有char和varchar等字元資料欄位被包括,
預設情況下不使用任何符號
* fields
escaped by'char':用來設定轉義字元的字元符號,預設情況下使用“\”字元
* lines
starting by'char':用來設定每行開頭的字元符號,預設情況下不使用任何符號
* lines
terminated by'string':用來設定每行結束的字元符號,預設情況下使用“\n”字串
第七章:JDBC
1.JDBC訪問資料庫的步驟
1.載入JDBC驅動
Class.forName("JDBC驅動類的名稱") 注意:JDBC驅動類的名稱一般為:com.mysql.jdbc.Driver
2.與資料庫建立連線
Connection conn=DriverManager.getConnection(資料連線字串,資料庫使用者名稱,密碼) 注意:資料庫連線字串一般為:jdbc:mysql://本機名(一般為:localhost):3306/資料庫名 資料庫使用者名稱一般為:root 密碼一般為:root
3.傳送SQL語句,並得到返回結果
一旦建立連線,就是用該連線建立Statement介面的物件,並將SQL語句傳遞給它所連線的資料庫,如果是查詢操作,將返回型別為ResultSet的結果集,它包含執行SQL查詢的結果
Statement stmt = conn.createStatement();
ResultSet rs=stmt.executeQuery("select `id`,`name` from `master`")
4.處理返回結果
處理返回結果主要是針對查詢操作的結果集,通過迴圈取出結果集中每條記錄並做相應處理
2.Statement介面和ResultSet介面
Connection 介面常用方法
方法名稱 作用
void close() 釋放資源
Statement createStatement() 建立一個Statement物件來將SQL語句傳送到資料庫
PreparedStatement
preparedStatement(String sql) 建立一個PreparedStatement物件來將引數化的SQL語句傳送到資料庫
boolean isClosed() 查詢此Connection物件是否已經關閉
Statement 介面常用方法
方法名稱 作用
ResultSet executeQuery(String sql) 可以執行SQL查詢並獲取ResultSet物件
int executeUpdate(String sql) 執行增,刪,改操作,返回影響行數
boolean execute(String sql) 可以執行任意SQL語句,若結果為ResultSet物件,則返回true,反之為false
ResultSet 介面常用方法及作用
方法名稱 作用
boolean next() 下一行
boolean previous() 上一行
void close() 釋放資源
int getInt() int型別
int getFloat() float型別
String getString() String型別
int getRow() 得到游標當前所指行的行號
boolean absolute(int row) 游標移動到row指定的行
3.PreparedStatement介面
PreparedStatement介面繼承Statement介面
PreparedStatement 介面常用方法
方法名稱 作用
boolean exectute() true或false
ResultSet executeQuery() 查詢
int executeUpdate() 執行增,刪,改操作,返回影響行數
void setInt(int index,int x) 給引數
void setObject(int index,Object x) 使用給定物件設定指定引數的值
第八章:DAO模式
1.Properties類
properties配置檔案
Properties類的常用方法
方法 描述
String getProperty(String key) 用指定的鍵在此屬性列表中搜索屬性,通過引數key得到其所對應的值
Object setProperty(String key,String value) 呼叫Hashtable的方法put,通過呼叫基類的put()方法來設定鍵-值對
void load(InputStream inStream) 從輸入流中讀取屬性列表(鍵和元素對),通過對指定檔案進行裝載獲取該檔案中所以鍵-值對
void clear() 清除所裝載的鍵-值對,該方法有基類Hashtable提供