日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

SQL数据库的增删改查

發(fā)布時(shí)間:2023/12/9 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL数据库的增删改查 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。