數據庫概述:
數據庫(DataBase,DB):指長期保存在計算機的存儲設備上,按照一定規則組織起來,可以被各種用戶或應用共享的數據集合。(文件系統)
數據庫管理系統(DataBase Management System,DBMS):指一種操作和管理數據庫的大型軟件,用于建立、使用和維護數據庫,對數據庫進行統一管理和控制,以保證數據庫的安全性和完整性。用戶通過數據庫管理系統訪問數據庫中的數據。
數據庫軟件應該為數據庫管理系統,數據庫是通過數據庫管理系統創建和操作的。
數據庫:存儲、維護和管理數據的集合。
MySql和SQLite區別
SQLite是單機數據庫。功能簡約,小型化,追求最大磁盤效率
MySql是完善的服務器數據庫。功能全面,綜合化,追求最大并發效率
MySql、Sybase、Oracle等這些都是試用于服務器數據量大功能多需要安裝,例如網站訪問量比較大的。而SQLite是一款小型數據庫,簡單移植性好無需安裝只需要幾個文件。一般手機,終端等用的比較多~
如一句話,如果只是單機上用的,數據量不是很大,程序上對數據的處理也不太復雜的話,就用SQLite比較合適,它輕量級,單文件,可加密,方便小型程序的使用,其他情況建議使用MySql
使用MySql
登錄Mysql:
mysql -u 用戶名 -p
回車 , 在提示輸入密碼時再輸入密碼卸載
1.停止mysql服務 net stop mysql 啟動mysql服務 net start mysql
2.卸載mysql
3.找到mysql 安裝目錄下的 my.ini datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"修改密碼
運行cmd
安裝成功了打開cmd -->mysql -u 用戶名-p 你的密碼
修改mysql 用戶密碼:停止mysql服務 運行輸入
services.msc
停止mysql服務,或者 cmd -->net stop mysql
在cmd下 輸入 mysqld --skip-grant-tables 啟動服務器 光標不動 (不要關閉該窗口)
新打開cmd 輸入mysql -u 用戶名-p 不需要密碼
use mysql;
update user set password=password('abc') WHERE User='root';
關閉兩個cmd窗口 在任務管理器結束mysqld 進程
在服務管理頁面 重啟mysql 服務 ,密碼修改完成
也可以使用 SQLyog操作數據庫,SQLyog 是一個易于使用的、快速而簡潔的圖形化管理MYSQL數據庫的工具,它能夠在任何地點有效地管理你的數據庫
往MySQL里導入數據的時候遇到一個報錯:Error : Incorrect string value: '\xE5\x8C\x97\xE4\xBA\xAC' for column 'Name' at row 1
原因:默認字符集問題
以下為錯誤的創建語句:
CREATE TABLE `City` (
`CityID` int(11) NOT NULL,
`ProvinceID` int(11) DEFAULT NULL,
`Name` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (`CityID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
而以前都用的gbk_chinese_ci,
解決方法:把默認字符集修改過來,修改為字段的字符集為gbk即可ALTER TABLE City CONVERT TO CHARACTER SET gbk;
也可以在創建表的時候設置默認字符集:
CREATE TABLE `City ` (
`CityID` int(11) NOT NULL,
`ProvinceID` int(11) DEFAULT NULL,
`Name` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (`CityID`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=COMPACT
Sql語句的分類
- DDL(Data Definition Language):數據定義語言,用來定義數據庫對象:庫、表、列等; CREATE、 ALTER、DROP
- DML(Data Manipulation Language):數據操作語言,用來定義數據庫記錄(數據); INSERT、 UPDATE、 DELETE
- DCL(Data Control Language):數據控制語言,用來定義訪問權限和安全級別;
- DQL(Data Query Language):數據查詢語言,用來查詢記錄(數據):SELECT
- 注意:sql語句以;結尾
MySql命令alter add:增加表的字段
alter add命令用來增加表的字段。
alter add命令格式:alter table 表名 add字段 類型 其他;
例如,在表MyClass中添加了一個字段passtest,類型為int(4),默認值為0:
alter table MyClass add passtest int(4) default '0';
- 加索引
alter table 表名 add index 索引名 (字段名1[,字段名2 …]);
例子: alter table employee add index emp_name (name);
- 加主關鍵字的索引
alter table 表名 add primary key (字段名);
例子: alter table employee add primary key(id);
- 加唯一限制條件的索引
alter table 表名 add unique 索引名 (字段名);
例子: alter table employee add unique emp_name2(cardnumber);
- 刪除某個索引
alter table 表名 drop index 索引名;
例子: alter table employee drop index emp_name;
增加字段
ALTER TABLE table_name ADD field_name field_type;
修改原字段名稱及類型
ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;
例子,原字段birthday寫錯了,修改下字段名稱:
ALTER TABLE users CHANGE birthady birthday VARCHAR(50);
刪除字段
ALTER TABLE table_name DROP field_name
DDL:操作數據庫、表、列等 -----------------------------------------
使用的關鍵字:CREATE、 ALTER、 DROP
-- 操作數據庫 ---------------------------------------------------------------------
-- 創建
-- 創建一個名稱為mydb2的數據庫
CREATE DATABASE IF NOT EXISTS mydb2;
-- 創建一個名稱為mydb2的數據庫,并設置其字符集為gbk
CREATE DATABASE IF NOT EXISTS mydb2 CHARACTER SET gbk;
-- 查詢
-- 查看當前數據庫服務器中所有的數據庫
SHOW DATABASES;
-- 查看前面創建的mydb2數據庫定義的信息
SHOW CREATE DATABASE mydb2;
-- 修改
-- 查看服務器中的數據庫,并把mydb2的字符集修改為utf8
ALTER DATABASE mydb2 CHARACTER SET utf8;
-- 刪除
-- 刪除前面創建的mydb2數據庫
DROP DATABASE mydb2;
-- 其他
-- 查看當前使用的數據庫
SELECT DATABASE();
-- 切換使用名稱為mydb2的數據庫
USE mydb2;
-- 操作數據表 ---------------------------------------------------------------------
-- 創建表
-- 語法:
字段1 字段類型,
字段2 字段類型,
....
);```
-- 注意:創建表之前,要切換到對應的數據中
-- 查看當前數據庫中所有的表
```SHOW TABLES;```
-- 查看某個表中所有字段的信息
```DESC 表名稱;```
-- 在表名為emp的員工表的基礎上增加一個image列(即image字段)
```ALTER TABLE emp ADD image BLOB; ```
-- 修改job列, 使其長度為60
```ALTER TABLE emp MODIFY job VARCHAR(60);```
-- 刪除image列,一次只刪一列
```ALTER TABLE emp DROP image;```
-- 修改emp表名稱為user1
```RENAME TABLE emp TO user1;```
-- 修改表的字符集gbk
```ALTER TABLE user1 CHARACTER SET utf8;```
-- 修改列名ename為username
```ALTER TABLE user1 CHANGE ename username VARCHAR(100);```
-- 刪除表
```DROP TABLE user1;```
###### DML數據操作語言,用來定義數據庫記錄 -----------------------------------------
> DML 是對表中的數據進行增、刪、改的操作
使用的關鍵字:INSERT、UPDATE、DELETE
注意:在MySql中,字符串類型和日期類型的數據都要使用單引號括起來,空值為NULL
-- 插入操作 INSERT: ------------------
-- 語法:``` INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);```
-- 注意:
-- 1.列名與列值的類型、個數、順序要一一對應。
-- 2.可以把列名當做java中的形參,把列值當做實參。值不要超出列定義的長度。
-- 3.如果插入空值,請使用null
-- 4.插入的日期和字符一樣,都使用引號括起來。
-- 給emp中插入一行數據
```INSERT INTO emp(id,NAME,gender,birthday,salary,entry_date,RESUME)
VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');```
-- 批量插入
```INSERT INTO emp VALUES
(4,'zs','m','2015-09-01',10000,'2015-09-01',NULL),
(5,'li','m','2015-09-01',10000,'2015-09-01',NULL),
(6,'ww','m','2015-09-01',10000,'2015-09-01',NULL);```
-- 修改操作 UPDATE ----------
-- 語法:```UPDATE 表名 SET 列名 1=列值 2... WHERE 列名=值```
-- 將所有的員工薪水修改為5000元
```UPDATE emp SET sal=5000;```
-- 將姓名為'ALLEN'的員工修改為3000元
``` UPDATE emp SET sal=3000 WHERE username='ALLEN';```
-- 將姓名為'ALLEN'的員工薪水修改為10000, job修改為CTO
```UPDATE emp SET sal=10000,job='CTO' WHERE username='ALLEN';```
-- 將姓名為’ALLEN‘的員工咋原有薪水基礎上增加1000
```UPDATE emp SET sal=sal+1000 WHERE username='ALLEN';```
-- 刪除操作 DELETE ------------------------
-- 語法``` DELETE FROM 表名 [where 列名=值]```
-- 刪除emp表中 名稱 為 ’ALLEN‘的記錄
```DELETE FROM emp WHERE username='ALLEN';```
-- 刪除 emp 表中 所有記錄
```DELETE FROM emp;```
-- 使用truncate刪除emp表中記錄
```TRUNCATE TABLE emp;```
-- 注意:
-- 1.DELETE 刪除表中的數據,表結構還在;刪除后的數據可以找回
-- 2.TRUNCATE 刪除是把表直接DROP掉,然后再創建一個同樣的新表。刪除的數據不能找回。執行速度比DELETE快。
###### DQL(數據查詢語法)-----------------------------------------
>DQL就是數據查詢語言,數據庫執行DQL語句不會對數據進行改變,而是讓數據庫發送結果集給客戶端:
-- 語法:
-- select selection_list -- 要查詢的列名稱
-- From table_list -- 要查詢的表名稱
-- group by grounping_columns -- 對結果進行分組
-- having condition -- 分組后的行條件
-- order by sorting_columns -- 對結果進行排序
-- limit offset_satrt,row_count -- 結果限定
-- 向emp表中添加數據
INSERT INTO emp(id,NAME, gender, birthday, salary, entry_date, RESUME)
VALUES(1,'ossey','g','2011-01-09', 20000, '2012-11-10','verygood boy');
INSERT INTO emp(id, NAME, gender, birthday, salary, entry_date, RESUME)
VALUES(2,'sey','g','2010-02-08',20000,'2013-10-11','good boy');
INSERT INTO emp(id, NAME, gender, birthday, salary, entry_date, RESUME)
VALUES(3, '鄭爽','mm', '2013-01-01',3000, '2015-03-09','good girl');
INSERT INTO emp(id, NAME, gender, birthday, salary, entry_date, RESUME)
VALUES(4, '周杰倫','g','2015-02-03',3000, '2016-03-08', 'good boy');
-- 將所有員工薪水修改為5000元
```UPDATE emp SET salary=5000;```
-- 將姓名為‘sey’的員工薪水修改為3000
```UPDATE emp SET salary=30000 WHERE NAME='sey';```
-- 將姓名為‘ossey’的員工薪水修改為40000,性別修改為女
```UPDATE emp SET salary=40000,gender='g' WHERE NAME='ossey';```
-- 將員工‘sey’的薪水在原有基礎上增加10000
```UPDATE emp SET salary=salary+10000 WHERE NAME='sey';```
-- Delete語句
-- 刪除表中名稱為'sey'的語句
```DELETE FROM emp WHERE NAME='sey';``
-- 刪除表中所有記錄
```DELETE FROM emp;```
-- 使用truncate刪除表中記錄, 刪除過程:會將表直接drop刪除掉,再創建一個相同結構的空表
```TRUNCATE TABLE emp;```
```SELECT * FROM emp;```
-- 查詢語句
```SELECT * FROM USER;```
-- 查詢以s開頭的姓名
```SELECT * FROM emp WHERE NAME LIKE 's%';```
-- 查詢第二個字母以o開頭的姓名
```SELECT * FROM emp WHERE NAME LIKE '%o%';```
-- 查詢有姓名的個數
-- 創建學生表 ------------------------------
```CREATE TABLE stu(
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50)
);```
-- 查看表
```SELECT * FROM stu;```
-- 插入數據
INSERT INTO stu VALUES('S_1001', 'LiuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'ChenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'ZhangSan', 95, 'male');
INSERT INTO stuo VALUES('S_1004', 'LiSi', 65, 'male');
INSERT INTO stuo VALUES('S_1005', 'WangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxxx', NULL, NULL);
-- 創建雇員表 emp -----------------------------------------------------------
```CREATE TABLE emp(
empno INT, -- 員工編號
ename VARCHAR(50), -- 員工姓名
job VARCHAR(50), -- 員工工作
mgr INT, -- 領導編號
hiredate DATE, -- 入職日期
sal DECIMAL(7,2), -- 月薪
comm DECIMAL(7,2), -- 獎金
deptno INT -- 部門編號
);```
-- 插看emp表
```SELECT * FROM emp;```
-- 給emp表中插入以下數據
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
-- 創建emp的部門表 -------------
```CREATE TABLE dept(
deptno INT, -- 部門編號
dname VARCHAR(14), -- 部門名稱
loc VARCHAR(13) -- 部門位置
);```
-- 查看dept表
```SELECT * FROM dept;```
-- 給部門表插入以下數據
INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept VALUES(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept VALUES(30, 'SALES', 'CHICAGO');
INSERT INTO dept VALUES(40, 'OPERATIONS', 'BOSTON');
-- 1.基礎查詢 -------------
-- 1.1 查詢所有列
```SELECT * FROM emp;```
-- 1.2 查詢指定列,比如查詢emp表中ename和deptno字段的數據
```SELECT ename, deptno FROM emp;```
-- 2.條件查詢 -------------
-- 2.1 查詢部門為30,并且獎金少于1000的員工
```SELECT *FROM emp WHERE deptno=30 AND comm<1000;```
-- 2.2 查詢 ename為ALLEN 或者 ename為WARD的員工信息
```SELECT * FROM emp WHERE ename='ALLEN' OR ENAME='WARD';```
-- 2.3 查詢deptno部門編號為20,30,50的記錄
```SELECT * FROM emp WHERE deptno IN(20,30,50);```
-- 2.4 查詢部門編號不是20,30, 50的記錄
```SELECT * FROM emp WHERE deptno NOT IN(20, 30, 50);```
-- 2.5 查詢獎金為null的記錄
```SELECT * FROM emp WHERE comm IS NULL;```
-- 2.6 查詢獎金在1000到1500之間的記錄
-- 第一種寫法
```SELECT * FROM emp WHERE comm>=1000 AND comm<=1500;```
-- 第二種寫法
```SELECT * FROM emp WHERE comm BETWEEN 1000 AND 1500;```
-- 2.7 查詢獎金為非空的員工記錄
```SELECT * FROM emp WHERE comm IS NOT NULL;```
-- 3 模糊查詢 -----------------------------------
-- 當想查詢姓名中包含a字母的員工時,就需要使用到模糊查詢了,模糊查詢需要使用關鍵字 LIKE
-- 3.1 查詢ename由5個字母構成的員工記錄
```SELECT * FROM emp WHERE ename LIKE '_____'; ```-- 5條下劃線就是5個記錄
-- 模糊查詢必須使用LIKE關鍵字。其中'_'匹配任意一個字母,5個'_'表示5個任意字母
-- 3.2 查詢姓名由5個字母構成,并且第5個字母為’s‘的員工記錄
```SELECT * FROM emp WHERE ename LIKE '____s';```
-- 3.3 查詢員工姓名以'J'開頭的員工記錄
```SELECT * FROM emp WHERE ename LIKE 'J%';```
-- 其中'%'匹配0~n個任意字母
-- 3.4 查詢姓名中第二個字母為's'的員工記錄
```SELECT * FROM emp WHERE ename LIKE '%s%';```
-- 4 字段控制查詢 -----------------------------------
-- 4.1 去除重復記錄
-- 去除重復記錄(兩行或兩行以上記錄的數據都相同的), 例如emp表中sal字段就存在相同的記錄。當之查詢emp表中sal字段時,那么回出現重復記錄,需要使用關鍵字DISTINCT
``` SELECT DISTINCT sal FROM emp;```
-- 4.1 查看關于的月薪和傭金之和
-- 因為sal(基本工資)和comm(獎金)兩列的類型都是數值類型,所以可以做加法運算。但是如果sal或comm字段中有一個字段不是數值類型,那么就會出錯;
-- 當然如果sal或者comm中其中一個字段的值為NULL時,相加時也為NULL,所以需要在相加時做判斷:如果為NULL,就為0,否則為原始值,需要使用關鍵字IFNULL();
``` SELECT *, sal+IFNULL(comm,0) FROM emp;```
-- 4.3 給列名添加別名
-- 在上面查詢結果中出現列名為sal+ifnull(comm,0),這樣很不美觀,現在我們給這一列添加別名為total:
-- 給列起別名時,是可以省略AS關鍵字的
```SELECT *,sal+IFNULL(comm,0) AS total FROM emp;```
-- 5 排序 -----------------------------------
-- 5.1 查詢所有員工記錄,按照部門升序排序
```SELECT * FROM emp ORDER BY deptno ASC;```
-- 或者使用以下語句 省略ASC,ORDER BY 默認就是升序的
``` SELECT * FROM emp ORDER BY deptno;```
-- 5.2 查詢所有員工記錄,按照部門降序排序
``` SELECT * FROM emp ORDER BY deptno DESC;```
-- 5.2 查詢所有員工,按照月薪降序排序,如果月薪相同時,按照部門升序排序
``` SELECT * FROM emp ORDER BY sal DESC , deptno ASC;```
-- 6 聚合函數 -----------------------------------
-- 聚合函數是用來做縱向運算的函數:
-- COUNT(): 統計指定列不為NULL的記錄行數;
-- MAX(): 計算指定列的最大值,如果指定列是字符串類型,那么使用字符串排序運算;
-- MIN(): 計算指定列的最小值,如果制定列是字符串類型,那么使用字符串排序運算;
-- SUM(): 計算指定列的數值和,如果指定列類型不是數值類型,那么計算結果為0;
-- AVG(): 計算指定列的平均值,如果指定列類型不是數值類型,那么計算結果為0;
-- 6.1 COUNT
-- 當需要縱向統計時使用COUNT();
-- 查詢emp表中記錄數:
``` SELECT COUNT(*) AS 數量 FROM emp;```
-- 查詢emp表中有傭金的人數
``` SELECT COUNT(comm) 數量 FROM emp; ```
-- 注意:由于COUNT() 函數給出的是comm字段這一列,所以只統計commlie非NULL的行數
-- 查詢emp表中月薪大于2500的人數
``` SELECT COUNT(*) AS 數量 FROM emp WHERE sal>2500;```
-- 統計月薪與傭金之和大于2500的員工數量
``` SELECT COUNT(*) AS 數量 FROM emp WHERE sal+IFNULL(comm,0)>2500;```
-- 查詢有傭金的人數,以及有領導的人數
``` SELECT COUNT(comm) AS 有傭金的人數, COUNT(mgr) AS 有領導的人數 FROM emp;```
-- 6.2 SUM()和AVG()
-- 當需要縱向求和時使用SUM()函數
-- 查詢所有員工的月薪和
```SELECT SUM(sal) AS 月薪和 FROM emp;```
-- 查詢所有員工的月薪和,以及所有員工的傭金和
``` SELECT SUM(sal) AS 月薪和, SUM(comm) AS 傭金和 FROM emp;```
-- 統計所有員工的平均工資
``` SELECT SUM(sal), COUNT(sal) FROM emp;```
-- 或者使用下面語句
``` SELECT AVG(sal) FROM emp;```
-- 6.3 MAX()和MIN()
-- 查詢最高工資和最低工資
``` SELECT MAX(sal), MIN(sal) FROM emp;```
-- 7 分組查詢 -----------------------------------
-- 7.1 查詢各部門員工的數量
```SELECT COUNT(*) FROM emp WHERE deptno IS NOT NULL GROUP BY deptno;```
-- 此語句會將deptno進行分組,將此字段每種不同的值作為一組數據進行統計個數
-- 查詢各部門的員工數量,并顯示部門編號
``` SELECT deptno, COUNT(*) FROM emp WHERE deptno IS NOT NULL GROUP BY deptno;```
-- 查詢每個部門的部門編號以及部門工資大于1500的人數
``` SELECT deptno, COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;```
-- 7.2 HAVING子句
-- 查詢工資總和大于9000的部門編號以及工資總和:
```SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal)>9000;```
-- 注意:HAVING和WHERE的區別:
-- 1.having是在分組后對數據進行過濾。
-- where實在分組錢對數據進行過濾。
-- 2.having后面可以使用聚合函數(統計函數)。
-- where后面不可以使用聚合函數。
-- where是在對分組錢記錄的條件,如果是某行記錄沒有滿足where子句的條件,那么這行記錄不會參加分組;而having是對分組后的數據的約束
-- 8 LIMIT -----------------------------------
-- LIMIT用來限定查詢結果的起始行,以及總行數
-- 8.1 查詢5行記錄,起始行從0開始
```SELECT * FROM emp LIMIT 0,5;```
-- 注意:起始行的索引是從0開始的,即為實際中第一行的數據
-- 8.2 查詢10行記錄,起始行從3開始
``` SELECT * FROM emp LIMIT 3,10;```
-- 8.3 分頁查詢
-- 如果一頁記錄為10條,希望查看第3頁記錄應該怎么查呢?
-- 1.第一頁記錄起始行為0,一共查詢10行;
-- 2.第二頁記錄起始行為10,一共查詢10行;
-- 3.第三頁記錄起始行為20, 一共查詢10行;
-- 8.3 分頁查詢
-- 查詢語句書寫順序
-- select - from - where - group by - having - order by - limit
-- 查詢語句執行順序
-- from - where - group by - having - select - order by - limit