1.創建數據庫,並指定字符集
create database 數據庫名稱 character set 字符集名;
2.修改數據庫的字符集
alter database 數據庫名稱 character set 字符集名稱;
3.數據庫類型:
1. int:整數類型
age int,
2. double:小數類型
score double(5,2)
3. date:日期,只包含年月日,yyyy-MM-dd
4. datetime:日期,包含年月日時分秒 yyyy-MM-dd HH:mm:ss
5. timestamp:時間戳類型 包含年月日時分秒 yyyy-MM-dd HH:mm:ss
如果將來不給這個字段賦值,或賦值爲null,則默認使用當前的系統時間,來自動賦值
6. varchar:字符串
name varchar(20):姓名最大20個字符
zhangsan 8個字符 張三 2個字符
4.基礎查詢
1.去除重複:
* distinct
SELECT distinct address FROM student3;
2.起別名:
* as:as也可以省略
3.查詢姓名第二個字是化的人
SELECT * FROM student WHERE NAME LIKE "_化%";
4.排序
ASC:升序,默認的。DESC:降序。
如果有多個排序條件,則當前邊的條件值一樣時,纔會判斷第二條件。
SELECT * FROM student3 ORDER BY math DESC, english DESC;
5.聚合函數:將一列數據作爲一個整體,進行縱向的計算。
1. count:計算個數
1. 一般選擇非空的列:主鍵
SELECT COUNT(*) AS '總人數' FROM student3;
2. max:計算最大值
SELECT MAX(age) AS '最大值' FROM student3;
3. min:計算最小值
SELECT MIN(age) AS '最大值' FROM student3;
4. sum:計算和
SELECT SUM(age) AS '最大值' FROM student3;
5. avg:計算平均值
SELECT AVG(age) AS '最大值' FROM student3;
5.分組查詢:
1. 語法:group by 分組字段;
1. where 在分組之前進行限定,如果不滿足條件,則不參與分組。
having在分組之後進行限定,如果不滿足結果,則不會被查詢出來。
2.按照性別分組。分別查詢男、女同學的平均分,人數
要求:分數低於70分的人,不參與分組,分組之後。人數要大於2個人
SELECT sex , AVG(math),COUNT(id) 人數
FROM student WHERE math > 70
GROUP BY sex HAVING 人數 > 2;
6.分頁查詢
limit 開始的索引(從0開始),每頁查詢的條數;
SELECT * FROM student LIMIT 0,3; -- 第1頁
7.添加刪除修改
insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
delete from 表名 [where 條件]
update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 條件];
5.約束:對錶中的數據進行限定,保證數據的正確性、有效性和完整性。
非空約束刪除
ALTER TABLE stu MODIFY NAME VARCHAR(20);
唯一約束刪除
ALTER TABLE stu DROP INDEX phone_number;
主鍵約束刪除
ALTER TABLE stu DROP PRIMARY KEY;
外鍵約束刪除
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
1. 非空約束:not null,值不能爲null
創建表時添加約束
NAME VARCHAR(20) NOT NULL -- name爲非空
創建表完後,添加非空約束(也惡意在創建表時添加)
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
刪除name的非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
2. 唯一約束:unique,值不能重複
創建表時,添加唯一約束
phone_number VARCHAR(20) UNIQUE -- 添加了唯一約束
在創建表後,添加唯一約束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
刪除唯一約束
ALTER TABLE stu DROP INDEX phone_number;
3. 主鍵約束:primary key 主鍵就是表中記錄的唯一標識,一張表只能有一個字段爲主鍵,非空且唯一
id是主鍵
在創建表時,添加主鍵約束
id int primary key,-- 給id添加主鍵約束
刪除主鍵
ALTER TABLE stu DROP PRIMARY KEY;
創建完表後,添加主鍵
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
自動增長
auto_increment
刪除自動增長
ALTER TABLE stu MODIFY id INT;
添加自動增長
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
4.外鍵約束:讓表於表產生關係,從而保證數據的正確性。
在創建表時,可以添加外鍵
外鍵列
constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱)
刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
創建表之後,添加外鍵
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱
FOREIGN KEY (外鍵字段名稱)
REFERENCES 主表名稱(主表列名稱);
級聯操作:要刪把約束相關的數據一起刪,定義外鍵的表執行就行了
1. 級聯更新:ON UPDATE CASCADE
2. 級聯刪除:ON DELETE CASCADE
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱
FOREIGN KEY (外鍵字段名稱)
REFERENCES 主表名稱(主表列名稱)
ON UPDATE CASCADE
ON DELETE CASCADE ;
6.數據庫的設計
1.一對一
人和身份證
一對一關係實現,可以在任意一方添加唯一外鍵指向另一方的主鍵
2.一對多(多對一):
部門和員工
在多的一方建立外鍵,指向一的一方的主鍵。
3.多對多
學生和課程
多對多關係實現需要藉助第三張中間表。
中間表至少包含兩個字段,
這兩個字段作爲第三張表的外鍵,分別指向兩張表的主鍵
4.數據庫設計的範式
第一範式(1NF):每一列都是不可分割的原子數據項
第二範式(2NF):在1NF的基礎上,非碼屬性必須完全依賴於碼
(在1NF基礎上消除非主屬性對主碼的部分函數依賴)
1.函數依賴:A-->B,如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值。則稱B依賴於A
學號-->姓名
2. 完全函數依賴:A-->B, 如果A是一個屬性組,則B屬性值得確定需要依賴於A屬性組中所有的屬性值。
(學號,課程名稱) --> 分數
3. 部分函數依賴:A-->B, 如果A是一個屬性組,則B屬性值得確定只需要依賴於A屬性組中某一些值即可。
(學號,課程名稱) -- > 姓名
4. 傳遞函數依賴:A-->B, B -- >C .
如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,
在通過B屬性(屬性組)的值可以確定唯一C屬性的值,
則稱 C 傳遞函數依賴於A
學號-->系名,系名-->系主任
5.碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,
則稱這個屬性(屬性組)爲該表的碼
第三範式(3NF):在2NF基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)
7.多表查詢
(1. 內連接查詢:
1. 隱式內連接:使用where條件消除無用數據,連接條件是:WHERE t1.`dept_id` = t2.`id`; 兩張表連接到了一起,不符合條件的數據不在裏邊
查詢所有員工信息(名稱,性別)和對應的部門信息(名稱)
SELECT
t1.name, -- 員工表的姓名
t1.gender,-- 員工表的性別
t2.name -- 部門表的名稱
FROM
emp t1,
dept t2
WHERE
t1.`dept_id` = t2.`id`;
2. 顯式內連接:(寫不寫inner都一樣)where換成了:JOIN dept ON emp.`dept_id` = dept.`id`;
SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;
(2. 外鏈接查詢:
1. 左外連接:select 字段列表 from 表1 left [outer] join 表2 on 條件;
查詢的是左表所有數據以及其交集部分。
就是左邊的表連接右邊的表,條件是:join 表2 on 條件;,左邊表所有數據都有
查詢所有員工信息,如果員工有部門,則查詢部門名稱,沒有部門,則不顯示部門
SELECT
t1.*,
t2.`name`
FROM
emp t1
LEFT JOIN
dept t2
ON
t1.`dept_id` = t2.`id`;
2. 右外連接:* 語法:select 字段列表 from 表1 right [outer] join 表2 on 條件;
* 查詢的是右表所有數據以及其交集部分。
SELECT
*
FROM
dept t2
RIGHT JOIN
emp t1
ON t1.`dept_id` = t2.`id`;
(3.子查詢:
概念:查詢中嵌套查詢,稱嵌套查詢爲子查詢。
查詢工資最高的員工信息
SELECT
*
FROM
emp
WHERE
emp.`salary` = (SELECT
MAX(salary)
FROM
emp);
子查詢不同情況
1. 子查詢的結果是單行單列的:
子查詢可以作爲條件,使用運算符去判斷。 運算符: > >= < <= =
比如:查詢員工工資小於平均工資的人
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
2. 子查詢的結果是多行單列的:
子查詢可以作爲條件,使用運算符in來判斷
比如:查詢'財務部'和'市場部'所有的員工信息
SELECT
*
FROM
emp
WHERE
dept_id IN (SELECT
id
FROM
dept
WHERE
NAME = '財務部' OR NAME = '市場部');
3. 子查詢的結果是多行多列的:
子查詢可以作爲一張虛擬表參與查詢
比如:查詢員工入職日期是2011-11-11日之後的員工信息和部門信息
SELECT
*
FROM
dept t1 ,(SELECT * FROM emp
WHERE emp.`join_date` > '2011-11-11') t2
WHERE t1.id = t2.dept_id;
8.事務的基本介紹
(1. 概念:如果一個包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。
(2. 操作:
1. 開啓事務: start transaction;
2. 回滾:rollback;
3. 提交:commit;
MySQL數據庫中事務默認自動提交
Oracle 數據庫默認是手動提交事務
修改事務的默認提交方式:
查看事務的默認提交方式:SELECT @@autocommit; -- 1 代表自動提交 0 代表手動提交
修改默認提交方式: set @@autocommit = 0;
(3. 事務的四大特徵:
1. 原子性:是不可分割的最小操作單位,要麼同時成功,要麼同時失敗。
2. 持久性:當事務提交或回滾後,數據庫會持久化的保存數據。
3. 隔離性:多個事務之間。相互獨立。
4. 一致性:事務操作前後,數據總量不變
(4. 事務的隔離級別(瞭解)
概念:多個事務之間隔離的,相互獨立的。
但是如果多個事務操作同一批數據,則會引發一些問題,
設置不同的隔離級別就可以解決這些問題。
存在問題:
1. 髒讀:一個事務,讀取到另一個事務中沒有提交的數據
2. 不可重複讀(虛讀):在同一個事務中,兩次讀取到的數據不一樣。
3. 幻讀:一個事務操作(DML)數據表中所有記錄,另一個事務添加了一條數據,則第一個事務查詢不到自己的修改。
隔離級別:
read uncommitted:讀未提交
產生的問題:髒讀、不可重複讀、幻讀
read committed:讀已提交 (Oracle)
產生的問題:不可重複讀、幻讀
repeatable read:可重複讀 (MySQL默認)
產生的問題:幻讀
serializable:串行化
可以解決所有的問題
隔離級別從小到大安全性越來越高,但是效率越來越低
9.JDBC
//1. 導入驅動jar包
//2.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
//3.獲取數據庫連接對象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
//4.定義sql語句
String sql = "update account set balance = 500 where id = 1";
//5.獲取執行sql的對象 Statement
Statement stmt = conn.createStatement();
//6.執行sql
int count = stmt.executeUpdate(sql);
//7.處理結果
System.out.println(count);
//8.釋放資源
stmt.close();
conn.close();