SQL結構化查詢語句
SQL定義了查詢所有關系型數據庫的規則。
1、通用語法
- SQL語句可以單行或者多行書寫,以分號結尾
- 可以使用空格和縮進增強可讀性
- 不區分大小寫,但是關鍵字建議大寫
- 3種注釋
-
注釋內容;多行注釋/*;-- 注釋內容
-
2、SQL分類
- DDL(Date Definition Language)數據定義語言
- 用來定義數據庫對象:數據庫、表、列等,包括關鍵字:create,drop、alte
- DML(Data Manipulation Language)數據操作語言,增刪改
- 用來對數據庫的表中的數據進行增刪查改。關鍵字:insert、delete、update
- DQL(Date Query Language)數據查詢語言,查
- 用來查詢數據庫表中的記錄。關鍵字:select、where
- DCL(Data Control Language)數據控制語言
- 用來定義數據庫的訪問權限,安全級別,以及創建用戶,關鍵字:GRANT、REVOKE
3、DDL操作數據庫、表
-
操作數據庫:CRUD
- C(create)創建
SQL語句 描述 CREATE database (if not exists) 數據庫名 (character set 字符集名稱); 創建一個新的數據庫,括號是一個判斷是否存在、設定該數據庫的字符集 - R(Retrieve)查詢:
SQL語句 描述 show databases; 查看所有的數據庫名稱 show create database 數據庫名; 查看某個數據庫的創建語句 - U(Update)修改
SQL語句 描述 alter database 數據庫名 character set 字符集名稱; 修改數據庫使用的字符集 - D(Delete)刪除,使用前三思
SQL語句 描述 drop database (if exits )數據庫名; 判斷存在就刪除數據庫 - 查詢當前在使用的數據庫
SQL語句 描述 select database(); 查詢當前在使用的數據庫 - 使用數據庫
SQL語句 描述 use 數據庫名稱 使用某個數據庫 2、操作數據庫表
-
C(create)創建
語法:
create table 表名稱( 列名1 數據類型1, 列名2 數據類型2, 列名3 數據類型3, ... 列名n 數據類型n ); # 最后一列不要加逗號,分號等,分號是結束標志
其他創建表語句:
create table table1_copied like table1
,創建一個表,復制table1數據類型:
數據類型 描述 int 整數 double(n, m) 浮點數類型,指定一共有n位,小數點后保留m位 date 日期類型,只包含年月日,yyyy-MM-dd datetime 日期時間類型,包含年月日時分秒,yyyy-MM-dd HH:mm:ss timestamp 時間戳類型,包含年月日時分秒,yyyy-MM-dd HH:mm:ss,如果將來不給這個字段賦值為null,就自動使用系統時間 varchar(n) 字符串類型,要指定最大為n個字符 -
R(Retrieve)查詢,進到某個數據庫后
SQL語句 描述 show tables; 查看該數據庫所有的表 desc 表名稱; 查詢一個表的表結構,有什么字段,字段類型,是否主鍵等信息 -
U(Update)修改
- 修改表名:
alter table 表名稱 rename to 新表名稱;
- 修改表的字符集:
alter table 表名稱 character set 字符集名稱;
- 修改列名,數據類型:
alter table 表名稱 change 列名稱 新列名稱 新數據類型;
alter table 表名稱 modify 列名稱 新數據類型;
- 刪除列:
alter table 表名稱 drop 列名稱;
- 添加列:
alter table 表名稱 add 列名稱 數據類型;
- 修改表名:
-
D(Delete)刪除表
SQL語句 描述 drop table (if exists) 表名稱 刪除表,如果表存在
4、DML:操作表中的數據
-
添加數據
-
語法:insert into 表名稱(列名1, 列名2.....列名n) values(值1, 值2......值n)
注意:
- 列名和值要一一對應
- 如果不寫列名,就默認要給所有列添加數據
- 除了數字類型,其他類型都要用引號引起來
-
-
刪除數據
-
語法:delete from 表名 [where 條件]
注意:
- delete from 表名:不寫條件,就刪除表中所有的數據
- TRUNCATE TABLE 表名:先刪除表,再創建一張一樣的空表,推薦使用這個語句刪除所有記錄
-
-
修改數據
- 語法:update 表名 set 列名1 = 值1,列名2 = 值2,...[where 條件]
5、DQL:查詢表中的數據
-
DQL查詢語句
-
select * from 表名稱:查詢一個表的全部數據
-
排序查詢,語法:order by 句子
-
order by 排序字段1 排序方式1, 排序字段2 排序方式2,......;這里的意思是,首先按照排序方式一,如果方式一一樣,那么使用方式二排序;(也就是只有第一種方式一樣時,才會判斷第二種方式)
注意:排序方式:
升序:ASC;降序:DESC
select * from student order by age DESC;(按照年齡降序排序)
-
-
聚合函數,將一列數據作為一個整體,進行縱向的計算。
- count:計算個數
select count(列名稱) from 表名稱
- 注意:聚合函數排除了空的(NULL)的行,解決方法
- 替換NULL值的方法:
select count(ifNULL(name, " ")) from student;
- 盡量使用統計的列不要有空值的類,一般是主鍵
- 使用count(*)
- 替換NULL值的方法:
- max:計算最大值
select max(列名) from 表名
- min:計算最小值
select min(列名) from 表名
- sum:求和
select sum(列名) from 表名
- avg:計算平均值
select avg(列名) from 表名
- count:計算個數
-
分組查詢:統計具有相同特征的
語法:group by 字段 select sex, avg(age), count(id), min(age) from student group by sex;
注意:
- 分組之后只能查詢的字段,只有分組字段和聚合函數
where
在分組之前限定,如果不滿足條件,就不參與分組;having是在分組之后進行限定,如果不滿足條件就不會被查詢出來- where后不可以跟聚合函數,having后可以進行聚合函數的判斷
select sex, avg(age), count(id), min(age) from student where age > 20 group by sex having count(id) <= 2;
- 一般可以在聚合函數后寫一個別名,這樣就可以在判斷的時候使用別名
select sex, avg(age), count(id) peopleCount, min(age) from student where age > 20 group by sex having peopleCount <= 2;
分頁查詢:
-
語法:limit 開始的索引,每頁查詢的條數
-
公式:開始的索引 = (當前的頁碼 - 1) × 每頁顯示的條數
-
分頁操作是每個數據庫的操作方法是不一樣的,limit關鍵字只是在MySQL可以使用,其他關系型數據庫有自己的語法
-
6、基礎查詢
- 多字段查詢語法:
SELECT 字段1, 字段2, ... FROM table;
- 去重:
SELECT DISTINCT sex from student;
- 計算:自己寫一個字段參與參與查詢:
SELECT name, math, english, (math + english) FROM student;
- 注意:如果有NULL參與計算,結果都為NULL,可以使用函數IFNULL()解決:
IFNULL(English, 0)
。意思是如果English這一列的值有NULL,就用0替代參與計算
- 注意:如果有NULL參與計算,結果都為NULL,可以使用函數IFNULL()解決:
- 別名:可以給自己寫的列起一個別名,使用關鍵字AS(可以省略):
SELECT name, ifnull(math, 0) + english AS 總分 FROM student;
7、條件查詢
-
關鍵字
WHERE
后面跟着條件 -
運算符:
運算符 描述 <, >, =, !=, <=, >= 不等於可以使用!=或者<>, 沒有== BETWEEN ... AND 相當於使用 AND連接條件 IN(集合) 相當於使用OR連接條件 IS NULL NULL值不能使用=判斷,要使用IS或者 IS NOT LIKE SELECT * FROM student WHERE math > 60; SELECT * FROM student WHERE math > 90 AND math <= 92; SELECT * FROM student WHERE math BETWEEN 90 AND 92; SELECT * FROM student WHERE math = 90 OR math = 92; SELECT * FROM student WHERE math IN (90, 92, 100); SELECT * FROM student WHERE math is NULL;-- NULL要使用關鍵字 IS判斷 SELECT * FROM student WHERE math IS NOT NULL;-- NULL要使用關鍵字 IS判斷
-
模糊查詢
LIKE
占位符:%(任意多個字符),_(單個任意字符)
SELECT * FROM student WHERE name LIKE '____'; -- name 是四個字符的人 SELECT * FROM student WHERE name LIKE '孫%'; -- 第一個字是孫的人 SELECT * FROM student WHERE name LIKE '%八%'; -- 中間有八字的人 SELECT * FROM student WHERE name LIKE '_八%';-- 第二個子是八的人