MySQL-03基本的SELECT語句(基礎)

来源:https://www.cnblogs.com/changming06/archive/2023/12/05/17878515.html
-Advertisement-
Play Games

課程中,第二章是MySQL環境搭建,因為我是網上找的博客,下載zip,直接安裝的,就沒看視頻,所以沒有第二章筆記。這裡給出MySQL社區版下載地址。 C-03.基本的SELECT語句 1.SQL概述 1.1 SQL背景知識 1974年,IBM研究員發佈了一篇揭開資料庫技術的論文《SEQUEL:一門結 ...


課程中,第二章是MySQL環境搭建,因為我是網上找的博客,下載zip,直接安裝的,就沒看視頻,所以沒有第二章筆記。這裡給出MySQL社區版下載地址

C-03.基本的SELECT語句

1.SQL概述

1.1 SQL背景知識

  • 1974年,IBM研究員發佈了一篇揭開資料庫技術的論文《SEQUEL:一門結構化的英語查詢語言》,直到今天這門結構化的查詢語言並沒有太大的變化,相比於其他語言,SQL的半衰期可以說是非常長了。
  • SQL(Structured Query Language,結構化查詢語言)是使用關係模型的資料庫應用語言,與數據直接打交道,由IBM上世紀70年代開發出來。後由美國國家標準局(ANSI)開始著手指定SQL標準,先後有SQL-86,SQL-89,SQL-92,SQL-99等標準。其中SQL-92和SQL-99,分別是1992年和1999年頒佈的SQL標準,我們今天使用的SQL語言依然遵循這些標準。
  • 不同的資料庫生產廠商都支持SQL語句,但也有其特定的內容。就像我們國家推行普通話,但是每個省份或地區里都會帶一點自己地域特色的'普通話'一樣。大部分指令或函數,是資料庫都支持的,只是有些是某一個資料庫支持的。

1.2 SQL分類

SQL語言在功能上主要分為3大類:

  • DDL(Data Definition Language、數據定義語言),這些語句定義了不同的資料庫、表、視圖、索引等資料庫對象,還可以用來創建、刪除、修改資料庫和數據表的結構。
    • 主要的語句關鍵字有,CREATEDROPALTER等。
  • DML(Data Manipulation Language、數據操作語言),用於添加,刪除,更新和查詢資料庫記錄,並檢查數據完整性。
    • 主要的語句關鍵字包括INSERTDELETEUPDATESELECT等。
    • SELECT是SQL語言的基礎,最為重要。
  • DCL(Data Control Language、數據控制語言),用於定義資料庫、表、欄位、用戶的訪問許可權和安全級別。
    • 主要的語句關鍵字包括GRANTREVOKECOMMITROLLBACKSAVEPOINT等。
  • 因為查詢語句使用的最為頻繁,所以很多人把查詢語句單拎出來一類:DQL(Data Query Language、數據查詢語言)。還有單獨將COMMITROLLBACK取出來稱為TCL(Transaction Control Language、事務控制語言)。

2.SQL語言的規則和規範

2.1 基本規則

  • SQL可以寫在一行或者多行。為了提高可讀性,各子句分行寫,必要時使用縮進。
  • 每條命令以;或\g或\G結束。
  • 關鍵字不能被縮寫也不能分行。
  • 關於標點符號:
    • 必須保證所有的(),單引號,雙引號是成對結束的。
    • 必須使用英文狀態下的半形輸入方式。
    • 字元串類型和日期時間類型的數據可以使用單引號('')表示。
    • 列的別名,儘量使用雙引號(""),而且不建議省略as

2.4 SQL大小寫規範

  • MySQL在Windows環境下是大小寫不敏感的。
  • MySQL在Linux環境下是大小寫敏感的。
    • 資料庫名,表名,表的別名,變數名是嚴格區分大小寫的。
    • 關鍵字,函數名,列名(或欄位名),列的別名是忽略大小寫的。
  • 推薦採用統一的書寫規範。
    • 資料庫名,表名,表別名,欄位名,欄位別名等都小寫。
    • SQL關鍵字,函數名,綁定變數等都大寫。

2.3 註釋

可以使用如下格式的註釋結構

單行註釋 #註釋內容(MySQL特有的)。
單行註釋 -- 註釋內容(--後必須包含一個空格)。
多行註釋 /* 註釋內容 */

2.4 命名規則

  • 資料庫,表名不得超過30個字元,變數名限製為29個。
  • 必須只能使用A-Z,a-z,0-9,_共63個字元。
  • 資料庫名,表名,欄位名等對象名中間不要包含空格。
  • 同一個MySQL軟體中,資料庫不能同名,同一個庫中,表不能同名,同一個表中,欄位不能同名。
  • 必須保證欄位沒有和保留字,資料庫系統或常用方法衝突。如果堅持使用,請在SQL語句中使用``著重號引起來。
  • 保持欄位名和類型的一致性,在命名欄位併為其指定數據類型的時候一定要保持一致性。例如一個欄位在一張表裡是整數,在另一張表裡可就變成了字元型了。
#以下兩句是一樣的,不區分大小寫
show database;
SHOW DATABASE;

#創建表格
CREATE TABLE student info(...);#表名錯誤,因為表名有空格
CREATE TABLE srudent_info(...);

#表名order使用了著重號``,因為order是系統關鍵字
CREATE TABLE `order`(id INT,lname VARCHAR(20));

SELECT id AS "編號",name AS "姓名" FROM t_stu; #起別名時,as可以省略
SELECT id AS 編號,name AS 姓名 FROM t_stu; #別名中沒有空格時,""可以省略
SELECT id AS 編 號,name AS "姓名" FROM t_stu; #錯誤,別名中有空格時,""不可以省略

SELECT id AS "編號",name AS "姓名" FROM t_stu; #這一條才最符合SQL編寫規範,不建議省略AS關鍵字和""

2.5 數據導入指令

在命令行客戶端登錄MySQL,使用source指令導入

mysql> source d:\mysqldb.sql;
DESC 表名 # 查看表結構

3.基本的SELECT語句

3.1 SELECT..

SELECT 1;#沒有任何子句
SELECT 9/2;#沒有任何子句

3.2 SELECT ... FROM tableName;

  • 語法
SELECT 標識選擇的列
FROM 選擇的表名
  • 選擇全部列;
SELECT * 
FROM departments;

一般情況下,除非需要使用表中所有欄位數據,否則不要使用通配符 '*'。使用通配符雖然可以節省輸入查詢語句的時間,但是獲取不需要的列數據通常會降低查詢和所使用的應用程式的效率。通配符的優勢是,當不知道所需要的列的名稱時,可以使用通配符獲取。
在生產環境下,不推薦直接使用SELECT *進行查詢。

  • 選擇特定的列;
SELECT department_id,location_id
FROM departments;

Windows下,MySQL中的SQL語句是不區分大小寫的,因此SELECT和select的作用是相同的。但是,許多開發人員習慣將關鍵字大寫,數據列和表名小寫,讀者也應該養成一個良好的編程習慣,這樣寫的SQL更容易閱讀和維護。

3.3 列的別名

  • 重命名列;

  • 便於計算;

  • 緊跟列名,也可以在列名和別名之間加入關鍵字AS,別名使用雙引號,以便在別名中包含空格和特殊的字元並區分大小寫;

  • AS可以省略;

  • 建議別名簡短,見名知意;

SELECT last_name AS name,commission_pct AS comm
FROM employees;

SELECT last_name AS "Name",salary*12 AS "Annual Salary"
FROM employees;

3.4 去除重覆行

預設情況下,查詢會返回全部行,包括重覆行。

SELECT departmen_id
FROM employees;

在SELECT語句中使用關鍵字DISTINCT去除重覆行

SELECT DISTINCT department_id
FROM employees;

針對於:

SELECT DISTINCT department_id,salary
FROM employees;

這裡有兩點需要註意:

  1. DISTINCT需要放到所有列名的前面,如果寫成 SELECT salary,DISTINCT department_id FROM employees;會報錯。
  2. DISTINCT其實是對後面所有列名的組合進行去重

3.5 NULL參與運算

  • 所有運算符或列值遇到null值,運算的結果都為null
SELECT employee_id,salary,commission_pct,12 * salary * (1 +commission_pct) "annual_sal"
FROM employess;

需要註意,在MySQL里,空值不等於空字元串。一個空字元串的長度是0,而一個空值的長度是空。而且,在MySQL里,空值是占用存儲空間的。

3.6 著重號

  • 錯誤的
mysql> SELECT * FROM order;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order' at line 1
  • 正確的
mysql> SELECT * FROM `order`;
+----------+------------+
| order_id | order_name |
+----------+------------+
|        1 | shkstart   |
|        2 | tomcat     |
|        3 | dubbo      |
+----------+------------+
3 rows in set (0.00 sec)
  • 結論
    需要保證表中的欄位,表名等沒有和保留字,資料庫系統或常用方法衝突。如果真的相同,需要在SQL語句中使用一對著重號引起來。

3.7 查詢常數

SELECT查詢還可以對常數進行查詢。對的,就是在SELECT查詢結果中增加一列固定的常數列。這列的取值是我們制定的,而不是從數據表中動態取出的。
SQL中的SELECT語法的確提供了這個功能,一般來說我們只從一個表中查詢數據,通常不需要增加一個固定的常數列,但如果我們想整合不同的數據源,用常數列作為這個表的標記,就需要查詢常數。
比如說,我們相對employees數據表中的員工姓名進行查詢,同時增加一列欄位corporation,這個欄位的固定值為“wind”,可以這樣寫:

SELECT 'wind' AS corporation,last_name FROM employees;

4.顯示表結構

使用DESCRIBE或者DESC指令,來顯示表結構。

DESCRIBE employees;
或
DESC employees;
mysql> DESC employees;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| employee_id    | int         | NO   | PRI | 0       |       |
| first_name     | varchar(20) | YES  |     | NULL    |       |
| last_name      | varchar(25) | NO   |     | NULL    |       |
| email          | varchar(25) | NO   | UNI | NULL    |       |
| phone_number   | varchar(20) | YES  |     | NULL    |       |
| hire_date      | date        | NO   |     | NULL    |       |
| job_id         | varchar(10) | NO   | MUL | NULL    |       |
| salary         | double(8,2) | YES  |     | NULL    |       |
| commission_pct | double(2,2) | YES  |     | NULL    |       |
| manager_id     | int         | YES  | MUL | NULL    |       |
| department_id  | int         | YES  | MUL | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
11 rows in set (0.00 sec)

其中,各個欄位的含義,分別解釋如下:

  • Field:表示欄位的名稱;
  • Type:表示欄位類型;
  • Null:表示該列是否可以存儲NULL值;
  • Key:表示該列是否已編製索引。PRI表示該列是表主鍵的一部分;UNI表示該列是UNIQUE索引的一部分;MUL表示在列中某個給定值允許出現多次;
  • Default:表示該列是否有預設值,如果有,值是多少;
  • Extra:表示可以獲取的與給定的列有關的附加信息,列入AUTO_INCREMENT等。

5.過濾數據(WHERE)

  • 語法
SELECT 欄位1,欄位2
FROM 表名
WHERE 過濾條件
  • 使用WHERE子句,將不滿足條件的行過濾掉。
  • WHERE子句緊隨FROM子句。
  • 舉例
mysql> SELECT employee_id,last_name,job_id,department_id
    -> FROM employees
    -> WHERE department_id = 90;
+-------------+-----------+---------+---------------+
| employee_id | last_name | job_id  | department_id |
+-------------+-----------+---------+---------------+
|         100 | King      | AD_PRES |            90 |
|         101 | Kochhar   | AD_VP   |            90 |
|         102 | De Haan   | AD_VP   |            90 |
+-------------+-----------+---------+---------------+
3 rows in set (0.00 sec)

本章練習

# 【題目】
#1.查詢員工12個月的工資總和,並起別名為ANNUAL SALARY. ANNUAL adj.每年的,一年的;n.年報,一年生植物;
SELECT salary * 12 AS "ANNUAL_SALARY"
FROM employees;
#還有佣金列commission_pct
SELECT salary * 12 * (1 + IFNULL(commission_pct,0)) AS "ANNUAL_SALARY"
FROM employees;

#2.查詢employees表中去除重覆的job_id以後的數據
SELECT DISTINCT job_id
FROM employees;

#3.查詢工資大於12000的員工姓名和工資 complete adj.完全的,完整的;v.完成,使完整,結束;
SELECT CONCAT(first_name," ",last_name) AS "complete_name",salary
FROM employees
WHERE salary > 12000;

#4.查詢員工工號為176員工的姓名和部門號
SELECT CONCAT(first_name," ",last_name) AS "complete_name",department_id
FROM employees
WHERE employee_id = 176;

#5.顯示表departments的結構,並查詢其中的全部數據
DESCRIBE departments;#DESC departments;
SELECT * FROM departments;

只是為了記錄自己的學習歷程,且本人水平有限,不對之處,請指正。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Autofac 是一個功能豐富的 .NET 依賴註入容器,用於管理對象的生命周期、解決依賴關係以及進行屬性註入。本文將詳細講解 Autofac 的使用方法,包括多種不同的註冊方式,屬性註入,以及如何使用多個 ContainerBuilder 來註冊和合併組件。我們將提供詳細的源代碼示例來說明每個概念 ...
  • 1.查看IP地址 ip add 2.進入網卡配置文件所在目錄 cd /etc/sysconfig/network-scripts/ ll 註: ifcfg-ens33=ifcfg-網卡名 | ifcfg-lo : 網路迴環文件 3.編輯網卡配置文件 vi /etc/sysconfig/network ...
  • 目錄一、fdisk工具創建一個磁碟分區1、虛擬機添加測試硬碟2、創建磁碟分區3、文件系統管理磁碟分區4、掛載二、parted命令使用場景操作命令'help'查看命令列表查看分區情況劃分出主分區"parted1"刪除分區格式化操作設置開機自動掛載方法一:編輯/etc/fstab文件方法二:編輯/etc ...
  • 組管理和許可權管理 一、組管理 Linux組的基本介紹 Linux組: 在Linux中的每個用戶必須屬於一個組,不能獨立於組外。在Linux中每個文件 有所有者、所在組、其它組的概念。 文件/目錄 所有者(User): 一般為文件的創建者,誰創建了該文件,就自然的成為該文件的所有者。 文件/目錄 所在 ...
  • vim是vi的增強版,由vim-enhanced軟體包提供。vim具有vi不具備的特性eg:命令語法的高亮 vim是一個預設的文本編輯器來進行使用,在眾多的Linux發行版中均被內置,成為Linux主流的文本編輯器。 gvim:vim的圖形化版本 提供在vim-x11包里、 1、vim的工作模式 命 ...
  • 文件系統 文件系統結構 tip:[start]僅舉例常見內容tip:[end] / 根目錄 bin 可執行文件命令 (ls,...) etc 配置文件 (nginx代理伺服器配置文件,...) var 日誌log文件 lib 存頭文件/安裝包 home 用戶的家目錄 (/home/acs,...) ...
  • 想要確保你的Windows服務即使在崩潰後也能自動重啟嗎?這篇文章教你如何用一個小巧的批處理腳本來實現這一點。教你怎麼設置定時檢查,如果發現服務掛了,就立刻拉起來。跟著步驟做,讓你的服務穩定運行不再是難題! ...
  • 背景 Redis是一種基於客戶端-服務端模型以及請求/響應協議的TCP服務。一個請求會遵循以下步驟: 1 客戶端向服務端發送命令分四步(發送命令→命令排隊→命令執行→返回結果),並監聽Socket返回,通常以阻塞模式等待服務端響應。 2 服務端處理命令,並將結果返回給客戶端。 上述兩步稱為:Roun ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...