怎么掌握SQL

這篇文章主要講解了“怎么掌握SQL”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么掌握SQL”吧!

在建始等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需求定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),成都營銷網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè)公司,建始網(wǎng)站建設(shè)費(fèi)用合理。

實(shí)例1

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

~$ sudo mysql -u root

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

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

mysql> create database retail; mysql> use retail;

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

實(shí)例2

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

mysql> create table customer (  -> cust_id int primary key,  -> age int,  -> location varchar(20),  -> gender varchar(20)  -> );

我們在括號內(nèi)定義列的名稱和關(guān)聯(lián)的數(shù)據(jù)類型。將cust_id列指定為主鍵。

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

實(shí)例3

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

mysql> create table orders (  -> order_id int primary key,  -> date date,  -> amount decimal(5,2),  -> cust_id int,  -> foreign key (cust_id) references customer(cust_id)  -> on delete cascade  -> );

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

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

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

在最后一行,我們用"在刪除級聯(lián)上"短語指定另一個條件。它告訴MySQL當(dāng)刪除客戶表中的一行時該怎么做。訂單表中的每一行都屬于一個客戶??蛻舯碇械拿恳恍卸及粋€唯一的客戶ID,并代表一個客戶。如果客戶表中的行被刪除,則意味著我們不再有該客戶。結(jié)果,屬于該客戶的訂單不再具有關(guān)聯(lián)的客戶ID。"刪除時級聯(lián)"表示沒有關(guān)聯(lián)客戶ID的訂單也將被刪除。

實(shí)例4

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

mysql> show tables; +------------------+ | Tables_in_retail | +------------------+ | customer         | | orders           | +------------------+

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

實(shí)例5

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

mysql> desc orders; +----------+--------------+------+-----+---------+-------+ | Field    | Type         | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | order_id | int(11)      | NO   | PRI | NULL    |       | | date     | date         | YES  |     | NULL    |       | | amount   | decimal(5,2) | YES  |     | NULL    |       | | cust_id  | int(11)      | YES  | MUL | NULL    |       | +----------+--------------+------+-----+---------+-------+

實(shí)例6

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

讓我們在訂單表中添加一列" is_sale"。

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

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

mysql> desc orders; +----------+--------------+------+-----+---------+-------+ | Field    | Type         | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | order_id | int(11)      | NO   | PRI | NULL    |       | | date     | date         | YES  |     | NULL    |       | | amount   | decimal(5,2) | YES  |     | NULL    |       | | cust_id  | int(11)      | YES  | MUL | NULL    |       | | is_sale  | varchar(20)  | YES  |     | NULL    |       | +----------+--------------+------+-----+---------+-------+

is_sale列已添加到訂單表中。

實(shí)例7

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

mysql> alter table orders drop is_sale;

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

實(shí)例8

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

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

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

實(shí)例9

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

mysql> insert into customer values   -> (1001, 34, 'Austin', 'male'),  -> (1002, 37, 'Houston', 'male'),  -> (1003, 25, 'Austin', 'female'),  -> (1004, 28, 'Houston', 'female'),  -> (1005, 22, 'Dallas', 'male'),  -> ;

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

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

實(shí)例10

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

mysql> delete from orders   -> where order_id = 17;

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

實(shí)例11

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

+----------+------------+--------+---------+ | order_id | date | amount | cust_id | +----------+------------+--------+---------+ | 1                 | 2020-10-01 | 24.40 | 1001 | +----------+------------+--------+---------+

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

mysql> update orders     -> set amount = 27.40     -> where order_id = 1; mysql> select * from orders limit 1; +----------+------------+--------+---------+ | order_id | date       | amount | cust_id | +----------+------------+--------+---------+ |        1 | 2020-10-01 |  27.40 |    1001 | +----------+------------+--------+---------+

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

實(shí)例12

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

mysql> create table orders_copy like orders; mysql> show tables; +------------------+ | Tables_in_retail | +------------------+ | customer         | | orders           | | orders_copy      | +------------------+

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

實(shí)例13

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

mysql> create table new_orders     -> select * from orders;

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

實(shí)例14

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

mysql> drop table orders_copy, new_orders; mysql> show tables; +------------------+ | Tables_in_retail | +------------------+ | customer         | | orders           | +------------------+

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

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

實(shí)例15

最簡單的查詢是查看表中的所有列。

mysql> select * from orders     -> limit 3; +----------+------------+--------+---------+ | order_id | date       | amount | cust_id | +----------+------------+--------+---------+ |        1 | 2020-10-01 |  27.40 |    1001 | |        2 | 2020-10-01 |  36.20 |    1000 | |        3 | 2020-10-01 |  65.45 |    1002 | +----------+------------+--------+---------+

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

實(shí)例16

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

mysql> select order_id, amount      -> from orders     -> limit 3; +----------+--------+ | order_id | amount | +----------+--------+ |        1 |  27.40 | |        2 |  36.20 | |        3 |  65.45 | +----------+--------+

實(shí)例17

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

mysql> select * from orders     -> where date = '2020-10-01'; +----------+------------+--------+---------+ | order_id | date       | amount | cust_id | +----------+------------+--------+---------+ |        1 | 2020-10-01 |  27.40 |    1001 | |        2 | 2020-10-01 |  36.20 |    1000 | |        3 | 2020-10-01 |  65.45 |    1002 | +----------+------------+--------+---------+

實(shí)例18

where子句接受多個條件。讓我們在上一個示例中為查詢添加另一個條件。

mysql> select * from orders     -> where date = '2020-10-01' and amount > 50; +----------+------------+--------+---------+ | order_id | date       | amount | cust_id | +----------+------------+--------+---------+ |        3 | 2020-10-01 |  65.45 |    1002 | +----------+------------+--------+---------+

實(shí)例19

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

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

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

實(shí)例20

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

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

實(shí)例21

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

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

mysql> select count(distinct(date)) as day_count     -> from orders; +-----------+ | day_count | +-----------+ |         4 | +-----------+

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

實(shí)例22

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

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

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

實(shí)例23

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

mysql> select date, avg(amount)     -> from orders     -> group by date     -> order by avg(amount) desc; +------------+-------------+ | date       | avg(amount) | +------------+-------------+ | 2020-10-01 |   43.016667 | | 2020-10-04 |   42.150000 | | 2020-10-03 |   37.025000 | | 2020-10-02 |   29.970000 | +------------+-------------+

實(shí)例24

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

mysql> select date, avg(amount)     -> from orders     -> group by date     -> having avg(amount) > 30     -> order by avg(amount) desc; +------------+-------------+ | date       | avg(amount) | +------------+-------------+ | 2020-10-01 |   43.016667 | | 2020-10-04 |   42.150000 | | 2020-10-03 |   37.025000 |

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

實(shí)例25

我們想找出每天的最大訂購量。

mysql> select date, max(amount)     -> from orders     -> group by date; +------------+-------------+ | date       | max(amount) | +------------+-------------+ | 2020-10-01 |       65.45 | | 2020-10-02 |       41.10 | | 2020-10-03 |       80.20 | | 2020-10-04 |       50.10 |

實(shí)例26

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

mysql> select cust_id, max(amount) - min(amount) as dif     -> from orders     -> group by cust_id     -> order by dif desc     -> limit 3; +---------+-------+ | cust_id | dif   | +---------+-------+ |    1007 | 46.00 | |    1009 | 28.95 | |    1002 | 24.35 | +---------+-------+

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

實(shí)例27

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

mysql> select location, gender, count(cust_id)     -> from customer     -> group by location, gender; +----------+--------+----------------+ | location | gender | count(cust_id) | +----------+--------+----------------+ | Austin   | female |              2 | | Austin   | male   |              1 | | Dallas   | female |              2 | | Dallas   | male   |              2 | | Houston  | female |              2 | | Houston  | male   |              1 | +----------+--------+----------------+

實(shí)例28

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

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

mysql> select customer.location, avg(orders.amount) as avg     -> from customer     -> join orders     -> on customer.cust_id = orders.cust_id     -> group by customer.location; +----------+-----------+ | location | avg       | +----------+-----------+ | Austin   | 33.333333 | | Dallas   | 34.591667 | | Houston  | 44.450000 | +----------+-----------+

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

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

實(shí)例29

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

mysql> select avg(c.age) as avg_age     -> from customer c     -> join orders o     -> on c.cust_id = o.cust_id     -> where o.date = '2020-10-03'; +---------+ | avg_age | +---------+ | 30.0000 | +---------+

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

實(shí)例30

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

mysql> select c.location, o.amount     -> from customer c     -> join orders o     -> on c.cust_id = o.cust_id     -> where o.amount = (select max(amount) from orders)     -> ; +----------+--------+ | location | amount | +----------+--------+ | Dallas   |  80.20 | +----------+--------+

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

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

感謝各位的閱讀,以上就是“怎么掌握SQL”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對怎么掌握SQL這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

分享標(biāo)題:怎么掌握SQL
網(wǎng)頁URL:http://muchs.cn/article16/ghgddg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、靜態(tài)網(wǎng)站、網(wǎng)站營銷、網(wǎng)站制作網(wǎng)站導(dǎo)航、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)