自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

掌握SQL,學(xué)習(xí)這30個(gè)實(shí)例就足夠了

數(shù)據(jù)庫(kù) MySQL
SQL是一種編程語(yǔ)言,用于管理以表格形式(即表)存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)。在本文中,我們將介紹30個(gè)示例,這些示例涉及SQL的以下操作

SQL是一種編程語(yǔ)言,用于管理以表格形式(即表)存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)。

關(guān)系數(shù)據(jù)庫(kù)由多個(gè)相互關(guān)聯(lián)的表組成。表之間的關(guān)系是在共享列的意義上形成的。

有許多不同的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(例如MySQL,PostgreSQL,SQL Server)。他們采用的SQL語(yǔ)法可能略有不同。但是,兩者之間的差別很小,因此,如果您學(xué)習(xí)如何使用一種,則可以輕松切換到另一種。

[[376672]]

在本文中,我們將介紹30個(gè)示例,這些示例涉及SQL的以下操作:

  1. 創(chuàng)建數(shù)據(jù)庫(kù)和表
  2. 將數(shù)據(jù)插入表
  3. 從表中刪除數(shù)據(jù)
  4. 更新表格
  5. 使用各種選擇語(yǔ)句查詢表

在您的計(jì)算機(jī)或云中有許多使用SQL的替代方法。我目前正在通過終端在Linux計(jì)算機(jī)上使用MySQL。另一個(gè)常用的替代方法是安裝MySQL Workbench。

實(shí)例1

我們首先從終端連接到MySQL服務(wù)器并創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。

  1. ~$ sudo mysql -u root 

我們將被提示輸入密碼。現(xiàn)在,我們已連接到計(jì)算機(jī)中的MySQL服務(wù)器。

以下命令創(chuàng)建一個(gè)名為"零售"的數(shù)據(jù)庫(kù)。

  1. mysql> create database retail; 
  2. mysql> use retail; 

我們不在尚未包含任何表的零售數(shù)據(jù)庫(kù)中。

實(shí)例2

我們將首先使用create table命令創(chuàng)建一個(gè)名為" customer"的表。

  1. mysql> create table customer ( 
  2.  -> cust_id int primary key, 
  3.  -> age int, 
  4.  -> location varchar(20), 
  5.  -> gender varchar(20) 
  6.  -> ); 

我們?cè)诶ㄌ?hào)內(nèi)定義列的名稱和關(guān)聯(lián)的數(shù)據(jù)類型。將cust_id列指定為主鍵。

主鍵是唯一標(biāo)識(shí)每一行的列。就像熊貓數(shù)據(jù)框的索引一樣。

實(shí)例3

我們將創(chuàng)建第二個(gè)表,稱為"訂單"。

  1. mysql> create table orders ( 
  2.  -> order_id int primary key, 
  3.  -> date date, 
  4.  -> amount decimal(5,2), 
  5.  -> cust_id int, 
  6.  -> foreign key (cust_id) references customer(cust_id) 
  7.  -> on delete cascade 
  8.  -> ); 

在一開始,我們提到關(guān)系表通過共享列相互關(guān)聯(lián)。關(guān)聯(lián)兩個(gè)表的列是外鍵。

外鍵是將表與另一個(gè)表相關(guān)聯(lián)的東西。外鍵包含另一個(gè)表的主鍵。

訂單表中的cust_id列是外鍵,并將訂單表與客戶表相關(guān)。我們?cè)趧?chuàng)建表時(shí)指定此條件。

在最后一行,我們用"在刪除級(jí)聯(lián)上"短語(yǔ)指定另一個(gè)條件。它告訴MySQL當(dāng)刪除客戶表中的一行時(shí)該怎么做。訂單表中的每一行都屬于一個(gè)客戶。客戶表中的每一行都包含一個(gè)唯一的客戶ID,并代表一個(gè)客戶。如果客戶表中的行被刪除,則意味著我們不再有該客戶。結(jié)果,屬于該客戶的訂單不再具有關(guān)聯(lián)的客戶ID。"刪除時(shí)級(jí)聯(lián)"表示沒有關(guān)聯(lián)客戶ID的訂單也將被刪除。

實(shí)例4

零售數(shù)據(jù)庫(kù)現(xiàn)在包含兩個(gè)表。我們可以使用show table命令查看數(shù)據(jù)庫(kù)中存在的表。

  1. mysql> show tables; 
  2. +------------------+ 
  3. | Tables_in_retail | 
  4. +------------------+ 
  5. | customer         | 
  6. | orders           | 
  7. +------------------+ 

注意:SQL中的命令以分號(hào)(";")結(jié)尾。

實(shí)例5

desc或describe命令從列名,數(shù)據(jù)類型和一些其他信息的角度概述了該表。

  1. mysql> desc orders; 
  2. +----------+--------------+------+-----+---------+-------+ 
  3. | Field    | Type         | Null | Key | Default | Extra | 
  4. +----------+--------------+------+-----+---------+-------+ 
  5. | order_id | int(11)      | NO   | PRI | NULL    |       | 
  6. | date     | date         | YES  |     | NULL    |       | 
  7. | amount   | decimal(5,2) | YES  |     | NULL    |       | 
  8. | cust_id  | int(11)      | YES  | MUL | NULL    |       | 
  9. +----------+--------------+------+-----+---------+-------+ 

實(shí)例6

我們可以修改現(xiàn)有表。例如,alter table命令可用于添加新列或刪除現(xiàn)有列。

讓我們?cè)谟唵伪碇刑砑右涣?quot; is_sale"。

  1. mysql> alter table orders add is_sale varchar(20); 

我們編寫列名和數(shù)據(jù)類型以及add關(guān)鍵字。

  1. mysql> desc orders; 
  2. +----------+--------------+------+-----+---------+-------+ 
  3. | Field    | Type         | Null | Key | Default | Extra | 
  4. +----------+--------------+------+-----+---------+-------+ 
  5. | order_id | int(11)      | NO   | PRI | NULL    |       | 
  6. | date     | date         | YES  |     | NULL    |       | 
  7. | amount   | decimal(5,2) | YES  |     | NULL    |       | 
  8. | cust_id  | int(11)      | YES  | MUL | NULL    |       | 
  9. | is_sale  | varchar(20)  | YES  |     | NULL    |       | 
  10. +----------+--------------+------+-----+---------+-------+ 

is_sale列已添加到訂單表中。

實(shí)例7

alter table也可以用于刪除語(yǔ)法稍有更改的列。

  1. mysql> alter table orders drop is_sale; 

使用drop關(guān)鍵字而不是add關(guān)鍵字。我們也不必編寫數(shù)據(jù)類型來刪除列。

實(shí)例8

我們有表,但它們不包含任何數(shù)據(jù)。填充表的一種方法是insert語(yǔ)句。

  1. mysql> insert into customer values ( 
  2.  -> 1000, 42, 'Austin', 'female' 
  3.  -> ); 

指定的值以相同的順序插入到列中。因此,我們需要保持順序一致。

實(shí)例9

我們可以通過分隔每一行來同時(shí)插入多行。

  1. mysql> insert into customer values  
  2.  -> (1001, 34, 'Austin', 'male'), 
  3.  -> (1002, 37, 'Houston', 'male'), 
  4.  -> (1003, 25, 'Austin', 'female'), 
  5.  -> (1004, 28, 'Houston', 'female'), 
  6.  -> (1005, 22, 'Dallas', 'male'), 
  7.  -> ; 

我添加了一些行,并以相同的方式填充了orders表。

還有其他方法可以用數(shù)據(jù)填充表。例如,我們可以使用加載數(shù)據(jù)infile或加載數(shù)據(jù)本地infile語(yǔ)句來加載csv文件。

實(shí)例10

delete from語(yǔ)句可用于刪除表中的現(xiàn)有行。我們需要通過提供條件來標(biāo)識(shí)要?jiǎng)h除的行。例如,下面的語(yǔ)句將刪除訂單ID為17的行。

  1. mysql> delete from orders  
  2.  -> where order_id = 17

如果我們不指定條件,則刪除給定表中的所有行。

實(shí)例11

我們還可以更新現(xiàn)有行。讓我們更新訂單表中的一行。

  1. +----------+------------+--------+---------+ 
  2. | order_id | date | amount | cust_id | 
  3. +----------+------------+--------+---------+ 
  4. | 1                 | 2020-10-01 | 24.40 | 1001 | 
  5. +----------+------------+--------+---------+ 

這是訂單表中的第一行。我們想將訂單金額更改為27.40。

  1. mysql> update orders 
  2.     -> set amount = 27.40 
  3.     -> where order_id = 1
  4. mysql> select * from orders limit 1; 
  5. +----------+------------+--------+---------+ 
  6. | order_id | date       | amount | cust_id | 
  7. +----------+------------+--------+---------+ 
  8. |        1 | 2020-10-01 |  27.40 |    1001 | 
  9. +----------+------------+--------+---------+ 

我們將更新后的值寫在set關(guān)鍵字之后。通過在where關(guān)鍵字之后提供條件來標(biāo)識(shí)要更新的行。

實(shí)例12

如果要通過復(fù)制現(xiàn)有表的結(jié)構(gòu)來創(chuàng)建表,則可以使用帶有l(wèi)ike關(guān)鍵字的create table語(yǔ)句。

  1. mysql> create table orders_copy like orders; 
  2. mysql> show tables; 
  3. +------------------+ 
  4. | Tables_in_retail | 
  5. +------------------+ 
  6. | customer         | 
  7. | orders           | 
  8. | orders_copy      | 
  9. +------------------+ 

orders_copy表具有與orders表相同的結(jié)構(gòu),但不包含任何數(shù)據(jù)。

實(shí)例13

我們還可以通過使用create table和select語(yǔ)句一起使用數(shù)據(jù)創(chuàng)建現(xiàn)有表的副本。

  1. mysql> create table new_orders 
  2.     -> select * from orders; 

似乎是兩個(gè)單獨(dú)的語(yǔ)句的組合。第一行創(chuàng)建表,第二行用orders表中的數(shù)據(jù)填充該表。

實(shí)例14

drop table語(yǔ)句可用于刪除數(shù)據(jù)庫(kù)中的表。

  1. mysql> drop table orders_copy, new_orders; 
  2. mysql> show tables; 
  3. +------------------+ 
  4. | Tables_in_retail | 
  5. +------------------+ 
  6. | customer         | 
  7. | orders           | 
  8. +------------------+ 

我們已經(jīng)成功刪除了在上一個(gè)示例中創(chuàng)建的表。

我們?cè)跀?shù)據(jù)庫(kù)中有兩個(gè)關(guān)系表。以下示例將說明我們?nèi)绾问褂眠x擇查詢從這些表中檢索數(shù)據(jù)。

實(shí)例15

最簡(jiǎn)單的查詢是查看表中的所有列。

  1. mysql> select * from orders 
  2.     -> limit 3; 
  3. +----------+------------+--------+---------+ 
  4. | order_id | date       | amount | cust_id | 
  5. +----------+------------+--------+---------+ 
  6. |        1 | 2020-10-01 |  27.40 |    1001 | 
  7. |        2 | 2020-10-01 |  36.20 |    1000 | 
  8. |        3 | 2020-10-01 |  65.45 |    1002 | 
  9. +----------+------------+--------+---------+ 

" *"選擇所有列,而limit關(guān)鍵字對(duì)要顯示的行數(shù)施加約束。

實(shí)例16

通過寫列名而不是" *",我們只能選擇某些列。

  1. mysql> select order_id, amount  
  2.     -> from orders 
  3.     -> limit 3; 
  4. +----------+--------+ 
  5. | order_id | amount | 
  6. +----------+--------+ 
  7. |        1 |  27.40 | 
  8. |        2 |  36.20 | 
  9. |        3 |  65.45 | 
  10. +----------+--------+ 

實(shí)例17

我們可以使用where子句指定要選擇的行的條件。以下查詢將返回2020–10–01的所有訂單。

  1. mysql> select * from orders 
  2.     -> where date = '2020-10-01'
  3. +----------+------------+--------+---------+ 
  4. | order_id | date       | amount | cust_id | 
  5. +----------+------------+--------+---------+ 
  6. |        1 | 2020-10-01 |  27.40 |    1001 | 
  7. |        2 | 2020-10-01 |  36.20 |    1000 | 
  8. |        3 | 2020-10-01 |  65.45 |    1002 | 
  9. +----------+------------+--------+---------+ 

實(shí)例18

where子句接受多個(gè)條件。讓我們?cè)谏弦粋€(gè)示例中為查詢添加另一個(gè)條件。

  1. mysql> select * from orders 
  2.     -> where date = '2020-10-01' and amount > 50; 
  3. +----------+------------+--------+---------+ 
  4. | order_id | date       | amount | cust_id | 
  5. +----------+------------+--------+---------+ 
  6. |        3 | 2020-10-01 |  65.45 |    1002 | 
  7. +----------+------------+--------+---------+ 

實(shí)例19

我們可能想對(duì)查詢結(jié)果進(jìn)行排序,這可以通過使用order by子句來完成。

以下查詢將返回2020–10–02的訂單,并根據(jù)金額對(duì)它們進(jìn)行排序。

  1. mysql> select * from orders 
  2.     -> where date = '2020-10-02' 
  3.     -> order by amount; 
  4. +----------+------------+--------+---------+ 
  5. | order_id | date       | amount | cust_id | 
  6. +----------+------------+--------+---------+ 
  7. |        5 | 2020-10-02 |  18.80 |    1005 | 
  8. |        6 | 2020-10-02 |  21.15 |    1009 | 
  9. |        4 | 2020-10-02 |  34.40 |    1001 | 
  10. |        7 | 2020-10-02 |  34.40 |    1008 | 
  11. |        8 | 2020-10-02 |  41.10 |    1002 | 
  12. +----------+------------+--------+---------+ 

實(shí)例20

默認(rèn)情況下,order by子句對(duì)行進(jìn)行升序排序。我們可以使用desc關(guān)鍵字將其更改為降序。

  1. mysql> select * from orders 
  2.     -> where date = '2020-10-02' 
  3.     -> order by amount desc; 
  4. +----------+------------+--------+---------+ 
  5. | order_id | date       | amount | cust_id | 
  6. +----------+------------+--------+---------+ 
  7. |        8 | 2020-10-02 |  41.10 |    1002 | 
  8. |        4 | 2020-10-02 |  34.40 |    1001 | 
  9. |        7 | 2020-10-02 |  34.40 |    1008 | 
  10. |        6 | 2020-10-02 |  21.15 |    1009 | 
  11. |        5 | 2020-10-02 |  18.80 |    1005 | 
  12. +----------+------------+--------+---------+ 

實(shí)例21

SQL是一種通用語(yǔ)言,也可以用作數(shù)據(jù)分析工具。它提供許多功能,可在從數(shù)據(jù)庫(kù)查詢時(shí)分析和轉(zhuǎn)換數(shù)據(jù)。

例如,我們可以在訂單表中計(jì)算唯一天數(shù)。

  1. mysql> select count(distinct(date)) as day_count 
  2.     -> from orders; 
  3. +-----------+ 
  4. | day_count | 
  5. +-----------+ 
  6. |         4 | 
  7. +-----------+ 

訂單表包含4個(gè)不同日期的訂單。" as"關(guān)鍵字用于重命名查詢結(jié)果中的列。否則,該列的名稱將為" count(distinct(date))"。

實(shí)例22

訂單表中有4天。我們還可以找出每天有多少訂單。group by子句將幫助我們完成此任務(wù)。

  1. mysql> select date, count(order_id) as order_count 
  2.     -> from orders 
  3.     -> group by date; 
  4. +------------+-------------+ 
  5. | date       | order_count | 
  6. +------------+-------------+ 
  7. | 2020-10-01 |           3 | 
  8. | 2020-10-02 |           5 | 
  9. | 2020-10-03 |           6 | 
  10. | 2020-10-04 |           2 | 
  11. +------------+-------------+ 

我們計(jì)算訂單并將其按日期列分組。

實(shí)例23

我們將計(jì)算每天的平均訂單金額,并根據(jù)平均金額以降序排列結(jié)果。

  1. mysql> select date, avg(amount) 
  2.     -> from orders 
  3.     -> group by date 
  4.     -> order by avg(amount) desc; 
  5. +------------+-------------+ 
  6. | date       | avg(amount) | 
  7. +------------+-------------+ 
  8. | 2020-10-01 |   43.016667 | 
  9. | 2020-10-04 |   42.150000 | 
  10. | 2020-10-03 |   37.025000 | 
  11. | 2020-10-02 |   29.970000 | 
  12. +------------+-------------+ 

實(shí)例24

我們要修改上一個(gè)示例中的查詢,并且只包含平均金額大于30的天。

  1. mysql> select date, avg(amount) 
  2.     -> from orders 
  3.     -> group by date 
  4.     -> having avg(amount) > 30 
  5.     -> order by avg(amount) desc; 
  6. +------------+-------------+ 
  7. | date       | avg(amount) | 
  8. +------------+-------------+ 
  9. | 2020-10-01 |   43.016667 | 
  10. | 2020-10-04 |   42.150000 | 
  11. | 2020-10-03 |   37.025000 | 

重要的是要注意,查詢中語(yǔ)句的順序很重要。例如,如果將order by子句放在having子句之前,則會(huì)產(chǎn)生錯(cuò)誤。

實(shí)例25

我們想找出每天的最大訂購(gòu)量。

  1. mysql> select date, max(amount) 
  2.     -> from orders 
  3.     -> group by date; 
  4. +------------+-------------+ 
  5. | date       | max(amount) | 
  6. +------------+-------------+ 
  7. | 2020-10-01 |       65.45 | 
  8. | 2020-10-02 |       41.10 | 
  9. | 2020-10-03 |       80.20 | 
  10. | 2020-10-04 |       50.10 | 

實(shí)例26

我們要在select語(yǔ)句中組合多個(gè)聚合函數(shù)。為了說明這一點(diǎn),讓我們?cè)敿?xì)說明前面的示例。我們希望看到每個(gè)客戶的最大訂單量與最小訂單量之間的差異。我們還希望根據(jù)升序的差異對(duì)結(jié)果進(jìn)行排序,并顯示前三個(gè)結(jié)果。

  1. mysql> select cust_id, max(amount) - min(amount) as dif 
  2.     -> from orders 
  3.     -> group by cust_id 
  4.     -> order by dif desc 
  5.     -> limit 3; 
  6. +---------+-------+ 
  7. | cust_id | dif   | 
  8. +---------+-------+ 
  9. |    1007 | 46.00 | 
  10. |    1009 | 28.95 | 
  11. |    1002 | 24.35 | 
  12. +---------+-------+ 

diff列是通過從最大數(shù)量減去最小數(shù)量獲得的。

實(shí)例27

我們現(xiàn)在切換到客戶表。讓我們找出每個(gè)城市有多少女性和男性顧客。我們需要在group by子句中同時(shí)寫位置和性別列。

  1. mysql> select location, gender, count(cust_id) 
  2.     -> from customer 
  3.     -> group by location, gender; 
  4. +----------+--------+----------------+ 
  5. | location | gender | count(cust_id) | 
  6. +----------+--------+----------------+ 
  7. | Austin   | female |              2 | 
  8. | Austin   | male   |              1 | 
  9. | Dallas   | female |              2 | 
  10. | Dallas   | male   |              2 | 
  11. | Houston  | female |              2 | 
  12. | Houston  | male   |              1 | 
  13. +----------+--------+----------------+ 

實(shí)例28

客戶表和訂單表基于cust_id列相互關(guān)聯(lián)。我們可以使用SQL連接從兩個(gè)表中查詢數(shù)據(jù)。

我們希望在客戶表中查看每個(gè)城市的平均訂單金額。

  1. mysql> select customer.location, avg(orders.amount) as avg 
  2.     -> from customer 
  3.     -> join orders 
  4.     -> on customer.cust_id = orders.cust_id 
  5.     -> group by customer.location; 
  6. +----------+-----------+ 
  7. | location | avg       | 
  8. +----------+-----------+ 
  9. | Austin   | 33.333333 | 
  10. | Dallas   | 34.591667 | 
  11. | Houston  | 44.450000 | 
  12. +----------+-----------+ 

由于我們從兩個(gè)不同的表中選擇列,因此將使用關(guān)聯(lián)的表名指定列名。上面查詢的第二,第三和第四行基于每個(gè)表中的cust_id列將customer andorders表聯(lián)接在一起。

請(qǐng)注意,列名不必相同。無論我們使用" on"關(guān)鍵字提供什么列名,都將基于這些列進(jìn)行比較或匹配。

實(shí)例29

我們希望查看在2020–10–03年下訂單的客戶的平均年齡。

  1. mysql> select avg(c.age) as avg_age 
  2.     -> from customer c 
  3.     -> join orders o 
  4.     -> on c.cust_id = o.cust_id 
  5.     -> where o.date = '2020-10-03'
  6. +---------+ 
  7. | avg_age | 
  8. +---------+ 
  9. | 30.0000 | 
  10. +---------+ 

我們也可以為表名使用別名。當(dāng)我們需要多次鍵入表名時(shí),它很方便。

實(shí)例30

我們想查看訂單量最大的客戶的位置。

  1. mysql> select c.location, o.amount 
  2.     -> from customer c 
  3.     -> join orders o 
  4.     -> on c.cust_id = o.cust_id 
  5.     -> where o.amount = (select max(amount) from orders) 
  6.     -> ; 
  7. +----------+--------+ 
  8. | location | amount | 
  9. +----------+--------+ 
  10. | Dallas   |  80.20 | 
  11. +----------+--------+ 

在此查詢中,我們有一個(gè)嵌套的select語(yǔ)句。金額條件是使用訂單表中單獨(dú)的select語(yǔ)句計(jì)算得出的。

可以通過其他方式完成此任務(wù)。我選擇了這種方法來介紹嵌套查詢的概念。

結(jié)論

我相信本文中的30個(gè)示例將全面介紹SQL。我們涵蓋了以下主題:

  • 用關(guān)系表創(chuàng)建數(shù)據(jù)庫(kù)
  • 修改表格
  • 將數(shù)據(jù)插入表
  • 從表中刪除數(shù)據(jù)
  • 編寫查詢以從表中檢索數(shù)據(jù)

當(dāng)然,SQL可以完成更高級(jí)的查詢和操作。熟悉基礎(chǔ)知識(shí)后,最好繼續(xù)進(jìn)行更高級(jí)的操作。

原文鏈接:https://towardsdatascience.com/30-examples-to-master-sql-c8004705479a

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2021-06-21 09:22:53

按鈕設(shè)計(jì)UI標(biāo)簽

2016-09-26 17:05:34

IBM云計(jì)算SoftLayer

2021-06-30 00:14:24

JS代碼數(shù)組

2021-06-11 09:28:04

人工智能機(jī)器學(xué)習(xí)技術(shù)

2018-07-06 15:25:50

程序員編程python

2021-07-14 23:57:26

Vue高級(jí)技巧

2021-08-04 00:10:49

場(chǎng)景版本大文件

2019-08-20 14:40:35

Redis數(shù)據(jù)庫(kù)

2021-07-09 17:17:09

文件場(chǎng)景內(nèi)核

2018-07-09 09:30:06

架構(gòu)師產(chǎn)品經(jīng)理互聯(lián)網(wǎng)

2024-05-13 18:33:08

SQL日期函數(shù)

2016-10-11 09:11:52

tar命令歸檔

2020-05-08 11:14:33

Vue開發(fā)代碼

2022-12-19 08:30:51

ViteWebpack

2019-04-26 13:07:14

GitHub開源代碼倉(cāng)庫(kù)

2017-07-07 13:41:17

Linux命令

2023-12-16 13:14:00

SQL子查詢技術(shù)

2018-09-12 15:16:19

數(shù)據(jù)中心網(wǎng)絡(luò)機(jī)房

2020-08-04 07:56:57

開源數(shù)據(jù)工具

2022-08-09 15:38:55

Linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)