MySQL學習筆記(4)——(基本的增刪改查)操作數據庫中的表的數據
參考:https://www.bilibili.com/video/BV1NJ411J79W?p=17
1.外鍵(瞭解即可)
表名 | 字段 | 備註 |
---|---|---|
student(學生表) | id;name;age;major | 學號,姓名,年齡,所屬專業 |
major(專業表) | id;name | 專業ID,專業名稱 |
1.1 方式一:建表時給表設置約束
DROP TABLE IF EXISTS `major`;
CREATE TABLE `major` (
`majorid` int(8) NOT NULL DEFAULT '0' COMMENT '專業ID',
`majorname` varchar(50) DEFAULT NULL COMMENT '專業名稱',
PRIMARY KEY (`majorid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 學生表的majorid字段,要去引用專業表的majorid
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(8) NOT NULL DEFAULT '0' COMMENT '學生號',
`majorid` varchar(50) DEFAULT NULL COMMENT '專業名稱',
`age` int(3) DEFAULT NULL COMMENT '學生年齡',
`name` varchar(20) DEFAULT NULL COMMENT '學生姓名',
PRIMARY KEY (`id`),
KEY `FK_majorid`(`majorid`),
CONSTRAINT `FK_majorid` FOREIGH KEY(`majorid`) REFERENCE `major`(`majorid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
核心就兩句:
KEY `FK_majorid`(`majorid`),
CONSTRAINT `FK_majorid` FOREIGH KEY(`majorid`) REFERENCE `major`(`majorid`)
刪除有外鍵關係的表的時候,需要先刪除被引用的表纔可刪除。
1.2 方式二:建表後添加外鍵約束
ALTER TABLE `student`
ADD CONSTRAINT `FK_major_name` FOREIGH KEY(`majorid`) REFERENCE `major`(`majorid`)
1.3 外鍵趨勢:程序實現
以上均爲物理外鍵(即數據庫級別的外鍵),不建議使用,避免數據庫中的表過多造成困擾
建議邏輯外鍵,即從程序上去解決。
阿里巴巴JAVA開發規範中有如下規定:
【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。
2.DML語言:數據庫管理語言(增刪改)
- 插入語句
insert
- 更新語句
update
- 刪除語句
delete
查找爲:DQL 數據庫查詢語言,也是SQL核心⚡️
以下操作的例子即 以下建表sql語句對應的表
DROP TABLE IF EXISTS `major`;
CREATE TABLE `major` (
`majorid` int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '專業ID',
`majorname` varchar(50) DEFAULT NULL COMMENT '專業名稱',
`number` int(4) unsigned DEFAULT 0 COMMENT '專業人數',
PRIMARY KEY (`majorid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.1 插入數據 insert
格式:
插入一行:INSERT INTO 表名([字段名1,字段名2,字段名3]) values(‘值1’,‘值2’,‘值3’…);
插入多行:INSERT INTO 表名([字段名1,字段名2,字段名3]) values(‘值1’,‘值2’,‘值3’…),(‘值1’,‘值2’,‘值3’…);
注意:字段與數據一一對應
--varchar的值用單引號或多引號
-- 單個數據 id爲主鍵但是自增 可省略
INSERT INTO `major`(`majorname`) values("計算機科學與技術");
--一行多個數據
INSERT INTO `major`(`majorid`,`majorname`) values(9,'大數據科學');
-- 多行數據
INSERT INTO `major`(`majorid`,`majorname`) values(6,'網絡工程'),(10,"軟件工程");
2.2 更新數據 update
update 表名 set 字段名=值,[]where[條件]
注意:一定要寫條件!不寫則所有的都會更新
數據庫的列儘量加上``,防止衝突
多個更新的屬性間逗號隔開
--更新一個字段的數據
UPDATE `major` SET `majorname`='物聯網工程' WHERE majorid=9;
--更新一條數據中的多個字段的數據 逗號隔開
UPDATE `major` SET `majorname`='大數據科學',`number`=10 WHERE majorid=9;
在where條件語句中支持以下運算符:
- 等於 =
- 不等於 !=或者<> 可用NOT代替
- 大於,大於等於,小於,小於等於 > >= < <=
- 區間 BETWEEN… AND …
- AND或者&& 兩條件都滿足
- OR或者|| 兩條件滿足一個即可
以下爲SQL語句舉例:
-- where條件語句中運算符舉例
-- 1.等於 =
UPDATE `major` SET `majorname`='物聯網工程' WHERE majorid=9;
-- 2.不等於 !=或者<>
UPDATE `major` SET `majorname`='物聯網工程' WHERE majorid!=9;
UPDATE `major` SET `majorname`='物聯網工程' WHERE NOT majorid=9; -- 與上面語句等價
-- 3.大於,大於等於,小於,小於等於 > >= < <=
UPDATE `major` SET `majorname`='物聯網工程' WHERE majorid>9;
-- 4.區間 BETWEEN... AND ...
UPDATE `major` SET `majorname`='物聯網工程' WHERE majorid BETWEEN 3 AND 5; -- [3,5],3和5都包含
-- 5.AND 兩條件都滿足
UPDATE `major` SET `majorname`='物聯網工程' WHERE majorid < 10 AND number<100;
-- 6.OR 兩條件滿足一個即可
UPDATE `major` SET `majorname`='物聯網工程' WHERE majorid < 10 OR number<100;
除此之外where還可以接like,in,子查詢等,後面select查詢再詳寫。
2.3 刪除數據 delete
delete from 表名 where 條件
一定要加where條件語句,否則會把整個表的數據刪除,僅保留表結構
delete 舉例:
DELETE FROM major WHERE majorid < 10; --把majorid小於10的數據刪除
3.DQL語言 select(核心⚡️)
DATA QUERY LANGUAGE數據查詢語言:數據庫中最核心的操作,使用頻率最高。
3.1 基本的查詢語句(指定查詢字段)
最簡單的格式1:SELECT 字段 FROM 表
-- 查詢所有表中記錄 *爲通配符
SELECT * FROM major;
-- 查詢major表的所有majorname和majorid 逗號隔開即可
SELECT `majorid`,`majorname` FROM major;
-- 別名 AS 給字段或表起個別名
SELECT `majorid` AS ID,`majorname` AS 專業名 FROM major AS m;
-- 拼接字符串函數 CONCAT(a,b)
SELECT CONCAT('**',majorname) AS 專業名 FROM major
-- 去重 DISTINCT關鍵字 使其只出現以此,不會有重複的數據
SELECT DISTINCT `majorname`FROM major;
AS 別名,使用效果:
CONCAT(a,b) 拼接字符串函數,使用效果:
3.2 數據庫其他查詢表達式
MySQL版本查詢函數,算術表達式求值,查詢自增步長,查詢字段支持算數運算
-- 使用函數查詢MySQL數據庫版本
SELECT VERSION();
-- SELECT計算算術表達式
SELECT 20*8+99 AS result;
-- 查詢自增步長
SELECT @@auto_increment_increment;
-- SELECT查詢 字段進行算術運算
SELECT number,number*10 AS 'result of num*10' FROM major;
上述SQL的運行效果如下:
因此SELECT
除了可以查詢字段之外,還可接表達式,如 文本值,列,Null,函數,計算表達式,系統變量…
格式2:select 表達式 from 表
3.3 where子句詳解
where子句作用:檢索數據中符合條件的值
where子句在增刪改查(insert,delete,update,select)的使用是一樣的,這裏只是單獨以select爲例子。
格式3:select 字段/表達式 from 表 where 條件
之前的update章節寫過一點,這裏以表格做總結:
邏輯運算符 (建議使用英文關鍵字) 與 或 非
邏輯運算符寫法 | 使用舉例 | 說明 |
---|---|---|
and 或者 && | …where majorid < 10 AND number<100 | 邏輯與,都滿足才成立 |
or 或者 || | …where majorid < 10 OR number<100 | 邏輯或,滿足其一便可成立 |
not 或者! | …where NOT majorid = 10等價於majorid != 10 | 邏輯非,取反面 |
模糊查詢:比較運算符 (在SQL中運算符不一定是符號)
比較運算符 | 使用舉例 | 說明 |
---|---|---|
IS NULL | where majorname IS NULL | (空值)條件是majorname是NULL的情況下 |
IS NOT NULL | where majorname IS NOT NULL | (非空值)條件是majorname不是NULL的情況下 |
BETWEEN…AND | where number BETWEEN 1 AND 100 | number在1到100之間 |
LIKE | where name LIKE ‘李%’ | SQL匹配,%代表0到任意個字符,_代表一個字符 |
IN | where a in (a1,a2,a3) | 假設a在a1,或a2或a3中的某一個值中,那結果爲真 |
1. IS NULL和IS NOT NULL使用舉例
-- 查詢專業爲空的學生學號和姓名,專業爲varchar類型
SELECT id , name ,major FROM student WHERE major IS NOT NULL;
-- 爲了防止不是NULL 但是 是空字符串的情況
SELECT id , name ,major FROM student WHERE major IS NOT NULL AND major !='';
NULL也就是在字段中存儲NULL值,空值也就是字段中存儲空字符(’’),
空值建議用IS NULL和IS NOT NULL做查詢條件
空字符則建議用算術運算符比較( =或者!=、<、> )
而且空字符(’’)和含有空格的字符是不一樣的(’ ') :
空字符(’’)長度爲0,含有空格的字符(’ ') 長度爲1
關於更多NULL和空字符的區別和細節,大家可以自行搜索查閱。
2. BETWEEN…AND的使用舉例
-- 查詢學號在5到10之間的學生的學號,姓名和專業
SELECT id,name,major FROM student where id BEWEEN 5 AND 10;
3. LIKE關鍵字的使用舉例
關鍵:%代表0到任意個字符,_代表一個字符
-- 查詢名字以李開頭 的同學的姓名和專業
SELECT name,major FROM student where name LIKE '李%' ;
-- 查詢名字以李開頭,但是名字只有兩個字的同學的 名字和專業
SELECT name,major FROM student where name LIKE '李_' ;
-- 查詢名字以李開頭,但是名字只有三個字的同學的 名字和專業
SELECT name,major FROM student where name LIKE '李__' ;
-- 查詢名字中包含 明 字的同學的 名字和專業 %明% 含義:明 前後有任意個數字符
SELECT name,major FROM student where name LIKE '%明%' ;
以上SQL執行效果:
4. IN關鍵字的使用舉例
關鍵:在...裏面
-- 查詢學號爲3,5,9的學生的姓名和專業
SELECT id,name,major FROM student where id IN(3,5,9);
-- 等價於
SELECT id,name,major FROM student where id =3 OR id =5 OR id =9;
IN()
括號當中只能爲具體的值或字符,不能只用%和_這些匹配符
除了這些基本的查詢之外還有聯表查詢,子查詢,嵌套查詢,下篇筆記詳解。