??????🔥個人主頁:尋星探路
🎬作者簡介:Java研發方向學習者
📖個人專欄:《從青銅到王者,就差這講數據結構!!!》、?《JAVA(SE)----如此簡單!!!》、《數據庫那些事!!!》
??人生格言:沒有人生來就會編程,但我生來倔強!!!
目錄
一、Create 新增
1、語法
2、示例
2.1單行數據全列插入
2.2單行數據指定列插入
2.3多行數據指定列插入
二、Retrieve 檢索
1、語法
2、示例
2.1構造數據
3、Select
3.1全列查詢
3.2指定列查詢
3.3查詢字段為表達式
3.3.1常量表達式
3.3.2把所有學生的語文成績加10分
3.3.3計算所有學生語文、數學和英語成績的總分
3.4為查詢結果指定別名
3.4.1語法
3.4.2示例
3.5結果去重查詢
4、where條件查詢
4.1語法
4.2比較運算符
4.3邏輯運算符
4.4示例
4.4.1基本查詢
4.4.2AND和OR
4.4.3范圍查詢
4.4.4模糊查詢
4.4.5NULL的查詢
CURD是對數據庫中的記錄進?基本的增刪改查操作:
? Create(創建)
? Retrieve(讀取)
? Update(更新)
? Delete(刪除)
? ? ? ? 作為Java后端開發,未來的主要工作之一就是CRUD
一、Create 新增
1、語法
INSERT [INTO] table_name[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...value_list: value, [, value] ...
2、示例
# 創建?個?于演?的表
create table users (id bigint,name varchar(20) comment '?戶名'
);
2.1單行數據全列插入
????????value_list 中值的數量必須和定義表的列的數量及順序?致
# 插入第一條記錄
insert into users values (1, '張三');# 插入第二條記錄
insert into users values (2, '李四');
#注:
2.2單行數據指定列插入
????????value_list 中值的數量必須和指定列數量及順序?致
# 指定了具體要插?的列
insert into users(id, name) values (3, '王五');
2.3多行數據指定列插入
????????在?條INSERT語句中也可以指定多個value_list,實現?次插入多行數據
# 每個value_list表???數據
insert into users(id, name) values (4, '趙六'), (5, '錢七');
二、Retrieve 檢索
1、語法
SELECT[DISTINCT]select_expr [, select_expr] ...[FROM table_references][WHERE where_condition][GROUP BY {col_name | expr}, ...][HAVING where_condition][ORDER BY {col_name | expr } [ASC | DESC], ... ][LIMIT {[offset,] row_count | row_count OFFSET offset}]
2、示例
2.1構造數據
#創建表結構
CREATE TABLE exam (id BIGINT,name VARCHAR(20) COMMENT '同學姓名',chinese float COMMENT '語?成績',math float COMMENT '數學成績',english float COMMENT '英語成績'
);#插?測試數據
INSERT INTO exam (name, chinese, math, english) VALUES(1, '唐三藏', 67, 98, 56),(2, '孫悟空', 87, 78, 77),(3, '豬悟能', 88, 98, 90),(4, '曹孟德', 82, 84, 67),(5, '劉?德', 55, 85, 45),(6, '孫權', 70, 73, 78),(7, '宋公明', 75, 65, 30);
3、Select
3.1全列查詢
????????查詢所有記錄
# 使? * 可以查詢表中所有列的值
select * from exam;
#注:上述屬于數據庫的危險操作!!!在公司中,會有很多的環境,同樣的代碼不同的環境運行的結果就可能不同,所以select * 在生產環境上執行很可能出現問題!!!
3.2指定列查詢
????????查詢所有?的編號、姓名和語?成績
select id,name,chinese from exam;
????????在select后面的查詢列表中指定希望查詢的列,可以是一個也可以是多個,中間?逗號隔開指定列的順序與表結構中的列的順序無關
3.3查詢字段為表達式
3.3.1常量表達式
# 表達式本?就是?個常數
select id,name,10 from exam;
# 也可以是常量的運算
select id,name,10+1 from exam;
3.3.2把所有學生的語文成績加10分
# 表達式中包含?個字段
select id,name,chinese+10 from exam;
3.3.3計算所有學生語文、數學和英語成績的總分
# 表達式包含多個字段
select id, name, chinese + math + english from exam;
3.4為查詢結果指定別名
3.4.1語法
SELECT column [AS] alias_name [, ...] FROM table_name;
AS 可以省略,別名如果包含空格必須用單引號包裹
3.4.2示例
????????為總分這?列指定別名
#為總分這?列指定別名
select id, name, chinese + math + english as 總分 from exam;
#注:
(1)不僅可以給表達式起別名,還可以給表起別名!!!
(2)起別名是為了增強代碼的可讀性(代碼的可讀性>代碼的高效執行)
3.5結果去重查詢
????????行與行之間去重(記錄和記錄之間去重)
(1)查詢當前所有的數學成績
# 通過觀察有兩條98的記錄
select math from exam;
(2)在結果集中去除重復記錄,可以使用DISTINCT
# 去重查詢
select distinct math from exam;
#注:
(1)使用DISCTINCT去重時,只有查詢列表中所有列的值都相同才會判定為重復
(2)查詢時不加限制條件會返回表中所有結果,如果表中的數據量過大,會把服務器的資源消耗殆盡
(3)在生產環境不要使不加限制條件的查詢
4、where條件查詢
????????查詢的時候,指定條件,符合條件的行被查詢出來,不符合條件的就跳過~~
4.1語法
SELECTselect_expr [, select_expr] ... [FROM table_references]WHERE where_condition
4.2比較運算符
#注:
(1)NULL可以參與運算,但是運算結果都是NULL
(2)(NULL==NULL=>NULL=>false)(NULL<=>NULL=>true)
(3)我們談到區間,大多數時候都是“前閉后開”,但是between and是“前閉后閉”!!!
4.3邏輯運算符
4.4示例
4.4.1基本查詢
????????查詢英語不及格的同學及英語成績(<60)
select name, english from exam where english < 60;
條件查詢執行過程:
????????1)遍歷這個表的每一行數據~~
????????2)把這一行數據, 代入到條件中
????????3)如果條件成立(true),此時把這個行加入到結果集合中,如果條件不成立(false),這一行直接跳過
????????4)當完成所有的遍歷過程之后,此時得到了結果集合,還需要根據 select 指定的列/表達式/別名/去重操作
????????5)再針對結果集合做進一步處理~~
????????查詢語文成績高于英語成績的同學
select name, chinese, english from exam where chinese > english;
????????總分在200分以下的同學
select name, chinese + math + english as 總分 from exam where chinese + math + english < 200;
4.4.2AND和OR
????????查詢語文成績大于80分且英語成績大于80分的同學
select * from exam where chinese > 80 and english > 80;
????????查詢語文成績大于80分或英語成績大于80分的同學
select * from exam where chinese > 80 OR english > 80;
????????觀察AND和OR的優先級
select * from exam where chinese > 80 or math > 70 and english > 70;
select * from exam where (chinese > 80 or math > 70) and english > 70;
? ? ? ? 由此可見,and優先級要更高一些,但是和前面一樣,盡量加括號,不要去記優先級
4.4.3范圍查詢
????????語文成績在[80,90]分的同學及語文成績
# 使?BETWEEN AND 實現
select name, chinese from exam where chinese between 80 and 90;
# 使? AND 實現
select name, chinese from exam where chinese >= 80 and chinese <= 90;
????????數學成績是78或者79或者98或者99分的同學及數學成績
# 使?IN實現
select name, math from exam where math in (78, 79, 98, 99);
# 使?OR實現
select name, math from exam where math = 78 or math = 79 or math = 98 or math = 99;
#注:
? ? ? ? between and 描述的是連續的區間~~
????????in 描述的是離散的集合~~
4.4.4模糊查詢
%:0個或者任意個任意字符
_:1 個任意字符
????????查詢所有姓孫的同學
select * from exam where name like '孫%';
????????查詢姓孫且姓名共有兩個字同學
select * from exam where name like '孫_';
#注:SQL 使用 like 進行模糊匹配, 通常是一個"低效操作"
????????SQL 的模糊匹配功能其實是非常弱的~~
????????編程圈子中,對于模糊匹配, 有一套成熟的解決方案,正則表達式~~
例:
4.4.5NULL的查詢
????????構造數據
# 寫??條數據,英語成績為NULLinsert into exam values (8, '張?', 27, 0, NULL);
????????查詢英語成績為NULL的記錄?????
????????查詢英語成績不為NULL的記錄
# 使?is not null
select * from exam where english is not null;
????????NULL與其他值進?運算結果為NULL
# 觀察結果中的總分
select name, chinese + math + english as 總分 from exam;
#注:
(1)WHERE條件中可以使用表達式,但不能使用別名
(2)AND的優先級高于OR,在同時使用時,建議使用小括號()包裹優先執行的部分
(3)過濾NULL時不要使用等于號(=)與不等于號(!=,<>)
(4)NULL與任何值運算結果都為NULL
????????由于內容較多,會分為多篇講解,預知后續內容,請看后續博客!!!