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提交

10.6 事務
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521806.html
標籤:其他
上一篇:全球名校AI課程庫(21)| Harvard哈佛 · Python人工智能入門課程『Introduction to Artificial Intelligence with Python』
下一篇:[JSOI2010]連通數
