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

歡迎訪問 生活随笔!

生活随笔

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

数据库

MySQL命令(二)| 表的增删查改、聚合函数(复合函数)、联合查询

發(fā)布時間:2023/12/13 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL命令(二)| 表的增删查改、聚合函数(复合函数)、联合查询 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 新增 (Create)
    • 全列插入
    • 指定列插入
  • 查詢 (Retrieve)
    • 全列查詢
    • 指定列查詢
    • 條件查詢
      • 關(guān)系元素運(yùn)算符
      • 模糊查詢
    • 分頁查詢
    • 去重:DISTINCT
    • 別名:AS
    • 升序 or 降序
  • 更新 (Update)
  • 刪除 (Delete)
  • 分組(GROUP BY)
  • 聯(lián)合查詢
    • 內(nèi)連接(inner join)
    • 自連接
    • 外連接
      • 左連接(left join)
      • 右連接(left join)
    • 子查詢(嵌套查詢)
    • 合并查詢
      • UNION
      • UNION ALL
  • 聚合函數(shù)(復(fù)合函數(shù))
    • 最大最小
    • 總數(shù)、總和、平均值、保留小數(shù)
  • 條件函數(shù)
    • IF
    • CASE
  • 日期函數(shù)
    • 時間戳和日期的轉(zhuǎn)換
    • 年月日截取
    • 日期差計(jì)算
  • 文本函數(shù)


新增 (Create)

全列插入

語法

INSERT INTO [表名] VALUES(參數(shù)1, 參數(shù)2, 參數(shù)3......);

示例

INSERT INTO book VALUES(4, "C++Primer", 99.9, "2000-08-02", 103);mysql> SELECT * FROM book-> ; +------+-----------+-------+------------+------+ | id | name | price | publish | num | +------+-----------+-------+------------+------+ | 4 | C++Primer | 100 | 2000-08-02 | 103 | +------+-----------+-------+------------+------+ 1 rows in set (0.00 sec)

這里 price 的值為 100 而不是 99.9 是因?yàn)?默認(rèn)decimal為(10,0) ,也就是 0 位小數(shù),保存的時候?qū)⑿?shù)點(diǎn)后面的值四舍五入。


指定列插入

即只插入部分列內(nèi)容

語法

INSERT INTO [表名](1,列2,列3.......) values(參數(shù)1, 參數(shù)2, 參數(shù)3......);

示例

mysql> INSERT INTO book(id,name,price)-> VALUES(8,"紅樓夢",94.4); Query OK, 1 row affected, 1 warning (0.01 sec)mysql> SELECT * FROM book; +------+-----------+-------+------------+------+ | id | name | price | publish | num | +------+-----------+-------+------------+------+ | 4 | C++Primer | 100 | 2000-08-02 | 103 | | 8 | 紅樓夢 | 94 | NULL | NULL | +------+-----------+-------+------------+------+ 2 rows in set (0.00 sec)

查詢 (Retrieve)

全列查詢

語法

SELECT * FROM [表名];

示例

mysql> SELECT * FROM book; +------+-----------+-------+------------+------+ | id | name | price | publish | num | +------+-----------+-------+------------+------+ | 4 | C++Primer | 100 | 2000-08-02 | 103 | | 8 | 紅樓夢 | 94 | NULL | NULL | +------+-----------+-------+------------+------+ 2 rows in set (0.00 sec)

指定列查詢

語法

SELECT1,列2,列3..... FROM [表名];

示例

mysql> SELECT name, price FROM book; +-----------+-------+ | name | price | +-----------+-------+ | C++Primer | 100 | | 紅樓夢 | 94 | +-----------+-------+ 2 rows in set (0.00 sec)

條件查詢

關(guān)系元素運(yùn)算符


語法

SELECT * FROM [表名] WHERE [條件];

示例

mysql> SELECT * FROM book WHERE id=8; +------+-----------+-------+---------+------+ | id | name | price | publish | num | +------+-----------+-------+---------+------+ | 8 | 紅樓夢 | 94 | NULL | NULL | +------+-----------+-------+---------+------+ 1 row in set (0.00 sec)

模糊查詢

語法

SELECT * FROM [表名] WHERE [列名] LIKE%XX%// 查詢名字中帶XX的數(shù)據(jù) SELECT * FROM [表名] WHERE [列名] LIKE ”XX%// 查詢名字中以XX開頭的數(shù)據(jù) SELECT * FROM [表名] WHERE [列名] LIKE%XX“ // 查詢名字中以XX結(jié)尾的數(shù)據(jù)

分頁查詢

語法

SELECT * FROM [表名] LIMIT [每頁條數(shù)] OFFSET [偏移條數(shù)];

示例

mysql> SELECT * FROM book; +------+-----------+-------+------------+------+ | id | name | price | publish | num | +------+-----------+-------+------------+------+ | 4 | C++Primer | 100 | NULL | 103 | | 4 | C++Primer | 100 | 2000-08-02 | 103 | | 8 | 紅樓夢 | 94 | NULL | NULL | +------+-----------+-------+------------+------+ 3 rows in set (0.00 sec)// 限制顯示條數(shù) mysql> SELECT * FROM book LIMIT 1; +------+-----------+-------+---------+------+ | id | name | price | publish | num | +------+-----------+-------+---------+------+ | 4 | C++Primer | 100 | NULL | 103 | +------+-----------+-------+---------+------+ 1 row in set (0.00 sec)// 限制顯示條數(shù)、規(guī)定偏移量 mysql> SELECT * FROM book LIMIT 1 OFFSET 1; +------+-----------+-------+------------+------+ | id | name | price | publish | num | +------+-----------+-------+------------+------+ | 4 | C++Primer | 100 | 2000-08-02 | 103 | +------+-----------+-------+------------+------+ 1 row in set (0.00 sec)// 剩余數(shù)據(jù)不足LIMIT限制時,不會報錯,而是輸出所有剩余的 mysql> SELECT * FROM book LIMIT 2 OFFSET 2; +------+-----------+-------+---------+------+ | id | name | price | publish | num | +------+-----------+-------+---------+------+ | 8 | 紅樓夢 | 94 | NULL | NULL | +------+-----------+-------+---------+------+ 1 row in set (0.00 sec)

去重:DISTINCT

語法

SELECT DISTINCT * FROM [表名];

示例

mysql> SELECT * FROM book; +------+-----------+-------+------------+------+ | id | name | price | publish | num | +------+-----------+-------+------------+------+ | 4 | C++Primer | 100 | NULL | 103 | | 4 | C++Primer | 100 | 2000-08-02 | 103 | | 8 | 紅樓夢 | 94 | NULL | NULL | | 4 | C++Primer | 100 | 2000-08-02 | 103 | +------+-----------+-------+------------+------+ 4 rows in set (0.00 sec)mysql> SELECT DISTINCT * FROM book; +------+-----------+-------+------------+------+ | id | name | price | publish | num | +------+-----------+-------+------------+------+ | 4 | C++Primer | 100 | NULL | 103 | | 4 | C++Primer | 100 | 2000-08-02 | 103 | | 8 | 紅樓夢 | 94 | NULL | NULL | +------+-----------+-------+------------+------+ 3 rows in set (0.00 sec)

別名:AS

語法

SELECT 列a,列b...... AS [別名] FROM [表名];

示例

mysql> SELECT name, price * num AS total FROM book; +-----------+-------+ | name | total | +-----------+-------+ | C++Primer | 10300 | | C++Primer | 10300 | | 紅樓夢 | NULL | | C++Primer | 10300 | +-----------+-------+ 4 rows in set (0.00 sec)

升序 or 降序

語法

SELECT * FROM [表名] ORDER BY [列名] DESC // DESC為降序排序,ASC為升序排序,默認(rèn)為ASC。

示例

mysql> SELECT name, price * num AS total FROM book ORDER BY total; +-----------+-------+ | name | total | +-----------+-------+ | 紅樓夢 | NULL | | C++Primer | 10300 | | C++Primer | 10300 | | C++Primer | 10300 | +-----------+-------+ 4 rows in set (0.00 sec)

更新 (Update)

語法

UPDATE [表名] SET [修改項(xiàng)] = [修改結(jié)果]

示例

mysql> SELECT * FROM book; +------+-----------+-------+------------+------+ | id | name | price | publish | num | +------+-----------+-------+------------+------+ | 4 | C++Primer | 100 | NULL | 103 | | 4 | C++Primer | 100 | 2000-08-02 | 103 | | 8 | 紅樓夢 | 94 | NULL | NULL | | 4 | C++Primer | 100 | 2000-08-02 | 103 | +------+-----------+-------+------------+------+ 4 rows in set (0.00 sec)mysql> UPDATE book SET num=55 WHERE id=8; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> SELECT * FROM book; +------+-----------+-------+------------+------+ | id | name | price | publish | num | +------+-----------+-------+------------+------+ | 4 | C++Primer | 100 | NULL | 103 | | 4 | C++Primer | 100 | 2000-08-02 | 103 | | 8 | 紅樓夢 | 94 | NULL | 55 | | 4 | C++Primer | 100 | 2000-08-02 | 103 | +------+-----------+-------+------------+------+ 4 rows in set (0.00 sec)

刪除 (Delete)

語法

DELETE FROM [表名];

示例

mysql> DELETE FROM book WHERE id=4; Query OK, 3 rows affected (0.00 sec)mysql> SELECT * FROM book; +------+-----------+-------+---------+------+ | id | name | price | publish | num | +------+-----------+-------+---------+------+ | 8 | 紅樓夢 | 94 | NULL | 55 | +------+-----------+-------+---------+------+ 1 row in set (0.00 sec)

分組(GROUP BY)

分組的意思是根據(jù)所選 列名 對數(shù)據(jù)進(jìn)行分組,可以理解為作為分組依據(jù)的 列 不會變動,而對其余列按照要求進(jìn)行相關(guān)操作,最后對照著 列中的項(xiàng) 展示對應(yīng)的結(jié)果。

語法

SELECT * FROM [表名] WHERE [條件] GROUP BY [列名] SELECT * FROM [表名] GROUP BY [列名] HAVING [過濾條件] // WHERE 后跟的條件里不允許使用聚合函數(shù),但 HAVING 后面的過濾條件可以。

示例

SELECT gender, university, count(device_id) AS user_num, avg(active_days_within_30) AS avg_active_days, avg(question_cnt) as avg_question_cnt FROM user_profile GROUP BY university, gender;


聯(lián)合查詢

內(nèi)連接(inner join)

內(nèi)連接即查找兩個表中的 交集 ,找到兩個表中同時符合條件的數(shù)據(jù),進(jìn)行連接。

語法

select 字段 from1 別名1 [inner] join2 別名2 on 連接條件 and 其他條件; select 字段 from1 別名1,2 別名2 where 連接條件 and 其他條件;

自連接

自連接是特殊的內(nèi)連接,即與本表進(jìn)行連接,需要對表名進(jìn)行 別名顯示

語法

select 字段 from 表名1 別名1 [inner] join 表名2 別名2 on 連接條件 and 其他條件;

外連接

外連接又分左外連接和右外連接。簡單來說就是,以左表的數(shù)據(jù)為基準(zhǔn)就是左連接,以右表的數(shù)據(jù)為基準(zhǔn)就是右連接


左連接(left join)

對于左連接,以左表的數(shù)據(jù)為基準(zhǔn),在右表中查找符合條件的數(shù)據(jù),找不到的以 NULL 展示

語法

select 字段名 from 表名1 left join 表名2 on 連接條件; // 以 表1 為左基準(zhǔn),查詢 表2 中的符合數(shù)據(jù)

右連接(left join)

對于右連接,以右表的數(shù)據(jù)為基準(zhǔn),在左表中查找符合條件的數(shù)據(jù),找不到的以 NULL 展示

語法

select 字段 from 表名1 right join 表名2 on 連接條件; // 以 表1 為右基準(zhǔn),查詢 表2 中的符合數(shù)據(jù)

子查詢(嵌套查詢)

子查詢又叫做嵌套查詢(窗口查詢),其實(shí)就是嵌入 其他sql語句 中的 select語句 ,一般用于 查詢的條件是另一條語句的結(jié)果 這一情況。

語法

select 字段 from 表名 where 查詢條件=(select 列名 from 表名 where 查詢條件);

示例

(題源牛客)找到每個學(xué)校gpa最低的同學(xué)來做調(diào)研,請你取出相應(yīng)數(shù)據(jù)。


SELECT device_id, university, gpa FROM user_profile WHERE gpa IN( # IN 可替換為 = ANYSELECT min(gpa)FROM user_profileGROUP BY university ) GROUP BY university # 保證學(xué)校名不重復(fù) ORDER BY university; # 保證與題目要求輸出順序一致

合并查詢

UNION

該操作符用于取得兩個結(jié)果集的并集。當(dāng)使用該操作符時,會自動去掉結(jié)果集中的重復(fù)行

語法

select 字段 from 表名 where 查詢條件 UNION select 列名 from 表名 where 查詢條件;

同樣的結(jié)果也可以通過 or語句 來得到

select 字段 from 表名 where 查詢條件1 or 查詢條件2;

但是OR這個邏輯運(yùn)算符會忽略索引、掃描全表,所以在海量數(shù)據(jù)查詢中性能會下降很多。


UNION ALL

該操作符用于取得兩個結(jié)果集的并集。當(dāng)使用該操作符時,不自動去掉結(jié)果集中的重復(fù)行

語法

select 字段 from 表名 where 查詢條件 UNION ALL select 列名 from 表名 where 查詢條件;

聚合函數(shù)(復(fù)合函數(shù))

最大最小

  • MAX(): 返回查詢到的數(shù)據(jù)的最大值
  • MIN(): 返回查詢到的數(shù)據(jù)的最小值

語法

SELECT max([列名]) FROM [表名] // 查詢對應(yīng)列中最大的數(shù)據(jù) SELECT min([列名]) FROM [表名] // 查詢對應(yīng)列中最小的數(shù)據(jù)

示例

mysql> SELECT * FROM class; +------+------+-------+ | id | num | name | +------+------+-------+ | NULL | NULL | li | | NULL | NULL | chen | | NULL | NULL | zhang | +------+------+-------+ 3 rows in set (0.00 sec)mysql> SELECT max(name) FROM class-> ; +-----------+ | max(name) | +-----------+ | zhang | +-----------+ 1 row in set (0.00 sec)

總數(shù)、總和、平均值、保留小數(shù)

  • COUNT(): 返回查詢到的數(shù)據(jù)的數(shù)量
  • SUM(): 返回查詢到的數(shù)據(jù)的總和
  • AVG(): 返回查詢到的數(shù)據(jù)的平均值
  • ROUND(): 返回查詢數(shù)據(jù)的保留小數(shù)結(jié)果,常與 sum、avg 搭配。

語法

SELECT count([列名]) FROM [表名] // 查詢對應(yīng)列中數(shù)據(jù)的總數(shù) SELECT sum([列名]) FROM [表名] // 查詢對應(yīng)列中數(shù)據(jù)的和 SELECT avg([列名]) FROM [表名] // 查詢對應(yīng)列中數(shù)據(jù)的平均值 SELECT round([數(shù)據(jù)], n) FROM [表名] // 查詢對應(yīng)數(shù)據(jù)保留n位小數(shù)的結(jié)果,數(shù)據(jù)可以為count、avg的結(jié)果

條件函數(shù)

IF

條件函數(shù) if(x,a,b)表示如果 x 成立、則返回 a;否則返回 b 。常用來劃分查詢結(jié)果的輸出情況。

語法

SELECT IF(X, A, B) AS [列名] FROM [表名]

示例
(題源牛客)現(xiàn)在運(yùn)營想要將用戶劃分為25歲以下和25歲及以上兩個年齡段,分別查看這兩個年齡段用戶數(shù)量:

SELECT if(age>=25, '25歲以及上', '25歲以下') AS age_cut, COUNT(device_id) AS Number FROM user_profile GROUP BY age_cut;

CASE

數(shù)據(jù)庫中的 case運(yùn)算符 類似于 C語言 中的 switch語句 ,WHEN 用來羅列情況,THEN 將情況與輸出結(jié)果相對應(yīng),ELSE 總結(jié)未羅列的情況,END 標(biāo)識語句結(jié)束。

語法

SELECT CASEWHEN [條件] THEN [輸出結(jié)果]WHEN [條件] THEN [輸出結(jié)果]ELSE [輸出結(jié)果] END AS [列名] FROM [表名]

示例
(題源牛客)現(xiàn)在運(yùn)營想要將用戶劃分為20歲以下,20-24歲,25歲及以上三個年齡段,分別查看不同年齡段用戶的明細(xì)情況,請取出相應(yīng)數(shù)據(jù)。

SELECT device_id, gender, CASEWHEN age>=25 THEN '25歲以上'WHEN age BETWEEN 20 AND 24 THEN "20-24歲"WHEN age<20 THEN '20歲以下'ELSE '其他' END AS age_cut FROM user_profile

日期函數(shù)

時間戳和日期的轉(zhuǎn)換

時間戳是數(shù)據(jù)庫中自動生成的唯一二進(jìn)制數(shù)字,表明數(shù)據(jù)庫中數(shù)據(jù)修改發(fā)生的相對順序,其記錄形式類似:1627963699 ,在實(shí)際工作環(huán)境中,對于用戶行為發(fā)生的時間通常都是用時間戳進(jìn)行記錄。

from_unixtime 可以將時間戳轉(zhuǎn)換成日期,其使用語法如下:

# 時間戳所在列轉(zhuǎn)換 SELECT from_unixtime([時間戳所在列], 'yyyy-MM-dd’) AS [列名] # 日期格式有’yyyy-MM-dd’ 和 ‘yyyyMMdd’,這里選用前者 From [表名] # 單個時間戳轉(zhuǎn)換 SELECT from_unixtime([時間戳], [日期格式]) AS [列名]

unix_timestamp 可以將日期轉(zhuǎn)換成時間戳,其使用語法如下:

  • 如果日期值格式滿足yyyy-MM-dd HH:mm:ss,則無需指定日期格式:
SELECT unix_timestamp([日期值]) AS [列名]
  • 如果日期值格式不滿足yyyy-MM-dd HH:mm:ss,則必須指定日期格式:
SELECT unix_timestamp(2021-09-02','yyyy-MM-dd’) AS [列名]

年月日截取

可以從完整日期格式中提取出年月日:

語法

SELECT year([日期值]), month([日期值]), day([日期值]) FROM [表名] # 提取一列的年月日則可以將 日期值 改為 列名

示例

(題源牛客)計(jì)算出2021年8月每天用戶練習(xí)題目的數(shù)量,請取出相應(yīng)數(shù)據(jù)。

SELECT DAY(date) AS day, COUNT(question_id) AS question_cnt FROM question_practice_detail WHERE YEAR(date)='2021' AND MONTH(date)='08' GROUP BY day;

日期差計(jì)算

datedff

datediff 的作用為計(jì)算兩個日期之間的天數(shù)間隔。

語法

datediff(date1, date2)

返回起始時間 date1 和結(jié)束時間 date2 之間的天數(shù),date1 大于 date2 的情況下,返回的天數(shù)為正數(shù);date1 小于 date2 的情況下,返回的天數(shù)為負(fù)數(shù)。

date_sub

語法

date_sub (string startdate, interval int day)

返回開始日期 startdate 減少 day 天后的日期。

date_add

語法

date_add(string startdate, interval int day)

返回開始日期 startdate 增加 day 天后的日期。

示例

(題源牛客)查看用戶在某天刷題后第二天還會再來刷題的平均概率。請取出相應(yīng)數(shù)據(jù)。

SELECT COUNT(q2.device_id)/COUNT(q1.device_id) AS avg_ret FROM(SELECT DISTINCT device_id, dateFROM question_practice_detail ) q1 LEFT JOIN(SELECT DISTINCT device_id,date_sub(date, INTERVAL 1 DAY) AS dateFROM question_practice_detail ) q2 USING(date, device_id); # USING 等同于 ON q1.date=q2.date AND q1.device_id=q2.device_id;

文本函數(shù)

  • LOCATE(substr, str) :返回子串 substr 在字符串 str 中第一次出現(xiàn)的位置,如不存在,則返回0;
  • POSITION(substr IN str) :LOCATE函數(shù) 作用相同;
  • LEFT(str, length) :從左邊開始截取 str,length 是截取的長度;
  • RIGHT(str, length) :從右邊開始截取 str,length 是截取的長度;
  • SUBSTRING_INDEX(str, substr, n) :返回字符 substr 在 str 中第 n 次出現(xiàn)位置之前的字符串,n 若為負(fù)數(shù),則表倒數(shù);
  • SUBSTRING(str , n, m) :返回字符串 str 從第 n 個字符截取長度為 m 個字符;
  • REPLACE(str, n, m) :將字符串 str 中的 n 字符替換成 m 字符;
  • LENGTH(str) :計(jì)算字符串 str 的長度。
  • 總結(jié)

    以上是生活随笔為你收集整理的MySQL命令(二)| 表的增删查改、聚合函数(复合函数)、联合查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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