MySQL入門(二):查詢語句

這個系列是當(dāng)時參加Datawhale MySQL 第五期的筆記

SQL是什么?MySQL是什么?

1.SQL
Structured Query Language(結(jié)構(gòu)化查詢語言)的縮寫。它是一種專門用來與數(shù)據(jù)庫溝通的語言。

2.MySQL
是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在 WEB 應(yīng)用方面,MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件。

一、導(dǎo)入數(shù)據(jù)庫

第一步:下載示例數(shù)據(jù)庫

第二步:將下載的文件解壓縮到文件夾中(這里地址為D:\data\yiibaidb\yiibaidb.sql)

第三步:連接到MySQL服務(wù)器并創(chuàng)建數(shù)據(jù)庫
1.連接數(shù)據(jù)庫
找到MySQL Server 8.0\bin位置,然后打開命令提示符

cd C:\Program Files\MySQL\MySQL Server 8.0\bin
mysql -hlocalhost -uroot -p
在這里插入圖片描述

2.創(chuàng)建數(shù)據(jù)庫

mysql> CREATE DATABASE IF NOT EXISTS yiibaidb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql> use yiibaidb;

3.導(dǎo)入數(shù)據(jù)

mysql> use yiibaidb;
mysql> source D:\data\yiibaidb\yiibaidb.sql

第四步:測試并導(dǎo)入結(jié)果

mysql> select city,phone,country from `offices`;
在這里插入圖片描述

二、語句類型

本章節(jié)的展示基于Navicat 12.1

(一)查詢語句 SELECT FROM

1.語句解釋
從一個或多個表中檢索信息。

2.通用語法
以下為在MySQL數(shù)據(jù)庫中查詢數(shù)據(jù)通用的 SELECT 語法:

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
  • 查詢語句中可以使用一個或者多個表,表之間使用逗號(,)分割,并使用WHERE語句來設(shè)定查詢條件。
  • SELECT 命令可以讀取一條或者多條記錄。
  • 可以使用星號(*)來代替其他字段,SELECT語句會返回表的所有字段數(shù)據(jù)
  • 可以使用 WHERE 語句來包含任何條件。
  • 可以使用 LIMIT 屬性來設(shè)定返回的記錄數(shù)。
  • 可以通過OFFSET指定SELECT語句開始查詢的數(shù)據(jù)偏移量。默認(rèn)情況下偏移量為0。

3.操作示例
目標(biāo):查詢 yiibaidb數(shù)據(jù)庫customers表格的信息

SELECT * FROM customers ;

1

4.特殊案例
4.1去重語句
(1)定義:在 SELECT 后面加入 DISTINCT 可篩選出不同的(具有唯一性)的值。
(2)目標(biāo):查詢yiibaidb數(shù)據(jù)庫customers表格中city值有哪些

SELECT DISTINCT city  FROM customers ;

2

4.2 限制語句
(1)定義:使用 LIMIT 語句可以限制返回的條數(shù),若同時使用 OFFSET 會加入偏移(即從第幾行開始?。?br> 需要注意:第一個被檢索的行是第 0行,而不是第 1行。例如,LIMIT 1 OFFSET 1會檢索第 2行,而不是第 1行。

(2)目標(biāo):從3行開始選取yiibaidb數(shù)據(jù)庫customers表5條數(shù)據(jù)。

SELECT * FROM customers LIMIT 5 OFFSET 3 ;

3

4.3 CASE.WHEN.END判斷語句
(1)定義:CASE WHEN END 語法一般用于判斷條件后返回對應(yīng)的值
(2)分類:

-- 簡單函數(shù)
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
-- 搜索函數(shù)
CASE WHEN [expr] THEN [result1]…ELSE [default] END

需要注意:case函數(shù)只返回第一個符合條件的值,剩下的case部分將會被自動忽略。

(3)目標(biāo):
對于簡單函數(shù)

SELECT *,
    CASE country
      WHEN 'France' THEN '歐洲'
      WHEN 'USA' THEN '美洲'
      ELSE '其他'
    END '大洲'
FROM customers ;
在這里插入圖片描述

對于搜索函數(shù)


在這里插入圖片描述

(二)篩選語句 WHERE

1.語句解釋
實現(xiàn)有條件地從表中選取數(shù)據(jù),可將 WHERE 子句添加到 SELECT 語句中。

2.通用語法

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
  • 查詢語句中你可以使用一個或者多個表,表之間使用逗號, 分割,并使用WHERE語句來設(shè)定查詢條件。
  • 可以在 WHERE 子句中指定任何條件。
  • 可以使用 AND 或者 OR 指定一個或多個條件。
  • WHERE 子句也可以運用于 SQL 的 DELETE 或者 UPDATE 命令。
  • WHERE 子句類似于程序語言中的 if 條件,根據(jù) MySQL 表中的字段值來讀取指定的數(shù)據(jù)。

3.操作符
以下為操作符列表,可用于 WHERE 子句中。


在這里插入圖片描述

操作示例:
目標(biāo):查找yiibaidb數(shù)據(jù)庫customers表中符合以下條件數(shù)據(jù):國別是美國且creditlimit大于100000


在這里插入圖片描述

4.通配符
在 SQL 中,通配符與 SQL LIKE 操作符一起使用。SQL 通配符用于搜索表中的數(shù)據(jù)。

在 SQL 中,可使用以下通配符:


在這里插入圖片描述

操作示例:
目標(biāo):查找yiibaidb數(shù)據(jù)庫customers表中符合以下條件數(shù)據(jù):contactfirstname 是 J 開頭


在這里插入圖片描述

5.運算符
MySQL 主要有以下幾種運算符:
  • 算術(shù)運算符
  • 比較運算符
  • 邏輯運算符
  • 位運算符

(1)算術(shù)運算符
MySQL 支持的算術(shù)運算符包括:


在這里插入圖片描述

在除法運算和模運算中,如果除數(shù)為0,將是非法除數(shù),返回結(jié)果為NULL。

(2)比較運算符
SELECT 語句中的條件語句經(jīng)常要使用比較運算符。通過這些比較運算符,可以判斷表中的哪些記錄是符合條件的。比較結(jié)果為真,則返回 1,為假則返回 0,比較結(jié)果不確定則返回 NULL。

在這里插入圖片描述

(3)邏輯運算符

邏輯運算符用來判斷表達(dá)式的真假。如果表達(dá)式是真,結(jié)果返回 1。如果表達(dá)式是假,結(jié)果返回 0。

在這里插入圖片描述

(4)位運算符
位運算符是在二進(jìn)制數(shù)上進(jìn)行計算的運算符。位運算會先將操作數(shù)變成二進(jìn)制數(shù),進(jìn)行位運算。然后再將計算結(jié)果從二進(jìn)制數(shù)變回十進(jìn)制數(shù)。

在這里插入圖片描述

(三)分組語句 GROUP BY

1.語句解釋
GROUP BY 語句根據(jù)一個或多個列對結(jié)果集進(jìn)行分組。在分組的列上我們可以使用 COUNT, SUM, AVG,等函數(shù)。

2.通用語法

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

3.操作示例
目標(biāo):統(tǒng)計yiibaidb數(shù)據(jù)庫customers表中country類別數(shù)據(jù)


在這里插入圖片描述

注意:在分組后的結(jié)果中,不可以使用 WHERE 對分組結(jié)果進(jìn)行篩選,只能使用 HAVING 語句

(四)排序語句 ORDER BY

1.語句解釋
對讀取的數(shù)據(jù)進(jìn)行排序,此時可以使用 MySQL 的 ORDER BY 子句來設(shè)定想按哪個字段哪種方式來進(jìn)行排序,再返回搜索結(jié)果。

2.通用語法

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]

ORDER BY 語句用于根據(jù)指定的列對結(jié)果集進(jìn)行排序。ORDER BY 語句默認(rèn)按照升序?qū)τ涗涍M(jìn)行排序。如果希望按照降序?qū)τ涗涍M(jìn)行排序,可以使用 DESC 關(guān)鍵字。

  • 可以使用任何字段來作為排序的條件,從而返回排序后的查詢結(jié)果。
  • 可以設(shè)定多個字段來排序。
  • 可以使用 ASC 或 DESC 關(guān)鍵字來設(shè)置查詢結(jié)果是按升序或降序排列。 默認(rèn)情況下,它是按升序排列。
  • 可以添加 WHERE...LIKE 子句來設(shè)置條件。

3.操作示例
目標(biāo):對yiibaidb數(shù)據(jù)庫customers表數(shù)據(jù)先按照customername排序,再按照customernumber排序


在這里插入圖片描述

三、函數(shù)

MySQL 有很多內(nèi)置的函數(shù):

  • 字符串函數(shù)
  • 數(shù)字函數(shù)
  • 日期函數(shù)

具體可查看MySQL 函數(shù)|菜鳥教程

四、SQL注釋

(一)單行注釋

1.使用 #

#單行注釋方法一
select * from customers;

或者
2.使用--


-- 單行注釋方法二
select * from customers

注意:--后跟有一個空格

(二)多行注釋

注釋從 /* 開始,到 / 結(jié)束, / 和 */ 之間的任何內(nèi)容都是注釋。

/*
此處為注釋....
*/
select * from customers;

五、SQL代碼規(guī)范

可參看

SQL編程格式的優(yōu)化建議
SQL style guide by Simon Holywell

練習(xí)

練習(xí)一:查找重復(fù)的電子郵箱(難度:簡單)
創(chuàng)建 email表,并插入如下三行數(shù)據(jù)
+----+---------+
| Id | Email |
+----+---------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+----+---------+
編寫一個 SQL 查詢,查找 email 表中所有重復(fù)的電子郵箱。
根據(jù)以上輸入,你的查詢應(yīng)返回以下結(jié)果:
+---------+
| Email |
+---------+
| a@b.com |
+---------+
說明:所有電子郵箱都是小寫字母。

第一步:新建數(shù)據(jù)庫

mysql> CREATE DATABASE IF NOT EXISTS emailtest DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql> use emailtest;

第二步:新建數(shù)據(jù)表

mysql> CREATE TABLE email ( ID INT NOT NULL PRIMARY KEY, Email VARCHAR(255));

第三步:插入數(shù)據(jù)

mysql> INSERT INTO email VALUES('1','a@b.com');
mysql> INSERT INTO email VALUES('2','c@d.com');
mysql> INSERT INTO email VALUES('3','a@b.com');

第四步:查詢數(shù)據(jù)

SELECT Email FROM email GROUP BY Email HAVING COUNT(Email)>1
在這里插入圖片描述

項目二:查找大國(難度:簡單)
創(chuàng)建如下 World 表
+-----------------+------------+------------+--------------+---------------+
| name | continent | area | population | gdp |
+-----------------+------------+------------+--------------+---------------+
| Afghanistan | Asia | 652230 | 25500100 | 20343000 |
| Albania | Europe | 28748 | 2831741 | 12960000 |
| Algeria | Africa | 2381741 | 37100000 | 188681000 |
| Andorra | Europe | 468 | 78115 | 3712000 |
| Angola | Africa | 1246700 | 20609294 | 100990000 |
+-----------------+------------+------------+--------------+---------------+
如果一個國家的面積超過300萬平方公里,或者(人口超過2500萬并且gdp超過2000萬),那么這個國家就是大國家。
編寫一個SQL查詢,輸出表中所有大國家的名稱、人口和面積。
例如,根據(jù)上表,我們應(yīng)該輸出:
+--------------+-------------+--------------+
| name | population | area |
+--------------+-------------+--------------+
| Afghanistan | 25500100 | 652230 |
| Algeria | 37100000 | 2381741 |
+--------------+-------------+--------------+
第一步:新建數(shù)據(jù)庫

mysql> CREATE DATABASE IF NOT EXISTS worldtest DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql> use worldtest;

第二步:新建數(shù)據(jù)表

mysql> CREATE TABLE World ( name VARCHAR(50) NOT NULL,continent VARCHAR(50) NOT NULL,
area INT NOT NULL,population INT NOT NULL,gdp INT NOT NULL);

第三步:插入數(shù)據(jù)

mysql>INSERT INTO World VALUES( 'Afghanistan', 'Asia',652230,25500100,20343000);
mysql>INSERT INTO World VALUES( 'Albania', 'Europe' ,28748,2831741,12960000);
mysql>INSERT INTO World VALUES( 'Algeria', 'Africa' ,2381741,37100000,188681000);
mysql>INSERT INTO World VALUES( 'Andorra' , 'Europe' ,468,78115,3712000);
mysql>INSERT INTO World VALUES( 'Angola' , 'Africa' ,1246700,20609294,100990000);

第四步:查詢數(shù)據(jù)

SELECT name, population, area FROM world WHERE area > 3000000 OR (population>25000000 AND gdp>20000000);

在這里插入圖片描述

參考資料:
1.MySQL導(dǎo)入示例數(shù)據(jù)庫
2.MySQL命令行學(xué)習(xí)
3.MySQL命令行工具和基本操作
4.MySQL基礎(chǔ) - 查詢語句
5.MySQL 教程
6.SQL的case when then else end語句的用法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容