各位CSDN的uu們好呀,好久沒有更新小雅蘭的MySQL數(shù)據(jù)庫專欄啦,接下來一段時(shí)間,小雅蘭都會(huì)更新MySQL數(shù)據(jù)庫的知識,下面,讓我們進(jìn)入今天的主題吧——基本的SELECT語句?。?!
SQL概述
SQL語言的規(guī)則與規(guī)范
基本的SELECT語句
顯示表結(jié)構(gòu)
過濾數(shù)據(jù)
SQL概述
SQL背景知識
1946 年,世界上第一臺電腦誕生,如今,借由這臺電腦發(fā)展起來的互聯(lián)網(wǎng)已經(jīng)自成江湖。在這幾十年里,無數(shù)的技術(shù)、產(chǎn)業(yè)在這片江湖里沉浮,有的方興未艾,有的已經(jīng)幾幕興衰。但在這片浩蕩的波動(dòng)里,有一門技術(shù)從未消失,甚至“老當(dāng)益壯”,那就是 SQL。
45 年前,也就是 1974 年,IBM 研究員發(fā)布了一篇揭開數(shù)據(jù)庫技術(shù)的論文《SEQUEL:一門結(jié)構(gòu) 化的英語查詢語言》,直到今天這門結(jié)構(gòu)化的查詢語言并沒有太大的變化,相比于其他語言, SQL 的半衰期可以說是非常長了。
不論是前端工程師,還是后端算法工程師,都一定會(huì)和數(shù)據(jù)打交道,都需要了解如何又快又準(zhǔn)確地 提取自己想要的數(shù)據(jù)。更別提數(shù)據(jù)分析師了,他們的工作就是和數(shù)據(jù)打交道,整理不同的報(bào)告,以 便指導(dǎo)業(yè)務(wù)決策。
SQL(Structured Query Language,結(jié)構(gòu)化查詢語言)是使用關(guān)系模型的數(shù)據(jù)庫應(yīng)用語言, 與數(shù)據(jù)直接打交道 ,由 IBM 上世紀(jì)70年代開發(fā)出來。后由美國國家標(biāo)準(zhǔn)局(ANSI)開始著手制定SQL標(biāo)準(zhǔn), 先后有 SQL-86 , SQL-89 , SQL-92 , SQL-99 等標(biāo)準(zhǔn)。
SQL 有兩個(gè)重要的標(biāo)準(zhǔn),分別是 SQL92 和 SQL99,它們分別代表了 92 年和 99 年頒布的 SQL 標(biāo) 準(zhǔn),我們今天使用的 SQL 語言依然遵循這些標(biāo)準(zhǔn)。
不同的數(shù)據(jù)庫生產(chǎn)廠商都支持SQL語句,但都有特有內(nèi)容。
SQL語言排行榜
自從 SQL 加入了 TIOBE 編程語言排行榜,就一直保持在 Top 10。
SQL 分類
SQL語言在功能上主要分為如下3大類:
- DDL(Data Definition Languages、數(shù)據(jù)定義語言),這些語句定義了不同的數(shù)據(jù)庫、表、視圖、索引等數(shù)據(jù)庫對象,還可以用來創(chuàng)建、刪除、修改數(shù)據(jù)庫和數(shù)據(jù)表的結(jié)構(gòu)。主要的語句關(guān)鍵字包括 CREATE 、 DROP 、 ALTER 等。
- DML(Data Manipulation Language、數(shù)據(jù)操作語言),用于添加、刪除、更新和查詢數(shù)據(jù)庫記 錄,并檢查數(shù)據(jù)完整性。 主要的語句關(guān)鍵字包括 INSERT 、 DELETE 、 UPDATE 、 SELECT 等。 SELECT是SQL語言的基礎(chǔ),最為重要。
- DCL(Data Control Language、數(shù)據(jù)控制語言),用于定義數(shù)據(jù)庫、表、字段、用戶的訪問權(quán)限和安全級別。主要的語句關(guān)鍵字包括 GRANT 、 REVOKE 、 COMMIT 、 ROLLBACK 、 SAVEPOINT 等。
因?yàn)椴樵冋Z句使用的非常的頻繁,所以很多人把查詢語句單拎出來一類:DQL(數(shù)據(jù)查詢語言)。
還有單獨(dú)將 COMMIT 、 ROLLBACK 取出來稱為TCL (Transaction Control Language,事務(wù)控制語言)。 ?
SQL語言的規(guī)則與規(guī)范
基本準(zhǔn)則
SQL 可以寫在一行或者多行。
為了提高可讀性,各子句分行寫,必要時(shí)使用縮進(jìn)每條命令以 ; 或 \g 或 \G 結(jié)束
關(guān)鍵字不能被縮寫也不能分行
關(guān)于標(biāo)點(diǎn)符號
????????必須保證所有的()、單引號、雙引號是成對結(jié)束的
????????必須使用英文狀態(tài)下的半角輸入方式
????????字符串型和日期時(shí)間類型的數(shù)據(jù)可以使用單引號(' ')表示
????????列的別名,盡量使用雙引號(" "),而且不建議省略as
SQL大小寫規(guī)范 (建議遵守)
MySQL 在 Windows 環(huán)境下是大小寫不敏感的
MySQL 在 Linux 環(huán)境下是大小寫敏感的
????????數(shù)據(jù)庫名、表名、表的別名、變量名是嚴(yán)格區(qū)分大小寫的
????????關(guān)鍵字、函數(shù)名、列名(或字段名)、列的別名(字段的別名) 是忽略大小寫的。
推薦采用統(tǒng)一的書寫規(guī)范:
????????數(shù)據(jù)庫名、表名、表別名、字段名、字段別名等都小寫
????????SQL 關(guān)鍵字、函數(shù)名、綁定變量等都大寫
注釋
可以使用如下格式的注釋結(jié)構(gòu)
單行注釋:#注釋文字(MySQL特有的方式)
單行注釋:-- 注釋文字(--后面必須包含一個(gè)空格。)
多行注釋:/* 注釋文字 */
?命名規(guī)則
- 數(shù)據(jù)庫、表名不得超過30個(gè)字符,變量名限制為29個(gè)
- 必須只能包含 A–Z, a–z, 0–9, _共63個(gè)字符
- 數(shù)據(jù)庫名、表名、字段名等對象名中間不要包含空格
- 同一個(gè)MySQL軟件中,數(shù)據(jù)庫不能同名;同一個(gè)庫中,表不能重名;同一個(gè)表中,字段不能重名
- 必須保證你的字段沒有和保留字、數(shù)據(jù)庫系統(tǒng)或常用方法沖突。如果堅(jiān)持使用,請?jiān)赟QL語句中使 用`(著重號)引起來
- 保持字段名和類型的一致性,在命名字段并為其指定數(shù)據(jù)類型的時(shí)候一定要保證一致性。假如數(shù)據(jù) 類型在一個(gè)表里是整數(shù),那在另一個(gè)表里可就別變成字符型了
舉例:
#以下兩句是一樣的,不區(qū)分大小寫
show databases;
SHOW DATABASES;
#創(chuàng)建表格
#create table student info(...); #表名錯(cuò)誤,因?yàn)楸砻锌崭?create table student_info(...);
#其中order使用``飄號,因?yàn)閛rder和系統(tǒng)關(guān)鍵字或系統(tǒng)函數(shù)名等預(yù)定義標(biāo)識符重名了
CREATE TABLE `order`();
select id as "編號", `name` as "姓名" from t_stu; #起別名時(shí),as都可以省略
select id as 編號, `name` as 姓名 from t_stu; #如果字段別名中沒有空格,那么可以省略""
select id as 編 號, `name` as 姓 名 from t_stu; #錯(cuò)誤,如果字段別名中有空格,那么不能省略""
數(shù)據(jù)導(dǎo)入指令
在命令行客戶端登錄mysql,使用source指令導(dǎo)入
mysql> source d:\mysqldb.sql
mysql> desc employees;
+----------------+-------------+------+-----+---------+-------+
| Field ? ? ? ? | Type ? ? ? | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| employee_id ? | int(6) ? ? | 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(6) ? ? | YES | MUL | NULL ? | ? ? ? |
| department_id | int(4) ? ? | YES | MUL | NULL ? | ? ? ? |
+----------------+-------------+------+-----+---------+-------+
11 rows in set (0.00 sec)
基本的SELECT語句
SELECT...
SELECT 1; #沒有任何子句
SELECT 9/2; #沒有任何子句
SELECT ... FROM
語法:
SELECT ? 標(biāo)識選擇哪些列
FROM ? ? 標(biāo)識從哪個(gè)表中選擇
選擇全部列:
SELECT *
FROM ? departments;
?
一般情況下,除非需要使用表中所有的字段數(shù)據(jù),最好不要使用通配符‘*’。使用通配符雖然可以節(jié)省輸入查詢語句的時(shí)間,但是獲取不需要的列數(shù)據(jù)通常會(huì)降低查詢和所使用的應(yīng)用程序的效率。通配符的優(yōu)勢是,當(dāng)不知道所需要的列的名稱時(shí),可以通過它獲取它們。
在生產(chǎn)環(huán)境下,不推薦你直接使用 SELECT * 進(jìn)行查詢。 ?
選擇特定的列:
SELECT department_id, location_id
FROM ? departments;
?
MySQL中的SQL語句是不區(qū)分大小寫的,因此SELECT和select的作用是相同的,但是,許多開發(fā)人員習(xí)慣將關(guān)鍵字大寫、數(shù)據(jù)列和表名小寫,讀者也應(yīng)該養(yǎng)成一個(gè)良好的編程習(xí)慣,這樣寫出來的代碼更容易閱讀和維護(hù)。 ?
列的別名
重命名一個(gè)列
便于計(jì)算
緊跟列名,也可以在列名和別名之間加入關(guān)鍵字AS,別名使用雙引號,以便在別名中包含空格或特殊的字符并區(qū)分大小寫。
AS 可以省略
建議別名簡短,見名知意
舉例
SELECT last_name AS name, commission_pct comm
FROM ? employees;
?
SELECT last_name "Name", salary*12 "Annual Salary"
FROM ? employees;
?
?
去除重復(fù)行
默認(rèn)情況下,查詢會(huì)返回全部行,包括重復(fù)行。
SELECT department_id
FROM ? employees;
?
在SELECT語句中使用關(guān)鍵字DISTINCT去除重復(fù)行
SELECT DISTINCT department_id
FROM ? employees;
?
針對于:
SELECT DISTINCT department_id,salary
FROM employees;
DISTINCT 其實(shí)是對后面所有列名的組合進(jìn)行去重,你能看到最后的結(jié)果是 74 條,因?yàn)檫@ 74 個(gè)部門id不同,都有 salary 這個(gè)屬性值。如果你想要看都有哪些不同的部門(department_id),只需 要寫 DISTINCT department_id 即可,后面不需要再加其他的列名了。
空值參與運(yùn)算
?所有運(yùn)算符或列值遇到null值,運(yùn)算的結(jié)果都為null
SELECT employee_id,salary,commission_pct,
12 * salary * (1 + commission_pct) "annual_sal"
FROM employees;
這里你一定要注意,在 MySQL 里面, 空值不等于空字符串。一個(gè)空字符串的長度是 0,而一個(gè)空值的長度是空。而且,在 MySQL 里面,空值是占用空間的。
著重號
錯(cuò)誤的
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)
mysql> SELECT * FROM `order`;
+----------+------------+
| order_id | order_name |
+----------+------------+
| ? ? ? ?1 | shkstart ? |
| ? ? ? ?2 | tomcat ? ? |
| ? ? ? ?3 | dubbo ? ? |
+----------+------------+
3 rows in set (0.00 sec)
結(jié)論
我們需要保證表中的字段、表名等沒有和保留字、數(shù)據(jù)庫系統(tǒng)或常用方法沖突。如果真的相同,請?jiān)赟QL語句中使用一對``(著重號)引起來。
查詢常數(shù)
SELECT 查詢還可以對常數(shù)進(jìn)行查詢。對的,就是在 SELECT 查詢結(jié)果中增加一列固定的常數(shù)列。這列的取值是我們指定的,而不是從數(shù)據(jù)表中動(dòng)態(tài)取出的。
你可能會(huì)問為什么我們還要對常數(shù)進(jìn)行查詢呢?
SQL 中的 SELECT 語法的確提供了這個(gè)功能,一般來說我們只從一個(gè)表中查詢數(shù)據(jù),通常不需要增加一個(gè) 固定的常數(shù)列,但如果我們想整合不同的數(shù)據(jù)源,用常數(shù)列作為這個(gè)表的標(biāo)記,就需要查詢常數(shù)。
比如說,我們想對 employees 數(shù)據(jù)表中的員工姓名進(jìn)行查詢,同時(shí)增加一列字段 corporation ,這個(gè)字段固定值為“尚硅谷”,可以這樣寫:
SELECT '尚硅谷' as corporation, last_name FROM employees;
顯示表結(jié)構(gòu)
使用DESCRIBE 或 DESC 命令,表示表結(jié)構(gòu)。
DESCRIBE employees;
或
DESC employees;
mysql> desc employees;
+----------------+-------------+------+-----+---------+-------+
| Field ? ? ? ? | Type ? ? ? | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| employee_id ? | int(6) ? ? | 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(6) ? ? | YES | MUL | NULL ? | ? ? ? |
| department_id | int(4) ? ? | YES | MUL | NULL ? | ? ? ? |
+----------------+-------------+------+-----+---------+-------+
11 rows in set (0.00 sec)
其中,各個(gè)字段的含義分別解釋如下:
- Field:表示字段名稱。
- Type:表示字段類型,這里 barcode、goodsname 是文本型的,price 是整數(shù)類型的。
- Null:表示該列是否可以存儲(chǔ)NULL值。
- Key:表示該列是否已編制索引。PRI表示該列是表主鍵的一部分;UNI表示該列是UNIQUE索引的一 部分;MUL表示在列中某個(gè)給定值允許出現(xiàn)多次。
- Default:表示該列是否有默認(rèn)值,如果有,那么值是多少。
- Extra:表示可以獲取的與給定列有關(guān)的附加信息,例如AUTO_INCREMENT等。
過濾數(shù)據(jù)
語法:
SELECT 字段1,字段2
FROM 表名
WHERE 過濾條件
使用WHERE 子句,將不滿足條件的行過濾掉
WHERE子句緊隨 FROM子句
舉例
SELECT employee_id, last_name, job_id, department_id
FROM ? employees
WHERE department_id = 90 ;
?加油!??!文章來源:http://www.zghlxwxcb.cn/news/detail-709515.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-709515.html
到了這里,關(guān)于基本的SELECT語句——“MySQL數(shù)據(jù)庫”的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!