3.表数据的CRUD
數據的CRUD操作
- 新增數據
- 修改數據
- 刪除數據
- 查詢數據
MySQL數據的命令不區分大小寫
添加數據 INSERT INTO
- 方式一 (不推薦)
此操作要求 錄入的 值的數量必須和 表中的字段數量保持完全一致
要求 錄入值的順序 和 表中字段定義的順序 保持一致 (可以使用 DESC 命令查看表結構字段的順序)
在錄入數據的時候,字符串必須用 單引號 引起來
獲取 當前系統時間 ,可以用 now() 函數 ,如果不需要錄入,以 null 來標識即可
上述添加數據的方式不推薦使用
- 方式二 (推薦且常用)
推薦的寫法
從 插入語句中能夠直觀的看到 要錄入的字段有哪些,可以進行 部分字段值的錄入
字段名在 定義的時候,不需要和數據庫中定義的順序保持一致
值的順序 只需要 和 在 插入命令上的 字段順序保持一致 即可
批量 添加數據
insert into <tableName>(col1, col2, col3, ....) values (val1, val2, val3, .... ), (val1, val2, val3 , ....), (val1, val2, val3, ...), ... ;insert into t_book(id, price, author, book_name, create_time, status) values (3, 30, '辰東', '神墓', now(), '1'), (4, 40, '辰東', '遮天', now(), '1');簡單查詢數據
select * from <tableName> ; -- 查詢表中所有的數據修改數據 UPDATE
- 全表數據進行修改 (不常使用)
- 帶 條件 的數據更新 (常用的操作)
where 條件
適用于 修改、刪除、和查詢
- 關系條件 > , >= , < , <= = 和 != 或者 <>(不等號)
- 邏輯條件 and (與) or(或)
- 枚舉條件 in , not in
- 區間條件 between … and
- 空值查詢 is null / is not null
-
模糊查詢條件 like
%(百分號)_ (下劃線) 匹配 任意 0~ N個字符 匹配 任意 1個字符
刪除數據 DELETE
- 全表刪除
- 帶條件刪除
查詢數據
- 簡單查詢
- 子查詢
- 嵌套查詢
- 集合查詢
- 關聯查詢
簡單查詢
- SELECT 查詢
- 基于表的查詢
- where條件查詢
- group by分組查詢
- having 分組篩選查詢
- order by排序
- limit 分頁查詢
SELECT 查詢
select 1 ; -- 一般是系統進行心跳檢測使用的 select now() ; -- 獲取當前系統時間 select version() ; -- 獲取數據庫版本號 select user() ; -- 獲取 當前登錄的用戶信息基于表的查詢
select <columnName>, <columnName> , ... from <tableName> ;如果要查詢 表中所有的列,可以是用 *來代替
不推薦使用 select * 來查詢數據、因為這種查詢 性能低
再查詢列的時候,還可以給列 設置別名 select as , as 還可以省略不寫
tableName 也可以 設置 別名
where條件查詢
請參考 where條件
group by 分組查詢
- 聚合函數 :將多條記錄進行一個聚合,返回一條記錄, 聚合函數不會對空值參與統計
- 分組 一般都需要配合 聚合函數實現數據的查詢
分組查詢 對查詢的字段 是有要求的
having 分組篩選
-- 查詢 書籍表 中 價格 相同的 價格 select price from t_book group by price having count(1) > 1-- 查詢 書籍表中, 同作者的 書籍平均價格 > 40 的作者信息 select author from t_book group by author having avg(price) >40;where 和 having的區別
where 是對表中的每一條記錄 進行篩選和過濾, having 是對 分組后的結果 進行篩選和過濾
where 比 having 先執行, 能用 where 進行過濾 就不要使用 having 過濾
order by 排序
| 升序,如果不指定排序規則, 默認升序 | 降序 |
當有多個字段進行排序的時候,只有當前面的字段 值相同的時候,才會使用 后面指定的字段進行排序。
limit 分頁查詢
select * from t_book order by price desc limit [<offset>, ] <rows>offset : 查詢數據的偏移量,默認從0開始,可以省略,如果省略, 代表 值為 0
rows : 每頁查詢的條數
offset = (page - 1) * rows , page 代表頁碼
簡單查詢的完整SQL結構
select <coloumnName> .... from <tableName> where <condition> group by column, ... having <condition> order by column <desc|asc> limit offset , rows ;子查詢
- 基于列的子查詢
- 基于條件的子查詢
基于列的子查詢
子查詢 出現在 查詢的列上
-- 查詢 用戶為1 的 手機號,郵箱和真實姓名 select tel ,email, (select real_name from t_user_info where user_id = u.id ) as real_name from t_user u where id = 1;所有的子查詢都必須用 括號 括起來
基于列的子查詢 , 子查詢 必須返回的是 單列 單值
基于條件的子查詢
子查詢出現在 where 條件上
- 關系條件子查詢
關系條件子查詢 返回的是 單列 單值
- in 子查詢
基于 in 條件子查詢,返回的是 單列 多值
- exists 子查詢
子查詢 和 主查詢 在數據上有一定的關聯關系
嵌套查詢
- 將一個查詢的結果、當作一張表、繼續對這個查詢的結果表 進行查詢的過程
在嵌套查詢中,查詢出來的 臨時表 在使用的時候,必須設置 別名
with 臨時表查詢
with temp as (select author, count(1) count from t_book group by author ), temp2 as (select * from t_user where ..... ; ) select * from temp , temp2 ;MySQL 8.0 支持的寫法
集合查詢
- 并集 union 或者 union all
集合查詢 最終查詢的結果 字段名 以 第一個 SQL語句 為準
集合查詢中 連接的多個 查詢語句,查詢的列的個數 和 列的含義 必須保持一一對應
union 會將多個查詢的結果 合并到一塊,自動去除重復的數據
Union all 會將多個查詢的結果 合并到一塊,不會 去重
- 交集 intersect
- 差集 minus
關聯查詢
- 表與表之間如果有關聯關系、或者數據與數據之間有關聯關系,那么可以采用關聯查詢進行數據的查詢
關聯關系
- 一對一
- 一對多/多對一
- 多對多
關系型數據庫 是非常善于處理關聯關系的,那么 關聯關系 主要是通過 外鍵 實現的
一對一(one to one)的關聯關系
一對一的關聯關系 在 生活中,是比較少見的。例如 用戶 和 用戶信息 的關系
一對一的關聯關系 讓 兩個表 形成 主表 和 附表 的關系,通常在 附表 中 維護 主表的關系
一對一的關系維護方式 通常由2種,
? 第一種是 外鍵 + 唯一鍵 實現
? 第二種是 主鍵共享 實現的
外鍵 + 唯一鍵 實現 一對一的關聯關系 create table t_user(id int primary key auto_increment , tel varchar(11) unique not null comment '手機號', password varchar(128) not null comment '密碼' ,email varchar(50) not null comment '郵箱' ,create_time datetime comment '注冊時間', last_login_time datetime comment '最近登錄時間', status tinyint default 1 comment '賬戶狀態, 0 拉黑 -1 刪除' );create table t_user_info (id int primary key auto_increment , real_name varchar(50) comment '真實姓名', nick_name varchar(50) comment '昵稱', -- 維護關系的 外鍵user_id int unique comment '用戶ID', -- 通常需要給 外鍵 添加約束constraint t_user_info_user_fk_user_id foreign key(user_id) references t_user(id) ); 主鍵共享 實現 一對一的關聯關系create table t_user(id int primary key auto_increment , tel varchar(11) unique not null comment '手機號', password varchar(128) not null comment '密碼' ,email varchar(50) not null comment '郵箱' ,create_time datetime comment '注冊時間', last_login_time datetime comment '最近登錄時間', status tinyint default 1 comment '賬戶狀態, 0 拉黑 -1 刪除' );create table t_user_info (id int primary key , -- 不能使用自動增長real_name varchar(50) comment '真實姓名', nick_name varchar(50) comment '昵稱', constraint t_user_info_fk_id foreign key (id) references t_user(id) ) ;一對多(one to many)的關聯關系
- 資源表 —> 資源 和 用戶 是 多對一的 ,一個用戶可以上傳多個資源,而一個資源 一定屬于 某一個用戶上傳的
在 一對多 的關系中, 在 多的一方,維護一 的 一方 的關系
多對多 (many to many)的 關聯關系
- 用戶 和 角色的關系 是 多對多的, 一個用戶 可以安排多個角色, 一個角色下可以由多個用戶
在 多對多的關系中, 通常使用 中間表 來維護關系
數據與數據間的關系
create table t_resource_type(id int primary key auto_increment , type_name varchar(50) comment '資源類型名' ,pid int comment '上一級資源ID' , foreign key(pid) references t_resource_type(id) ) ;關聯查詢
- 左外連接 left [outer] join … on
- 右外連接 right [outer] join … on
- 內連接 [inner] join … on
左連接: 以左表為主表,將相關的數據查詢出來,如果右表沒有相關連的數據,則以 空表示
右連接:以右表為主表,將相關的數據查詢出來,如果左表沒有相關聯數據,則以空表示
內連接:只查詢兩表 具有關聯關系的數據
函數
- 字符串函數
| char_length | char_length(‘完美世界’) // 4 | 獲取字符串長度 |
| concat | concat(‘a’ , ‘b’, ‘c’) // abc | 拼接多個字符串,如果有為 null 的值,結果為 null |
| concat_ws | concat(’-’ , ‘a’, ‘b’, ‘c’) // a-b-c | 以某一個特定分隔符,拼接多個字符串 |
| insert | insert(‘guest’ , 2, 1, ‘wh’) // gwhest | insert(str, pos , len , newstr) 從 pos位置替換 len長度,內容為 newstr |
| lower/lcase | lower(‘ABC’) // abc | 轉小寫 |
| upper / ucase | upper(‘abc’) // ABC | 轉大寫 |
| substr/substring | substr(‘abcd’, 2, 3) // ubs | 從 指定位置,截取多長,如果沒有設置長度,代表截取到尾部 |
| trim/ltrim/rtrim | trim(’ abc ') // abc | 去除前后空格 |
| reverse | reverse(‘abc’) // cba | 反轉字符串 |
- 數學函數
| abs | 求絕對值 | |
| ceil | 向上取整 | |
| floor | 向下取整 | |
| round(x, y) | 四舍五入,保留y 位小數 |
- 日期函數
| now() | 獲取當前系統時間 | |
| month(date) | 獲取月份 | |
| year(date) | 獲取年份 | |
| dayofmonth(date) | 獲取天 | |
| DATE_ADD | DATE_ADD(now() , interval 1 year) | 添加1年 |
| DATE_SUB | DATE_SUB(now() , interval 1 hour) | 減少1小時 |
| DATEDIFF | DATEDIFF(now(), date) | 計算兩個日期間隔的天數 |
| DATE_FORMAT | DATE_FORMAT(date, ‘%Y-%m-%d %H:%i:%s’) | 日期格式化 |
- 條件函數
| if | if(expr , v1, v2) | expr 如果返回true, 取 v1, 否則 取 v2 |
| ifnull | ifnull(expr , v1) | expr如果返回 null, 取 v1, 否則 取 expr |
| case … when | 相當與 多分支條件判斷 |
- 加密函數
| md5 | md5(str) | 對字符串進行 MD5加密 |
視圖View
- 是一個虛擬的表,本質上是一個 SQL查詢語句,是真實表的一個數據映射
- 作用: 1. 簡化查詢, 2. 提高數據的安全性( 和 授權有關 )
視圖的創建
create [or replace] view <viewName> as select .... ;視圖 一般不推薦 刪除數據、修改數據、新增數據
視圖是一個真是表的數據映射,操作數據本質上還是操作 真實的表,
視圖的結果有可能來自 聚合查詢,所以無法進行刪除和修改等操作
刪除視圖
drop view [if exists] <viewName>索引 Index
如果表中的數據過大、那么查詢的速度就會逐漸變慢,所以需要對查詢做優化,
那么索引 是 提高查詢效率的 有效手段之一
索引 是 基于字段的、一張表中索引不是越多越好,因為索引過多,會導致索引維護困難
索引的種類
- 唯一索引 unique
- 普通索引 normal
- 倒排索引 fulltext (全文檢索)
什么樣的字段適合添加索引
- 主鍵 自帶索引
- 唯一鍵自帶 唯一索引
- 外鍵 自帶索引
- 字段 的值 在整個表中 重復概率 很低、適合添加索引
- 經常會出現在 where 條件上的字段 適合添加索引
創建索引
create [unique|fulltext] index <indexName> on <tableName>(columName, ...) ;刪除索引
drop index 索引名 on <tableName> ; alter table <tableName> drop index 索引名 ;分析 SQL 語句
explain select ....索引失效
- 模糊查詢 — 前模糊 會導致 索引失效
- 條件字段上使用 函數 ,會導致索引失效
- != 查詢 也會導致索引失效
總結
以上是生活随笔為你收集整理的3.表数据的CRUD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三方库宏定义冲突解决办法
- 下一篇: 《开天辟地》之《网上冲浪篇》将带你进入一