SQL数据库的增删改查
數(shù)據(jù)庫(kù)
- 前言
- 一、建庫(kù)/刪庫(kù)
- 二、建表/刪表
- 1.添加
- 2.刪除
- 3.修改
- 4.查詢
- 二、MYSQL函數(shù)
- 1.時(shí)間
- 2.聚合函數(shù)
- 3.聯(lián)表查詢
前言
數(shù)據(jù)庫(kù)即數(shù)據(jù)的倉(cāng)庫(kù),在數(shù)據(jù)中提供了專門的管理系統(tǒng),對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行集中的控制和管理。能高效的對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ), 檢索 降低存儲(chǔ)數(shù)據(jù)的冗余度 更高的數(shù)據(jù)一致性 存儲(chǔ)數(shù)據(jù)共享 實(shí)現(xiàn)數(shù)據(jù)的安全性 便于維護(hù)數(shù)據(jù)的完整性 建立數(shù)據(jù)庫(kù)所遵循的標(biāo)準(zhǔn)一、建庫(kù)/刪庫(kù)
- 創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE db; - 刪除數(shù)據(jù)庫(kù)
DROP DATABASE db;
默認(rèn)編碼集為L(zhǎng)atin,如果需要插入中文需要編碼集改成utf-8
二、建表/刪表
- 建表
CREATE TABLE t_student(
– s_id為列名 int表示該列數(shù)據(jù)類型
– primary key標(biāo)識(shí)該列為主鍵列
– auto_increment 表示該列為自動(dòng)增長(zhǎng)列,該列的值由DBMS維護(hù)
s_id INT PRIMARY KEY AUTO_INCREMENT,
s_name VARCHAR(20), – 姓名
s_class VARBINARY(20), – 所在班級(jí)
s_birthday DATE, – 生日
s_grade INT, – 成績(jī)
s_sex ENUM(‘男’,‘女’) – 性別
); - 刪除數(shù)據(jù)庫(kù)表
DROP TABLE t_student;
1.添加
- 添加表記錄
INSERT INTO t_student(s_name,s_class,s_birthday,s_grade,s_sex)
VALUES(‘張三’,‘j179’,‘1998-09-20’,90,‘男’); - 如何添加多條記錄
INSERT INTO t_student(s_name,s_class,s_birthday,s_grade,s_sex)
VALUES(‘張無(wú)忌’,‘j171’,‘2020-09-22’,78,‘女’),
(‘張青峰’,‘j170’,‘2020-09-23’,67,‘女’);
2.刪除
- 刪除編號(hào)為2,可以刪除表,但是會(huì)保留日志,刪除數(shù)據(jù)可以恢復(fù),從刪除后的id開始增加,效率較低
DELETE FROM t_student WHERE s_id=2; - 刪除表,會(huì)把日志里的都刪除了,刪除數(shù)據(jù)不可恢復(fù),從頭開始,效率較高
TRUNCATE TABLE t_student; - 刪除有重復(fù)的數(shù)據(jù)
DELETE FROM t_employee WHERE pk_id NOT IN
(SELECT * FROM(SELECT MIN(pk_id) FROM t_employee GROUP BY e_name,e_dept,e_money) X);
3.修改
- 修改數(shù)據(jù)
UPDATE t_student SET s_class=‘j111’,s_grade=92,s_birthday=‘2020-09-09’ WHERE s_name=‘張青峰’; - 修改數(shù)據(jù)二,將j179班 ,成績(jī)加2分
UPDATE t_student SET s_grade=s_grade+2 WHERE s_class=‘j179’;
4.查詢
- 查詢個(gè)別記錄
SELECT s_name FROM t_student; - 查詢所有的信息
SELECT * FROM t_student; - 去重
– 查詢現(xiàn)在有幾個(gè)班(去重)
distinct表示去除重復(fù)記錄
SELECT DISTINCT s_class FROM t_student;
WHERE - 查詢所有j179的學(xué)生姓名和生日
SELECT s_name,s_birthday FROM t_student WHERE s_class=‘j179’;
LIMIT - 返回限定行,顯示前三個(gè)學(xué)生信息 0表示從0開始顯示,3表示顯示3條,一般在分頁(yè)用
SELECT * FROM t_student LIMIT 0,3;
between and
包含80和90
SELECT * FROM t_student WHERE s_grade BETWEEN 80 AND 90;
AND / OR - 查詢所有成績(jī)是良好80-90的學(xué)生
SELECT * FROM t_student WHERE s_grade<=90 AND s_grade >=80; - 查詢90后的學(xué)生
SELECT * FROM t_student WHERE s_birthday>=‘1990-01-01’ AND s_birthday<=‘2000-01-01’; - 查詢j172和j179的學(xué)生
SELECT * FROM t_student WHERE s_class=‘j172’ OR s_class=‘j179’;
CONCAT - 查詢時(shí)連接 更改列表明as 從s_grade 改為grade
SELECT s_name ,CONCAT(‘共’,s_grade,‘分’)AS grade FROM t_student;
IN / NOT IN - 查詢值在/不在指定集合的記錄
- 查詢J178和j172的學(xué)生
SELECT * FROM t_student WHERE s_class IN(‘j172’,‘j178’); - 查詢不屬于J172和j179的學(xué)生
SELECT * FROM t_student WHERE s_class NOT IN(‘j172’,‘j178’); - 模糊查詢
- 查詢姓張的 %匹配0個(gè)到多個(gè)
SELECT * FROM t_student WHERE s_name LIKE ‘張%’; - _ 匹配單個(gè)字符
SELECT * FROM t_student WHERE s_name LIKE ‘張_’;
IS NULL
處理null值,不能用!= = ,只能用is null 或者is not null - 查詢?nèi)笨嫉膶W(xué)生
SELECT * FROM t_student WHERE s_grade IS NULL; - 排序
ORDER BY - 排序 將學(xué)生按照成績(jī)從高到低排列 asc 升序(升序可以不寫) desc 降序
SELECT * FROM t_student ORDER BY s_grade DESC; - 多列排序 將學(xué)生按成績(jī)從高到低排序,一樣,按生日降序排序
SELECT * FROM t_student ORDER BY s_grade DESC ,s_birthday DESC;
二、MYSQL函數(shù)
1.時(shí)間
- 時(shí)間函數(shù)
SELECT NOW(); – 年月日時(shí)分秒
SELECT CURDATE(); – 年月日
得到指定時(shí)間年份
SELECT YEAR(指定日期);
得到指定日期后的100天
SELECT DATE_ADD(NOW(),INTERVAL 100 DAY);
算兩個(gè)日期的差值
SELECT TIMESTAMPDIFF(DAY,NOW(),‘2020-10-01’); - 條件判斷
case when then when end
– 顯示所有商品100以下低價(jià)商品,100-600中價(jià)商品,600以上高價(jià)商品
SELECT p.,(CASE WHEN p_price<100 THEN ‘低價(jià)商品’
WHEN p_price>100 AND p_price<600 THEN ‘中價(jià)商品’
ELSE ‘高價(jià)商品’ END)info FROM t_product p;
– 將所有食品類商品價(jià)格上漲2元,藥品價(jià)格上漲5元,酒類上漲10元
SELECT p.,(CASE WHEN p_type=‘食品類’ THEN p_price+2
WHEN p_type=‘藥品類’ THEN p_price+5
ELSE p_price+10 END)price FROM t_product p;
UPDATE t_product SET p_price=p_price+(
CASE WHEN p_type=‘食品類’ THEN 2
WHEN p_type=‘藥品類’ THEN 5
ELSE 10 END
);
if
SELECT p.,(IF(p_price<100,‘低價(jià)產(chǎn)品’,‘高價(jià)產(chǎn)品’)) AS info FROM t_product p; – 給表加別名
SELECT p.,(IF(DATE_ADD(p_createDate,INTERVAL p_valid DAY)<NOW(),‘過(guò)期商品’,‘未過(guò)期商品’)) state FROM t_product p;
SELECT p.*,(IF(TIMESTAMPDIFF(DAY,p_createDate,NOW())>p_valid,‘過(guò)期商品’,‘未過(guò)期商品’))info FROM t_product p;
2.聚合函數(shù)
- count():統(tǒng)計(jì)行的數(shù)量
– 統(tǒng)計(jì)有多少商品 COUNT() 表示所有符合條件商品,包括null
SELECT COUNT() FROM t_product;
– 統(tǒng)計(jì)有多少商品有廠家 count(列名) 只統(tǒng)計(jì)非空列
SELECT COUNT(p_factory) FROM t_product;
– 統(tǒng)計(jì)有幾個(gè)類別 count(distinct 列名) 去除重復(fù)列值,統(tǒng)計(jì)行的數(shù)量
SELECT COUNT(DISTINCT p_type) FROM t_product; - sum():統(tǒng)計(jì)某個(gè)列的綜合
– 統(tǒng)計(jì)所有食品類的總價(jià)格
SELECT SUM(p_price),AVG(p_price) FROM t_product WHERE p_type=‘食品類’; - avg():統(tǒng)計(jì)某個(gè)列的平均值
– 統(tǒng)計(jì)所有食品類的平均價(jià)格
SELECT AVG(p_price),SUM(p_price)/COUNT(*) FROM t_product WHERE p_type=‘食品類’;
avg():只統(tǒng)計(jì)非空列
max():統(tǒng)計(jì)某個(gè)列的最大值
– 顯示價(jià)格最高,最低商品
SELECT MAX(p_price),MIN(p_price) FROM t_product; - max()min():
不統(tǒng)計(jì)空值null
min():統(tǒng)計(jì)某個(gè)列的最小值
– 顯示價(jià)格最高,最低商品
SELECT MAX(p_price),MIN(p_price) FROM t_product;
max()min():不統(tǒng)計(jì)空值null - 分組
將某個(gè)列值相同的記錄分成一個(gè)組,在進(jìn)行數(shù)據(jù)運(yùn)算
GROUP BY
select count() from 表名 group by 分組列
– 統(tǒng)計(jì)每個(gè)類別的商品有多少種
SELECT p_type,COUNT() FROM t_product GROUP BY p_type;
多列分組:只有兩個(gè)或多個(gè)列值完全相同的記錄,才分成一個(gè)組
分組查詢后,查詢列只能出現(xiàn)分組列和聚合函數(shù)
where 和HAVING區(qū)別:
where執(zhí)行分組之前,不能使用聚合函數(shù)
having執(zhí)行在分組之后,是對(duì)分組的結(jié)構(gòu)進(jìn)行篩選,只能使用聚合函數(shù)
– 查詢類別商品數(shù)量在2個(gè)以上的類別
SELECT p_type,COUNT() FROM t_product GROUP BY p_type HAVING COUNT()>2;
– 查詢平均價(jià)格在1000以下
SELECT p_type,AVG(p_price)FROM t_product GROUP BY p_type HAVING AVG(p_price)<1000; - 子查詢
在一個(gè)查詢語(yǔ)句中,再嵌入一個(gè)查詢,稱為子查詢
在子查詢中,如果返回單行單列,外查詢可以使用<,>,<= … 比較運(yùn)算符 - 查詢比海之藍(lán)生產(chǎn)日期更早的商品
SELECT * FROM t_product WHERE p_createDate<
(SELECT p_createDate FROM t_product WHERE p_name=‘海之藍(lán)’); - 查詢最貴的商品
SELECT * FROM t_product WHERE p_price=
(SELECT MAX(p_price) FROM t_product); - 查詢海之藍(lán)更貴的酒
SELECT * FROM t_product WHERE p_price>
(SELECT p_price FROM t_product WHERE p_name=‘海之藍(lán)’);
如果子查詢返回的是多行單列,外查詢比較運(yùn)算符只能使用in或者not in - 顯示每個(gè)部門最高工資的員工
SELECT * FROM t_employee WHERE e_money IN
(SELECT MAX(e_money) FROM t_employee GROUP BY e_dept);
SELECT * FROM t_employee e1 WHERE e_money IN
(SELECT MAX(e_money) FROM t_employee e2 WHERE e1.e_dept=e2.e_dept GROUP BY e_dept);
- 臨時(shí)表
是嵌入在from后面的子查詢,也就是將子查詢的查詢結(jié)果,當(dāng)做是一個(gè)表來(lái)使用
注意臨時(shí)表創(chuàng)建時(shí)必須加別名
SELECT * FROM (SELECT e_name,e_money FROM t_employee em)a; - ALL運(yùn)算符
和子查詢結(jié)果逐一作比較,必須全部滿足時(shí)表達(dá)式的值才為真
查詢比張三的所有成績(jī)都要高學(xué)生成績(jī)信息
select * from t_student where 分?jǐn)?shù)>
ALL (select 分?jǐn)?shù) from t_student where 姓名=‘張三’);
- ANY運(yùn)算符
和子查詢的結(jié)果逐一比較,其中一條記錄滿足條件則表達(dá)式的值就為真
查詢比張三的某一科成績(jī)高的其他學(xué)生
select * from t_student where 分?jǐn)?shù)>
ANY (select 分?jǐn)?shù) from t_student where 姓名=‘張三’)
and 姓名 != ‘張三’;
- exists
exists判斷子查詢是否存在數(shù)據(jù),如果存在則表達(dá)式為真,反之為假。not exists 相反
exists 和in 功能類似,可以互換
exists與in的使用效率的問(wèn)題,通常采用exists要比in效率高,因?yàn)閕n不走索引,但要實(shí)際情況具體使用 - UNION
用于連接連個(gè)查詢語(yǔ)句的查詢結(jié)果
– 查詢市場(chǎng)部和行政部工資最高的兩個(gè)員工
(SELECT * FROM t_employee WHERE e_dept=‘市場(chǎng)部’ ORDER BY e_money DESC LIMIT 0,2)
UNION
(SELECT * FROM t_employee WHERE e_dept=‘行政部’ ORDER BY e_money DESC LIMIT 0,2); - 分類
- 相關(guān)子查詢
子查詢的執(zhí)行需要依賴于外查詢,外查詢執(zhí)行一次,子查詢就要執(zhí)行一次,效率低 - 非相關(guān)子查詢
子查詢可以單獨(dú)執(zhí)行,子查詢不需要依賴與外查詢,子查詢的結(jié)果不會(huì)改變。執(zhí)行效率高
3.聯(lián)表查詢
- 將兩個(gè)表中的數(shù)據(jù),使用查詢語(yǔ)句同時(shí)顯示在查詢結(jié)果中
- 聯(lián)表查詢采用笛卡爾乘積實(shí)現(xiàn),將一個(gè)表中所有記錄和另一個(gè)表中所有記錄一一關(guān)聯(lián)
- 顯示主表從表信息
- 顯示所有的汽車以及汽車主人的姓名
SELECT c.*,m.m_name FROM t_car c JOIN t_man m ON c.fk_manId=m.pk_id; – 只能用于內(nèi)連接 - 等價(jià)于
SELECT c.*,m.m_name FROM t_car c,t_man m WHERE c.fk_manId=m.pk_id; - 分類
- 內(nèi)聯(lián)接
- 只能查詢兩個(gè)表之間有對(duì)應(yīng)記錄的數(shù)據(jù)
select 查詢列 from 表一,表二 where 主鍵=外鍵
select 查詢列 from 表一 join 表二on 主鍵= 外鍵 - 顯示所有的主人,顯示每個(gè)主人的汽車數(shù)量
SELECT m.*,COUNT(c.pk_id) FROM t_man m JOIN t_car c ON m.pk_id=c.fk_manId
GROUP BY m.pk_id; - 外聯(lián)接
- 可以查詢一個(gè)表中所有記錄,無(wú)論該記錄是否有對(duì)應(yīng)的記錄
select 查詢 from 表一 left join 表二 on 主鍵=外鍵 - 顯示所有的主人,顯示每個(gè)主人的汽車數(shù)量
SELECT m.*,COUNT(c.pk_id) FROM t_man m LEFT JOIN t_car c ON m.pk_id=c.fk_manId
GROUP BY m.pk_id; - 自聯(lián)接
CREATE TABLE t_em(
pk_id INT PRIMARY KEY,
e_name VARCHAR(20),
e_job VARCHAR(20),
fk_emId INT
);
INSERT INTO t_em(pk_id,e_name,e_job,fk_emId)
VALUES(100,‘胡老板’,‘BOSS’,NULL),
(101,‘李通’,‘常務(wù)經(jīng)理’,100),(102,‘周軍’,‘銷售經(jīng)理’,100),
(103,‘周勇’,‘業(yè)務(wù)員’,102),(104,‘劉紅’,‘業(yè)務(wù)員’,102),(105,‘何軍’,‘業(yè)務(wù)員’,102),
(106,‘馬處’,‘會(huì)計(jì)’,101),(107,‘劉紅’,‘文員’,101);
SELECT * FROM t_em;
- 列出所有員工的姓名和職位,以及上級(jí)領(lǐng)導(dǎo)的姓名
SELECT e1.e_name,e1.e_job,e2.e_name FROM t_em e1 LEFT JOIN t_em e2 ON e1.fk_emId=e2.pk_id; - 多對(duì)多查詢
語(yǔ)法:select 查詢列 from 表一 join 中間表 on
中間表外鍵=表一主鍵 join 表二 on 中間表外鍵=表二主鍵
總結(jié)
以上是生活随笔為你收集整理的SQL数据库的增删改查的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 帆软报表(finereport)图表钻取
- 下一篇: Sql Server设置用户只能查看并访