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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL数据库的增删改查

發布時間:2023/12/9 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL数据库的增删改查 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據庫

  • 前言
  • 一、建庫/刪庫
  • 二、建表/刪表
    • 1.添加
    • 2.刪除
    • 3.修改
    • 4.查詢
  • 二、MYSQL函數
    • 1.時間
    • 2.聚合函數
    • 3.聯表查詢


前言

數據庫即數據的倉庫,在數據中提供了專門的管理系統,對數據庫中的數據進行集中的控制和管理。能高效的對數據進行存儲, 檢索 降低存儲數據的冗余度 更高的數據一致性 存儲數據共享 實現數據的安全性 便于維護數據的完整性 建立數據庫所遵循的標準

一、建庫/刪庫

  • 創建數據庫
    CREATE DATABASE db;
  • 刪除數據庫
    DROP DATABASE db;
    默認編碼集為Latin,如果需要插入中文需要編碼集改成utf-8

二、建表/刪表

  • 建表
    CREATE TABLE t_student(
    – s_id為列名 int表示該列數據類型
    – primary key標識該列為主鍵列
    – auto_increment 表示該列為自動增長列,該列的值由DBMS維護
    s_id INT PRIMARY KEY AUTO_INCREMENT,
    s_name VARCHAR(20), – 姓名
    s_class VARBINARY(20), – 所在班級
    s_birthday DATE, – 生日
    s_grade INT, – 成績
    s_sex ENUM(‘男’,‘女’) – 性別
    );
  • 刪除數據庫表
    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(‘張無忌’,‘j171’,‘2020-09-22’,78,‘女’),
    (‘張青峰’,‘j170’,‘2020-09-23’,67,‘女’);

2.刪除

  • 刪除編號為2,可以刪除表,但是會保留日志,刪除數據可以恢復,從刪除后的id開始增加,效率較低
    DELETE FROM t_student WHERE s_id=2;
  • 刪除表,會把日志里的都刪除了,刪除數據不可恢復,從頭開始,效率較高
    TRUNCATE TABLE t_student;
  • 刪除有重復的數據
    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.修改

  • 修改數據
    UPDATE t_student SET s_class=‘j111’,s_grade=92,s_birthday=‘2020-09-09’ WHERE s_name=‘張青峰’;
  • 修改數據二,將j179班 ,成績加2分
    UPDATE t_student SET s_grade=s_grade+2 WHERE s_class=‘j179’;

4.查詢

  • 查詢個別記錄
    SELECT s_name FROM t_student;
  • 查詢所有的信息
    SELECT * FROM t_student;
  • 去重
    – 查詢現在有幾個班(去重)
    distinct表示去除重復記錄
    SELECT DISTINCT s_class FROM t_student;
    WHERE
  • 查詢所有j179的學生姓名和生日
    SELECT s_name,s_birthday FROM t_student WHERE s_class=‘j179’;
    LIMIT
  • 返回限定行,顯示前三個學生信息 0表示從0開始顯示,3表示顯示3條,一般在分頁用
    SELECT * FROM t_student LIMIT 0,3;
    between and
    包含80和90
    SELECT * FROM t_student WHERE s_grade BETWEEN 80 AND 90;
    AND / OR
  • 查詢所有成績是良好80-90的學生
    SELECT * FROM t_student WHERE s_grade<=90 AND s_grade >=80;
  • 查詢90后的學生
    SELECT * FROM t_student WHERE s_birthday>=‘1990-01-01’ AND s_birthday<=‘2000-01-01’;
  • 查詢j172和j179的學生
    SELECT * FROM t_student WHERE s_class=‘j172’ OR s_class=‘j179’;
    CONCAT
  • 查詢時連接 更改列表明as 從s_grade 改為grade
    SELECT s_name ,CONCAT(‘共’,s_grade,‘分’)AS grade FROM t_student;
    IN / NOT IN
  • 查詢值在/不在指定集合的記錄
  • 查詢J178和j172的學生
    SELECT * FROM t_student WHERE s_class IN(‘j172’,‘j178’);
  • 查詢不屬于J172和j179的學生
    SELECT * FROM t_student WHERE s_class NOT IN(‘j172’,‘j178’);
  • 模糊查詢
  • 查詢姓張的 %匹配0個到多個
    SELECT * FROM t_student WHERE s_name LIKE ‘張%’;
  • _ 匹配單個字符
    SELECT * FROM t_student WHERE s_name LIKE ‘張_’;
    IS NULL
    處理null值,不能用!= = ,只能用is null 或者is not null
  • 查詢缺考的學生
    SELECT * FROM t_student WHERE s_grade IS NULL;
  • 排序
    ORDER BY
  • 排序 將學生按照成績從高到低排列 asc 升序(升序可以不寫) desc 降序
    SELECT * FROM t_student ORDER BY s_grade DESC;
  • 多列排序 將學生按成績從高到低排序,一樣,按生日降序排序
    SELECT * FROM t_student ORDER BY s_grade DESC ,s_birthday DESC;

二、MYSQL函數

1.時間

  • 時間函數
    SELECT NOW(); – 年月日時分秒
    SELECT CURDATE(); – 年月日
    得到指定時間年份
    SELECT YEAR(指定日期);
    得到指定日期后的100天
    SELECT DATE_ADD(NOW(),INTERVAL 100 DAY);
    算兩個日期的差值
    SELECT TIMESTAMPDIFF(DAY,NOW(),‘2020-10-01’);
  • 條件判斷
    case when then when end
    – 顯示所有商品100以下低價商品,100-600中價商品,600以上高價商品
    SELECT p.,(CASE WHEN p_price<100 THEN ‘低價商品’
    WHEN p_price>100 AND p_price<600 THEN ‘中價商品’
    ELSE ‘高價商品’ END)info FROM t_product p;
    – 將所有食品類商品價格上漲2元,藥品價格上漲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,‘低價產品’,‘高價產品’)) AS info FROM t_product p; – 給表加別名
SELECT p.,(IF(DATE_ADD(p_createDate,INTERVAL p_valid DAY)<NOW(),‘過期商品’,‘未過期商品’)) state FROM t_product p;
SELECT p.*,(IF(TIMESTAMPDIFF(DAY,p_createDate,NOW())>p_valid,‘過期商品’,‘未過期商品’))info FROM t_product p;

2.聚合函數

  • count():統計行的數量
    – 統計有多少商品 COUNT() 表示所有符合條件商品,包括null
    SELECT COUNT() FROM t_product;
    – 統計有多少商品有廠家 count(列名) 只統計非空列
    SELECT COUNT(p_factory) FROM t_product;
    – 統計有幾個類別 count(distinct 列名) 去除重復列值,統計行的數量
    SELECT COUNT(DISTINCT p_type) FROM t_product;
  • sum():統計某個列的綜合
    – 統計所有食品類的總價格
    SELECT SUM(p_price),AVG(p_price) FROM t_product WHERE p_type=‘食品類’;
  • avg():統計某個列的平均值
    – 統計所有食品類的平均價格
    SELECT AVG(p_price),SUM(p_price)/COUNT(*) FROM t_product WHERE p_type=‘食品類’;
    avg():只統計非空列
    max():統計某個列的最大值
    – 顯示價格最高,最低商品
    SELECT MAX(p_price),MIN(p_price) FROM t_product;
  • max()min():
    不統計空值null
    min():統計某個列的最小值
    – 顯示價格最高,最低商品
    SELECT MAX(p_price),MIN(p_price) FROM t_product;
    max()min():不統計空值null
  • 分組
    將某個列值相同的記錄分成一個組,在進行數據運算
    GROUP BY
    select count() from 表名 group by 分組列
    – 統計每個類別的商品有多少種
    SELECT p_type,COUNT() FROM t_product GROUP BY p_type;
    多列分組:只有兩個或多個列值完全相同的記錄,才分成一個組
    分組查詢后,查詢列只能出現分組列和聚合函數
    where 和HAVING區別:
    where執行分組之前,不能使用聚合函數
    having執行在分組之后,是對分組的結構進行篩選,只能使用聚合函數
    – 查詢類別商品數量在2個以上的類別
    SELECT p_type,COUNT() FROM t_product GROUP BY p_type HAVING COUNT()>2;
    – 查詢平均價格在1000以下
    SELECT p_type,AVG(p_price)FROM t_product GROUP BY p_type HAVING AVG(p_price)<1000;
  • 子查詢
    在一個查詢語句中,再嵌入一個查詢,稱為子查詢
    在子查詢中,如果返回單行單列,外查詢可以使用<,>,<= … 比較運算符
  • 查詢比海之藍生產日期更早的商品
    SELECT * FROM t_product WHERE p_createDate<
    (SELECT p_createDate FROM t_product WHERE p_name=‘海之藍’);
  • 查詢最貴的商品
    SELECT * FROM t_product WHERE p_price=
    (SELECT MAX(p_price) FROM t_product);
  • 查詢海之藍更貴的酒
    SELECT * FROM t_product WHERE p_price>
    (SELECT p_price FROM t_product WHERE p_name=‘海之藍’);
    如果子查詢返回的是多行單列,外查詢比較運算符只能使用in或者not in
  • 顯示每個部門最高工資的員工
    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);

  • 臨時表
    是嵌入在from后面的子查詢,也就是將子查詢的查詢結果,當做是一個表來使用
    注意臨時表創建時必須加別名
    SELECT * FROM (SELECT e_name,e_money FROM t_employee em)a;
  • ALL運算符
    和子查詢結果逐一作比較,必須全部滿足時表達式的值才為真
    查詢比張三的所有成績都要高學生成績信息

select * from t_student where 分數>
ALL (select 分數 from t_student where 姓名=‘張三’);

  • ANY運算符
    和子查詢的結果逐一比較,其中一條記錄滿足條件則表達式的值就為真
    查詢比張三的某一科成績高的其他學生

select * from t_student where 分數>
ANY (select 分數 from t_student where 姓名=‘張三’)
and 姓名 != ‘張三’;

  • exists
    exists判斷子查詢是否存在數據,如果存在則表達式為真,反之為假。not exists 相反
    exists 和in 功能類似,可以互換
    exists與in的使用效率的問題,通常采用exists要比in效率高,因為in不走索引,但要實際情況具體使用
  • UNION
    用于連接連個查詢語句的查詢結果
    – 查詢市場部和行政部工資最高的兩個員工
    (SELECT * FROM t_employee WHERE e_dept=‘市場部’ ORDER BY e_money DESC LIMIT 0,2)
    UNION
    (SELECT * FROM t_employee WHERE e_dept=‘行政部’ ORDER BY e_money DESC LIMIT 0,2);
  • 分類
  • 相關子查詢
    子查詢的執行需要依賴于外查詢,外查詢執行一次,子查詢就要執行一次,效率低
  • 非相關子查詢
    子查詢可以單獨執行,子查詢不需要依賴與外查詢,子查詢的結果不會改變。執行效率高

3.聯表查詢

  • 將兩個表中的數據,使用查詢語句同時顯示在查詢結果中
  • 聯表查詢采用笛卡爾乘積實現,將一個表中所有記錄和另一個表中所有記錄一一關聯
  • 顯示主表從表信息
  • 顯示所有的汽車以及汽車主人的姓名
    SELECT c.*,m.m_name FROM t_car c JOIN t_man m ON c.fk_manId=m.pk_id; – 只能用于內連接
  • 等價于
    SELECT c.*,m.m_name FROM t_car c,t_man m WHERE c.fk_manId=m.pk_id;
  • 分類
  • 內聯接
  • 只能查詢兩個表之間有對應記錄的數據
    select 查詢列 from 表一,表二 where 主鍵=外鍵
    select 查詢列 from 表一 join 表二on 主鍵= 外鍵
  • 顯示所有的主人,顯示每個主人的汽車數量
    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;
  • 外聯接
  • 可以查詢一個表中所有記錄,無論該記錄是否有對應的記錄
    select 查詢 from 表一 left join 表二 on 主鍵=外鍵
  • 顯示所有的主人,顯示每個主人的汽車數量
    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;
  • 自聯接
    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,‘李通’,‘常務經理’,100),(102,‘周軍’,‘銷售經理’,100),
    (103,‘周勇’,‘業務員’,102),(104,‘劉紅’,‘業務員’,102),(105,‘何軍’,‘業務員’,102),
    (106,‘馬處’,‘會計’,101),(107,‘劉紅’,‘文員’,101);

SELECT * FROM t_em;

  • 列出所有員工的姓名和職位,以及上級領導的姓名
    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;
  • 多對多查詢
    語法:select 查詢列 from 表一 join 中間表 on
    中間表外鍵=表一主鍵 join 表二 on 中間表外鍵=表二主鍵

總結

以上是生活随笔為你收集整理的SQL数据库的增删改查的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。