注意:這里以mariadb為例
啟動mysql服務
systemctl start mariadb
登錄mysql
mysql -u root -p

SQL語言分類
- 數據定義語言:簡稱【DDL】(Data Definition Language),用來定義數據庫對象:數據庫,表,列等。 關鍵字:create,alter,drop等 - 數據操作語言:簡稱【DML】(Data Manipulation Language),用來對數據庫中表的記錄進行更新。關鍵 字:insert,delete,update等 - 數據控制語言:簡稱【DCL】(Data Control Language),用來定義數據庫的訪問權限和安全級別,及創建 用戶;關鍵字:grant等 - 數據查詢語言:簡稱【DQL】(Data Query Language),用來查詢數據庫中表的記錄。關鍵字:select, from,where等
如果要了解標准的內容,比較推薦的方法是【泛讀SQL92】(因為它涉及了SQL最基礎和最核心的一些內容),然
后增量式的閱讀其他標准。
DDL語句
數據庫操作:database
創建數據庫
create database 數據庫名; create database 數據庫名 character set 字符集;
查看數據庫
查看數據庫服務器中的所有的數據庫:
show databases;
查看某個數據庫的定義的信息:
show create database 數據庫名;
刪除數據庫(慎用)
drop database 數據庫名稱;
其他數據庫操作命令
切換數據庫:
use 數據庫名;
查看正在使用的數據庫:
select database();

表操作:table
創建表
create table 表名( 字段名 類型(長度) 約束, 字段名 類型(長度) 約束 );
比如創建一個用戶表

單表約束:
主鍵約束:primary key - 唯一約束:unique - 非空約束:not null
主鍵約束 = 唯一約束 + 非空約束
查看表
查看數據庫中的所有表:
show tables;
查看表結構:
desc 表名;
刪除表
drop table 表名;
修改表
alter table 表名 add 列名 類型(長度) 約束; --修改表添加列. alter table 表名 modify 列名 類型(長度) 約束; --修改表修改列的類型長度及約束. alter table 表名 change 舊列名 新列名 類型(長度) 約束; --修改表修改列名. alter table 表名 drop 列名; --修改表刪除列. rename table 表名 to 新表名; --修改表名 alter table 表名 character set 字符集; --修改表的字符集
字段類型
常用的類型有:

DML語句
插入記錄:insert
insert into 表 (列名1,列名2,列名3..) values (值1,值2,值3..); -- 向表中插入某些列 insert into 表 values (值1,值2,值3..); --向表中插入所有列 insert into 表 (列名1,列名2,列名3..) values select (列名1,列名2,列名3..) from 表 insert into 表 values select * from 表
注意: 1. 列名數與values后面的值的個數相等 2. 列的順序與插入的值得順序一致 3. 列名的類型與插入的值要一致. 4. 插入值得時候不能超過最大長度. 5. 值如果是字符串或者日期需要加引號’’ ,一般是單引號

注意插入的時候如果沒有申明列,那么需要插入每一列,不然會報錯:column count doesn`t match value count at row xx.

更新記錄:update
update 表名 set 字段名=值,字段名=值; update 表名 set 字段名=值,字段名=值 where 條件;
注意:
1. 列名的類型與修改的值要一致.
2. 修改值得時候不能超過最大長度.
3. 值如果是字符串或者日期需要加’’
刪除記錄:delete
delete from 表名 [where 條件];
刪除表中所有記錄使用【delete from 表名】,還是用【truncate table 表名】?
刪除方式: - delete :一條一條刪除,不清空auto_increment記錄數。 - truncate :直接將表刪除,重新建表,auto_increment將置為零,從新開始。
DQL語句
DQL語法順序
完整DQL語法順序
SELECT DISTINCT < select_list > FROM < left_table > < join_type > JOIN < right_table > ON < join_condition > WHERE < where_condition > GROUP BY < group_by_list > HAVING < having_condition > ORDER BY < order_by_condition > LIMIT < limit_number >
簡單查詢
查詢所有的商品
select * from product;
* 表示表的所有字段,也可以指定具體字段,甚至可以給字段取別名
select pname ,price from product;
別名查詢,使用的as關鍵字,as可以省略的
select * from product as p;
去掉重復值
select distinct price from product;
運算查詢
select pname,price+10 from product;
數據庫的運算查詢是很消耗時間的,不建議在數據庫這樣操作,應該將數據在后台程序進行操作,數據庫只處理數據,不應該處理邏輯。
條件查詢
查詢商品價格>60元的所有的商品信息
select * from product where price > 60;
符號說明
> ,<,=,>=,<=,<> like 使用占位符 _ 和 % _代表一個字符 %代表任意個字符. select * from product where pname like '%新%'; in在某個范圍中獲得值(exists). select * from product where pid in (2,5,8);

排序
查詢所有的商品,按價格進行排序.(asc-升序,desc-降序)
默認就是asc
select * from product order by price;
聚合函數(組函數)
特點:只對單列進行操作
常用的聚合函數
sum():求某一列的和 avg():求某一列的平均值 max():求某一列的最大值 min():求某一列的最小值 count():求某一列的元素個數
獲得所有商品的價格的總和:
select sum(price) from product;
獲得所有商品的個數
select count(*) from product;
分組
根據cid字段分組,分組后統計商品的個數
select cid,count(*) from product group by cid;
根據cid分組,分組統計每組商品的平均價格,並且平均價格> 60;
select cid,avg(price) from product group by cid having avg(price)>60;
注意事項
select語句中的列(非聚合函數列),必須出現在group by子句中 group by子句中的列,不一定要出現在select語句中 聚合函數只能出現select語句中或者having語句中,一定不能出現在where語句中。
分頁查詢
分頁分為邏輯分頁和物理分頁
邏輯分頁:將數據庫中的數據查詢到內存之后再進行分頁。 物理分頁:通過LIMIT關鍵字,直接在數據庫中進行分頁,最終返回的數據,只是分頁后的數據。
lIMIT 關鍵字不是 SQL92 標准提出的關鍵字,它是 MySQL 獨有的語法。
通過 limit 關鍵字, MySQL 實現了物理分頁
SELECT * FROM table LIMIT [offset,] rows
子查詢
子查詢允許把一個查詢嵌套在另一個查詢當中。 子查詢,又叫內部查詢,相對於內部查詢,包含內部查詢的就稱為外部查詢。 子查詢可以包含普通select可以包括的任何子句,比如:distinct、 group by、order by、limit、join和 union等; 但是對應的外部查詢必須是以下語句之一:select、insert、update、delete
其他查詢語句
union 集合的並集(不包含重復記錄) unionall 集合的並集(包含重復記錄
SQL解析順序
SELECT DISTINCT < select_list > FROM < left_table > < join_type > JOIN < right_table > ON < join_condition > WHERE < where_condition > GROUP BY < group_by_list > HAVING < having_condition > ORDER BY < order_by_condition > LIMIT < limit_number >
然而它的執行順序是這樣的
1 FROM <left_table> 2 ON <join_condition> 3 <join_type> JOIN <right_table> 第二步和第三步會循環執行 4 WHERE <where_condition> 第四步會循環執行,多個條件的執行順序是從左往右的。 5 GROUP BY <group_by_list> 6 HAVING <having_condition> 7 SELECT 分組之后才會執行SELECT 8 DISTINCT <select_list> 9 ORDER BY <order_by_condition> 10 LIMIT <limit_number> 前9步都是SQL92標准語法。limit是MySQL的獨有語法。
關於sql解析還有很多,另開一個篇章專門介紹吧
