主頁 > 後端開發 > 狂神說mysql筆記

狂神說mysql筆記

2022-10-28 06:39:19 後端開發

1、mysql

基本操作

Windows-->Mysql5.7打開

image-20221025162503535

輸入用戶名和密碼

image-20221025162634084

查看資料庫 :show databases;查詢所有資料庫,記住一定要加分號結尾

這里必須全部為 英文空格 英文符號

image-20220427130923008

選擇 day4_6資料庫:use day4_6;

查看這個資料庫的所有表: show tables;

image-20220427132328032

創建命名為westos的資料庫:create databases westos;

再次查詢所有的資料庫:show databases;

image-20220427133002786

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;

image-20220427150654978

洗掉資料庫

這里創建了一個day4_27的資料庫

image-20220427142934133

在旁邊輸入命令 drop databases day4_27 這里多輸入了一個s 操作不成功

image-20220427143145434

當命令列輸入drop database day4_27;則洗掉成功

image-20220427143317320

使用資料庫

選擇 westos資料庫 :use day4_6;

image-20220427151648308

當資料庫是關鍵字時應該用``兩個飄將他包含例如

image-20220710091204120

查看表結構sql陳述句

show create tbale 表名;

image-20221025163951034

粘貼的陳述句為:

image-20221025164024434

查看資料庫

只執行第二行陳述句 show tables 查看資料庫中的所有表

image-20220710091145145

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

image-20221025170154656

-- ================聯表查詢 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

image-20220716161233355

image-20220716162237424

-- source f:/mysqkwenjian/2.sql  匯入檔案

image-20220716163002926

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資料庫驅動

驅動:聲卡、顯卡、資料庫

image-20221025171443185

10.2 JDBC

Sun公司為了簡化開發人員對資料庫的統一的操作,提供了一個(java操作資料庫)規范,JDBC

這些規范的實作有具體的廠商去做

對于開發人員來說,我們只需要掌握JDBC的介面操作即可

image-20221025171322509

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

image-20220730095920882

  • 輸入賬號密碼后點擊測驗鏈接

image-20220730095739927

  • 如出現時區問題:則更改下方

img

  • 寫sql陳述句的地方

image-20220730100510463

  • 修改資料時,回車后,點擊DB提交

image-20220730100746158

10.6 事務

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521806.html

標籤:其他

上一篇:全球名校AI課程庫(21)| Harvard哈佛 · Python人工智能入門課程『Introduction to Artificial Intelligence with Python』

下一篇:[JSOI2010]連通數

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more