1、mysql 基本操作 Windows-->Mysql5.7打開 輸入用戶名和密碼 查看資料庫 :show databases;查詢所有資料庫,記住一定要加分號結尾 這裡必須全部為 英文空格 英文符號 選擇 day4_6資料庫:use day4_6; 查看這個資料庫的所有表: show table ...
1、mysql
基本操作
Windows-->Mysql5.7打開
輸入用戶名和密碼
查看資料庫 :show databases;查詢所有資料庫,記住一定要加分號結尾
這裡必須全部為 英文空格 英文符號
選擇 day4_6資料庫:use day4_6;
查看這個資料庫的所有表: show tables;
創建命名為westos的資料庫:create databases westos;
再次查詢所有的資料庫:show databases;
show databases;-- 查看所有資料庫
mysql> use day4_6 -- 選擇資料庫中的day4_6表
Database changed
show tables;-- 查看day4_6資料庫中的所有表
describe student;-- 顯示庫所有表的信息 沒有設計過表或者沒有信息則不會顯示出來
create database westos;-- 創建一個名為westos的數據集
exit; -- 退出連接
-- 單行註釋
/*
多行註釋
*/
資料庫 語言 crud增刪改查
DDL 定義
DML 操作
DQL 查詢
DCL 控制
2、操作資料庫
這裡在Navicat premium中操作
2.1、創建資料庫
創建一個名叫 westos的數據表:create database westos;
刪除資料庫
這裡創建了一個day4_27的資料庫
在旁邊輸入命令 drop databases day4_27 這裡多輸入了一個s 操作不成功
當命令行輸入drop database day4_27;則刪除成功
使用資料庫
選擇 westos資料庫 :use day4_6;
當資料庫是關鍵字時應該用``兩個飄將他包含例如
查看表結構sql語句
show create tbale 表名
;
粘貼的語句為:
查看資料庫
只執行第二行語句 show tables 查看資料庫中的所有表
2.2、資料庫的類型
數值
- tinyint 非常小的數據 1個位元組
- smallint 較小的數據 2個位元組
- mediumint 中等大小的數據 3個位元組
- int 標準的整數 4個位元組
- bigint 較大的數據 8個位元組
- float 單精度浮點數 4個位元組
- double 雙精度浮點數 8個位元組
- decimal 字元串形式的浮點數 金融計算
字元串
- char 字元固定的大小 0-255
- varchar 可變字元串 0-65535 常量的變數 string
- tinytext 微型文本 2^8-1
- text 文本串 2^16-1 保存大文本
時間日期
java.util.Date
- data YYYY-MM-DD 日期格式
- time HH:mm:ss 時間格式
- datetime YY-MM-DD HH:mm:ss 最常用的格式、
- timestamp 時間戳 1970.1.1到現在的毫秒數!也較為常用
- year年份的表示
null
空值
2.3、資料庫的欄位屬性(重點)
unsigned:
- 無符號的整數
- 聲明該列不能為負數
zerofill:
- 填充0
- 不足位數的,用0來填充 例如 int(3),輸入5 輸出結果為005
自增:
- 自動在上一條的記錄上+1
- 通常設計在唯一的主鍵~index,必須是整形類型
- 還可以自定義設置自增的起始值和步長
非空:null和 not null
- 假設設置為not null 如果不給它賦值就會報錯
- null,如果不填寫,預設值就是null還有可能為空白
2.4、創建資料庫表
CREATE TABLE `student` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '學號',
`name` varchar(20) DEFAULT '匿名' COMMENT '姓名',
`sex` varchar(10) DEFAULT '男' COMMENT '性別',
`pwd` varchar(20) NOT NULL COMMENT '密碼',
`birthday` datetime DEFAULT NULL COMMENT '出生日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE if not exists`student`(
// 當表不存在時 創建student數據表
// 欄位名--'id' 列類型--int(位元組) 預設值--DEFAULT'' 備註--comment'' AUTO_INCREMENT, //用逗號隔開
AUTO_INCREMENT//表自增
`birthday` datetime NOT NULL,//這裡需要版本足夠高否則會報錯 結尾後最後一個欄位不加點,
)
常用命令
show create database student --查看創建資料庫的語句 這裡student表示資料庫
show create table student --查看創建資料庫表的語句 這裡student表示資料庫表
desc student --顯示資料庫表的結構
2.5、數據表的類型
-- 關於資料庫引擎
/*
INNODB 預設使用
MYISAM 早些年使用的
*/
MYUSAM | INNODB | |
---|---|---|
事務支持 | 不支持 | 支持 |
數據行鎖定 | 不支持 | 支持 |
外鍵約束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空間大小 | 較小 | 較大,約為2倍 |
常規使用的操作:
- MYUSAM 節約空間,速度較快
- INNODB 安全性高,事務的處理,多表多用戶操作
物理空間位置
MySQL 引擎在物理文件上的區別
- InnoDB在資料庫中只有一個 *.frm 文件,以及上級目錄下的ibdata1文件
- MYSAM 對應文件
- *.frm 表結構的定義文件
- *.MYD 數據文件(data)
- *.MYI 索引文件(index)
設置資料庫表的字元集編碼
CHARSET=utf8
不設置的話會是mysql預設的字元集編碼(不支持中文!)
mysql的預設編碼是Latin1,不支持中文
在my.ini中配置預設的編碼
character-set-server=utf8
2.6、修改刪除表
-- 修改表名: alter table 舊表名 RENAME as 新表名
ALTER TABLE student RENAME as studentD
-- 增加表的欄位 ALTER TABLE 表名(student2) 添加(ADD) 欄位名(age) 列屬性int(11)
ALTER TABLE student2 ADD age int(11)
-- 修改表的欄位 (重命名,修改約束)
-- ALTER TABLE 表名 MODIFY 欄位名 列屬性[]
ALTER TABLE studentd MODIFY name VARCHAR(11) -- 修改約束
-- ALTER TABLE 表名 CHANGE 舊名稱 新名稱 列屬性[]
ALTER TABLE studentd CHANGE name name1 int(1) -- 欄位重命名
-- 結論:change用來欄位的重命名,不能修改欄位類型和約束
-- modify不能用來欄位的重命名,只能修改欄位類型和約束
-- 刪除表的欄位 ALTER TABLE 表名 drop 欄位名
ALTER TABLE studentd drop email
刪除
-- 如果 存在student7 則刪除
DROP TABLE IF EXISTS student7
所有創建和刪除儘量加上判斷,以免報錯~
註意點:
- `` 欄位名用這個包裹
- 註釋用 -- 或者/**/
- sql 關鍵字大小寫不敏感,建議使用小寫
- 所有的符號全部用英文!
3、MySQL數據管理
3.1外鍵
3.2DML語言(全部記住)
資料庫意義:數據存儲 ,數據管理
3.3添加
-- 插入語句 (添加)
-- insert into '表名'('列名') 'VALUES('值1')
INSERT INTO `grade`(`gradename`) values('大二')
-- 由於主鍵自增我們可以省略(如果不寫表的欄位,會一一匹配)
-- 插入多個欄位
insert into `index`(id,xb,age) VALUES('1111','男','20')
語法:**insert into `表名`(`欄位名1`,`欄位名2`,`欄位名3`)VALUES('值1'),('值2'),('值3')**
註意事項:
1.欄位和欄位之間使用 英文逗號 隔開
2.欄位是可以省略的,但是後面的值必須要對應
3.可以同事插入多條數據,values後面的值,需要使用,隔開即可 values()),(),()
3.4修改
update
-- 指定條件下,修改特定的信息 BETWEEN 2 and 3 從2-3行
UPDATE `index` set `xm`='海兒' where id=1027;
-- 不指定條件的情況下,會改動表中所有的數據
UPDATE `index` set `xm`='小海兒' ;
-- 修改多個屬性 需要,逗號隔開
UPDATE `index` set `xm`='小小小海兒' ,`xb`='男',`age`='20' where id=1027;
-- 語法:
-- update 表名 set colum_name=value
語法:update 表名 set colnum_name=value,[colnum_name =value,...]where[條件]
註意:
- colnum_name 是資料庫的列,儘量帶上``符號
- 條件,篩選的條件,如果沒有指定,則會修改所有的列
- value,是一個具體的值,也可以是一個變數
- 多個設置的屬性之間,使用英文逗號隔開
3.5刪除
delete 命令
語法:delete from 表名[where 條件]
-- delete命令
-- 刪除數據(避免這樣寫,會全部刪除)
DELETE FROM `student`
-- 刪除指定數據
DELETE FROM `student3` WHERE id=1;
truncate 命令
作用:完全清空一個數據表,表的結構和索引約束都不會變
-- 清空student6表
TRUNCATE `student6`
4、DQL查詢數據(最重點)
4.1、指定查詢欄位
-- 查詢全部的學生 select欄位from表
select * from student
-- 查詢指定欄位
select `StudentNo`,`StudentName` from student
-- 別名,給結果起另外一個名稱 as 可以給欄位起別名,也可以給表起別名
SELECT `StudentNo` as 學號,`StudentName` as 學生姓名 FROM student as s
-- 函數 concat(a,b)
SELECT CONCAT('姓名:',StudentName) as 新名字 from student
去重 distinct
作用:去除select查詢出來的結果中重覆的數據,重覆的數據只顯示一條
SELECT * from result -- 查詢全部的考試成績
select `StudentNo` from result -- 查詢有哪些同學參加考試,但發現有重覆數據
SELECT DISTINCT `StudentNo` FROM result -- 去重
資料庫的列 (表達式)
SELECT VERSION() -- 查詢系統版本 5.7.13 函數
SELECT 100*2-100 as 計算結果 -- 用於計算 (表達式)
SELECT @@auto_increment_increment -- 查詢自增的步長
-- 學院考試成績+1分查看
select `StudentNo`,`StudentResult`+1 as '加一分後結果' FROM result
資料庫中的表達式:文本值,列,null,函數,計算表達式,系統變數
4.2 where條件子句
-- =============where==========================
SELECT StudentNo, `StudentResult` from result-- 查詢 列屬性,`列屬性` from 表名
-- 查詢成績在95-100之間
SELECT StudentNo,`StudentResult` FROM result WHERE StudentResult>=80 and StudentResult<=100
-- and 和&&
SELECT StudentNo,`StudentResult` FROM result WHERE StudentResult>=80 && StudentResult<=100
-- 模糊查詢(區間) BETWEEN between
SELECT StudentNo,`StudentResult` FROM result WHERE StudentResult BETWEEN 5 and 100
-- 除了1000號學生之外的同學的成績
select StudentNo, `StudentResult` from result where
StudentNo!=1000
-- 方法二 not
select StudentNo, `StudentResult` from result where
not StudentNo =1000
模糊查詢:比較運算符
運算符 | 語法 | 描述 |
---|---|---|
is null | a is null | 當操作符為null,結果為真 |
is not null | a is not null | 當操作符不為null,結果為真 |
between | a between b and c | 若a在b和c之間,則結果為真 |
like | a like b | sql匹配,如果a匹配b,則結果為真 |
in | a in(a1,a2,a3...) | 假設a在a1,或者a2...其中的某一個值中,結果為真 |
-- =============模糊查詢========================
-- 查詢姓趙的同學
-- like 結合% (代表0到任意個 字元)_(一個字元)
SELECT `StudentNo`,`StudentName` from `student`
where StudentName LIKE '趙%'
-- 查詢姓趙的同學,名字後面只有一個字的
SELECT `StudentNo`,`StudentName` from `student`WHERE StudentName like '趙_'
-- 查詢姓趙的同學,名字後面只有兩個個字的
SELECT `StudentNo`,`StudentName` from `student`WHERE StudentName like '趙__'
-- 查詢名字中間有擺字的同學 '%擺%'
SELECT `StudentNo`,`StudentName` from `student`WHERE StudentName like '%擺%'
-- =========in (具體的一個或多個值)==================
-- 查詢1001.1002.1003號學員
SELECT `StudentNo`,`StudentName` from `student`WHERE
StudentNo in(1001,1002,1003)
-- 查詢在達州 宣漢的學員
SELECT `StudentNo`,`StudentName` from `student`WHERE
Address in('四川達州','四川宣漢')
-- 查詢地址為空的的學員
SELECT `StudentNo`,`StudentName` from `student`WHERE
`address`=''or `address` is null
4.3、聯表查詢
join
-- ================聯表查詢 join===========================
-- 查詢參加考試的同學 (學號,姓名,考試編號,分數)
select * from student
select * from result
/*
1.分析需求,分析查詢欄位來自哪些表
2.確定哪種連接查詢? ------------7種
確定交叉點(這兩個表中哪些數據是相同的)
判斷的條件:學生表中的studentNo=成績表中的studentNo
*/
-- jion on 判斷條件 連接查詢
-- where 等值查詢
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student as s
INNER JOIN result as r
WHERE s.StudentNo=r.StudentNo
-- Right join
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student as s
RIGHT JOIN result as r
on s.StudentNo =r.StudentNo
-- left join
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student as s
LEFT JOIN result as r
on s.StudentNo =r.StudentNo
操作 | 描述 |
---|---|
inner join | 如果表中至少有一個匹配,就返回行 |
left join | 會從左表返回所有值,即使右表沒有匹配 |
right join | 會從右表返回所有值,即使左表中沒有匹配 |
-- 查詢 參加考試同學的信息: 學號studentNo,學生姓名studentName。科目名Subjectname,分數studentResult
SELECT s.StudentNo,StudentName,r.SubjectNo,StudentResult
-- 這裡曾出現問題表意不明SubjectNo因為result表 和subject表中都有SubjectNo
-- 所以這裡的SubjectNo 需要指明 是sub 還是r 的表
FROM student s
RIGHT JOIN result as r
on r.StudentNo=s.StudentNo
INNER JOIN `subject` sub
on r.SubjectNo=sub.SubjectNo
自連接
父類
categoryid | categoryName |
---|---|
2 | 信息技術 |
3 | 軟體開發 |
5 | 美術設計 |
子類
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 資料庫 |
2 | 8 | 辦公信息 |
3 | 6 | web開發 |
5 | 7 | ps技術 |
操作:查詢父類對應子類關係
父類 | 子類 |
---|---|
信息技術 | 辦公信息 |
軟體開發 | 資料庫 |
軟體開發 | web開發 |
美術設計 | ps技術 |
-- 查詢父子信息
select c.categoryname as '父類', d.categoryname as '子類'
FROM category as c,category as d
WHERE c.categoryid=d.pid
-- 查詢學院所屬的年級(學號,學生的姓名,年級)
SELECT StudentNo,StudentName,GradeName
FROM student as s
INNER JOIN grade g
on s.GradeId=g.GradeId
4.4分頁和排序
分頁
-- 為什麼要分頁
-- 緩解資料庫壓力,給人的體驗更好
-- 分頁,每頁顯示五條數據
-- 語法: limit 當前頁,頁面的大小
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,StudentResult
FROM student s
INNER JOIN `result` r
ON s.`StudentNo`=r.`StudentNo`
INNER JOIN `subject` sub
ON r.`subjectNo`=sub.`subjectNo`
WHERE SubjectName='資料庫結構-1'
ORDER BY StudentResult ASC
LIMIT 0,4
5、mysql函數
5.1常用函數
-- 數學運算
SELECT ABS(-10) -- 絕對值
SELECT CEILING(10.2) -- 向上取整
select FLOOR(10.5)-- 向x下取整
select RAND() -- 生成0-1之間的隨機數
select SIGN(100) -- 判斷一個數的符號0 就是0 負數返回-1,整數為1
-- 字元串函數
select CHAR_LENGTH('海擺開擺') -- 返回字元串長度
SELECT CONCAT('海兒','還得是海兒') -- 拼接字元串
select INSERT('小小海兒',1,2,'開擺') -- 從某個位置開始替換長度
SELECT UPPER('avc') -- 小寫轉換大寫
select LOWER('ABC') -- 大寫轉小寫
select REPLACE('堅持就能成功','堅持','努力')-- 匹配要換的字體
-- 查詢姓 趙 的同學,改成 海兒
SELECT REPLACE(StudentName,'趙','海') from student
where StudentName like '趙%'
-- 時間跟日期函數(記住)
SELECT CURRENT_DATE -- 獲取今天日期
select CURDATE() -- 獲取今天日期
SELECT now() -- 獲取當前時間 精確分秒
SELECT LOCALTIME() -- 本地時間
-- 系統
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()
5.2聚合函數(常用)
函數名稱 | 描述 |
---|---|
count() | 計數 |
sum() | 求和 |
avg() | 平均值 |
max() | 最大值 |
min() | 最小值 |
-- =======聚合函數=======
-- 都能夠統計表中的數據
SELECT COUNT(`Email`) FROM student -- count(欄位),會忽略所有的null null也會計數
SELECT COUNT(*) FROM student
SELECT COUNT(1) FROM student
SELECT SUM(`StudentResult`) as 總和 from result
SELECT avg(`StudentResult`) as 總和 from result
SELECT max(`StudentResult`) as 總和 from result
SELECT min(`StudentResult`) as 總和 from result
-- 查詢不同課程的平均分,最高分,最低分,平均分大於80
-- 核心:(根據不同的課程分組)
SELECT `SubjectName`, avg(StudentResult) as 平均分,max(StudentResult) as 最高分, min(StudentResult) as 最低分
FROM result r
INNER JOIN `subject` sub
on r.`SubjectNo`=sub.SubjectNo
GROUP BY r.`SubjectNo`
HAVING 平均分>80
5.3 資料庫級別MD5加密
什麼是MD5?
主要增強演算法複雜度 不可逆。
MD5不可逆,具體的MD5是一樣的
MD5破解原理,背後有一個字典,MD5加密後的值,加密前的值
CREATE TABLE testmd5(
`id` INT(4) not NULL,
`name` VARCHAR(20) not null,
`pwd` VARCHAR(50) not null,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 銘文密碼
INSERT INTO testmd5 VALUES(1,'張三','123456'),(2,'李四','123456'),(3,'王五','123456')
-- 加密
UPDATE testmd5 set pwd=MD5(pwd) WHERE id=1
UPDATE testmd5 set pwd=MD5(pwd) WHERE id!=1
-- 插入時加密
INSERT INTO testmd5 VALUES(4,'小明',MD5('123456'))
-- 如何校驗,將用戶傳遞過來的密碼,進行md5加密
SELECT * FROM testmd5 WHERE `name`='小明' and pwd=MD5('123456')
6、事務
要麼都成功要麼都失敗
1.sql執行 A給B 轉賬 A1000->200 B 200
2.sql執行 B收到A轉賬 A800 ->B400
將一組sql放在一個批次中 去執行~
事務原則:ACID原則 原子性,一致,隔離性,持久性
原子性:要麼全部完成,要麼全部不完成
一致性:事務前後的數據完整性要保證一致,1000
持久性:事務一旦提交則不可逆,被持久化到資料庫中!
隔離性:事務的隔離性是多個用戶併發訪問資料庫時,資料庫為每一個用戶開啟的事務,不能被其他事務的操作數據所千擾,多個併發事務之間要相互隔離
CREATE DATABASE shop CHARACTER set utf8 COLLATE utf8_general_ci
use shop
CREATE TABLE `account`(
`id` int(3) not null auto_increment,
`name` VARCHAR(30) not null,
`money` DECIMAL(9,2) not null,
PRIMARY key (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO account(`name`,`money`)
VALUES('A',2000.00),('B',1000.00) -- 金額必須保留兩位小數
-- 模擬轉賬:事務
set autocommit =0;-- 關閉自動提交
START TRANSACTION -- 開啟一個事務
UPDATE account set money=money-500 WHERE `name` ='A'-- A減500
UPDATE account set money=money+500 WHERE `name` ='B'-- B加500
COMMIT; -- 提交事務
ROLLBACK; -- 回滾 --navicat 需要提交事務才能看到結果
set autocommit = 1;
7、索引
mysql 官方對索引的定義為:索引是幫助mysql 高效獲取數據的數據結構。提取句子主幹,就可以得到索引的本質:索引是數據結構
索引的分類
- 主鍵索引(primary key)
- 主鍵不可重覆
- 唯一索引(unique key)
- 避免重覆的列出現,唯一索引可以重覆,多個列都可以標識位 - 常規索引(key/inedex)
- 全文索引 FULLTEXT
-- 索引的使用
-- 1、在創建表的時候給欄位增加索引
-- 2、創建完畢後增加索引
SHOW INDEX FROM student -- 顯示所有的索引信息
-- 增加一個全文索引 (索引名) 列名
ALTER TABLE school.student add FULLTEXT INDEX `haibai`(`StudentName`)
-- explain 分析sql執行的狀況
explain select * from student; -- 非全文索引 5列
EXPLAIN SELECT * from student where MATCH(StudentName) against('趙'); -- 全文索引
8、 許可權管理和備份
8.1、用戶管理
SQL可視化管理
-- 創建用戶
CREATE USER haibai IDENTIFIED BY '123456'
-- 修改密碼(修改當前用戶密碼)
SET PASSWORD = PASSWORD('123456')
-- 修改密碼(修改指定用戶密碼)
SET PASSWORD FOR haibai = PASSWORD('123456')
-- 錯位重命名 RENAME USER 原用戶名 TO 新用戶名
RENAME user haibai to bobohai; -- 版本不一致這裡會報錯 需要添加@%
-- 正確重命名
rename user'haibai'@'localhost'to'haibai2'@'localhost';
-- 用戶授權 grant all privileges(全部許可權)庫, 表 to用戶
-- all privileges 除了給別人授權 其他都能幹
GRANT all PRIVILEGES on *.* to haibai2@localhost
-- 查詢許可權 show grants for 用戶
show grants for 'haibai2'@'localhost' -- 查看指定用戶的許可權
show grants for 'root'@'localhost' -- 查看root用戶許可權
-- 撤銷許可權 REVOKE 許可權,在哪個庫,哪個表撤銷,給誰撤銷
REVOKE ALL PRIVILEGES ON *.* FROM haibai2@localhost
-- 刪除用戶
drop user haibai2@localhost
8.2、mysql備份
為什麼要備份:
- 保證重要的數據不丟失
- 數據轉移
mysql資料庫備份方式
- 直接拷貝物理文件
- 在可視化工具上導出
- 使用命令行導出mysqldump 命令行cmd才叫命令行
-- mysqldump -hlocalhost -uroot -p123456 school student >F:/mysqlwenjian/1.sql
-- mysqldup -h主機 —u用戶名 -p密碼 資料庫表名 >到F盤mysqlwenjian物理磁碟 重命名為1.sql
-- 導入多張表
-- mysqldup -h主機 —u用戶名 -p密碼 資料庫表名1 表名2 表名3 >到F盤mysqlwenjian物理磁碟 重命名為1.sql
-- 導入資料庫
-- mysqldump -hlocalhost -uroot -p123456 school >F:/mysqlwenjian/10.sql
-- source f:/mysqkwenjian/2.sql 導入文件
9、規範資料庫設計
9.1、為什麼需要設計
當資料庫比較複雜的時候,就需要設計了
糟糕的資料庫設計:
- 數據冗餘,浪費空間
- 數據的插入和刪除都會麻煩、異常【避免使用物理外鍵】
- 程式的性能差
良好的資料庫設計:
- 節省記憶體空間
- 保證資料庫的完整性
- 方便開發系統
軟體開發中,關於資料庫的設計
- 分析需求:分析業務和需要處理的資料庫的需求
- 概要設計:設計關係圖E-R圖
設計資料庫的步驟:(個人博客)
-
收集信息,分析需求
- 用戶表(用戶登錄註銷,用戶的個人信息,寫博客,創建分類)
- 分類表(文章分類,誰創建的)
- 文章表(文章的信息)
- 評論表
- 友鏈表(友鏈信息)
- 自定義表(系統信息,某個關鍵的字,或者一些主欄位)key : value
- 說說表(發表心情.. id... content....create_time)
-
標識實體(把需求落地到每個欄位)
-
標識實體 之間的關係
- 寫博客:user--> blog
- 創建分類:user -> category
- 關註:user-> user
9.2三大範式
為什麼需要數據規範化
- 信息重覆
- 更新異常
- 插入異常
- 無法正常顯示信息
- 刪除異常
- 丟失有效的信息
範式
第一範式(1NF)
原子性:保證每個列不可以再分
第二範式(2NF)
前提:滿足第一範式
每張表只表示一件事
第三範式(3NF)
前提:滿足第一範式
前提:滿足第二範式
第三範式需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。
規範性 和 性能的問題
關聯查詢的表不要超過三張
- 考慮商業化的需求和目標,(成本,用戶體驗!)資料庫的性能更加重要
- 在規範性能的問題的時候,需要適當考慮一下規範性!
- 故意給某些表增加一些冗餘的欄位。(從多表查詢中變為單表查詢)
- 故意增加一些計算列(從大數據量降低為小數據量的查詢:索引)
10、JDBC
10.1資料庫驅動
驅動:音效卡、顯卡、資料庫
10.2 JDBC
Sun公司為了簡化開發人員對資料庫的統一的操作,提供了一個(java操作資料庫)規範,JDBC
這些規範的實現有具體的廠商去做
對於開發人員來說,我們只需要掌握JDBC的介面操作即可
10.3、第一個JDBC程式
創建測試資料庫
1.創建一個普通項目
2.導入資料庫驅動
步驟總結:
1、載入驅動
2、鏈接資料庫DriverManager
3、執行sql的對象
4、獲得返回的結果集
5、釋放鏈接
//我的第一個jdbc程式
public class JdbcFirstDemo {
public static void main(String[] args) throws Exception {
//1.載入驅動
Class.forName("com.mysql.jdbc.Driver");
//2.用戶信息和url
String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
String username = "root";
String password="123456";
//3.鏈接成功,資料庫對象
Connection connection = DriverManager.getConnection(url, username, password);
//4執行SQL的對象 statement
Statement statement = connection.createStatement();
//5.執行sql的對象去執行sql
String sql = "select *from users";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.println("id="+resultSet.getObject("id"));
System.out.println("NAME="+resultSet.getObject("NAME"));
System.out.println("PASSWORD="+resultSet.getObject("PASSWORD"));
System.out.println("email="+resultSet.getObject("email"));
System.out.println("birthday="+resultSet.getObject("birthday"));
}
resultSet.close();
statement.close();
connection.close();
}
}
步驟總結:
1、載入驅動
2、連接資料庫 DriverManager
3、獲得執行sql的對象Statement
4、獲得返回的結果集
5、釋放連接
DriverManager
//DriverManager.registerDriver(new com.mysql.jdbc.Driver(0));
Class.forName("com.mysql.jdbc.Driver");//固定寫法,載入驅動
Connection connection = DriverManager.getConnection(url, username, password);
//connection 代表資料庫
//資料庫設置自動提交
//事務提交
//事務滾回
resultSet.close();
statement.close();
connection.close();
URL
String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
//mysql --3306
//協議://主機地址:埠號/資料庫名?參數1&參數2&參數3
// oralce --1521
// jdcbc:oracle:thin:@localhost:1521:sid
10.4、statement對象
jdbc中的statement對象用於向資料庫發送SQL語句,想完成對資料庫的增刪改查,只需要通過這個對象向資料庫發送增刪改查語句即可。
statement對象的executeupdate方法,用於向資料庫發送增、刪、改的sql語句,executeupdate執行完後,將會返回一個整數(即增刪改語句導致了資料庫幾行數據發送了變化)。
statement.executeQuery方法用於向資料庫發送查詢語句,executeQuery方法返回代表查詢的結果的ResultSet對象
CRUD操作-create
使用executeUpdate(String sql)方法完成數據添加操作,示列操作:
Statement st= com.createStement();
String sql ="insert into user(...) values(...)";
int num= st.executeUpdate(sql);
if(num>0){
System.out.println("插入成功!!!");
}
CRUD操作-delete
使用executeUpdate(String sql)方法完成數據刪除操作,示列操作:
Statement st= com.createStement();
String sql ="delete from user where id=1";
int num= st.executeUpdate(sql);
if(num>0){
System.out.println("刪除成功"!!!");
}
CRUD操作-update
使用executeUpdate(String sql)方法完成數據修改操作,示列操作:
Statement st= com.createStement();
String sql ="update user set name='' where name='' ";
int num= st.executeUpdate(sql);
if(num>0){
System.out.println("修改成功"!!!");
}
CRUD操作-read
使用executeQuery(String sql)方法完成數據修改操作,示列操作:
Statement st= com.createStement();
String sql ="select * from user where id=1 ";
int num= st.executeUpdate(sql);
while(rs.next()){
// 根據獲取列數據類型,分別調用rs的相應方法映射到java對象中
}
10.5、使用idea鏈接資料庫
- 點擊database,選擇+號,再點擊date source選擇mysql
- 輸入賬號密碼後點擊測試鏈接
- 如出現時區問題:則更改下方
- 寫sql語句的地方
- 修改數據時,回車後,點擊DB提交