一、SQL語句介紹
1.什麼是SQL?
全稱 structured query language,簡稱SQL,中文叫結構化查詢語言。
關係型數據庫語言的國際標準:SQL92、SQL99
不止是MySQL,其他數據庫在SQL92或者SQL99這些國際SQL標準基礎上,還擴展了自己的一些SQL語句,比如MySQL中的limit關鍵字。
2.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
二、SQL語句的使用
1.數據庫操作:datebase
創建數據庫:
create database 數據庫名;
create database 數據庫名 character set 字符集;
查看數據庫:
查看數據庫服務器中的所有的數據庫:show databases;
查看某個數據庫的定義的信息:show create database 數據庫名;
刪除數據庫:
drop database 數據庫名稱;
其他命令:
切換數據庫:use 數據庫名;
查看正在使用的數據庫:select database();
2.表操作: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 字符集; --修改表的字符集
3.插入記錄:insert
insert into 表 (列名1,列名2,列名3..) values (值1,值2,值3..); -- 向表中插入某些列
insert into 表 values (值1,值2,值3..); --向表中插入所有列
insert into 表1 (列名1,列名2,列名3..) values select (列名1,列名2,列名3..) from 表2 --將表2中查出的數據插入表1
insert into 表1 values select * from 表2 --將表2中查出的數據插入表1
注意事項:
①列名數與values後面的值的個數相等
②列的順序與插入的值需要順序一致
③列名的類型與插入的值的類型需要一致.
④插入值的時候不能超過最大長度.
⑤值如果是字符串或者日期需要加引號’’ (一般是單引號)
4.更新記錄:update
update 表名 set 字段名=值,字段名=值;
update 表名 set 字段名=值,字段名=值 where 條件;
注意事項:
①列名的類型與修改的值要一致.
②修改值得時候不能超過最大長度.
③值如果是字符串或者日期需要加單引號.
5.刪除記錄:delete
delete from 表名;
delete from 表名 where 條件;
注:delete與truncate的區別:
刪除表中所有記錄使用delete from 表名; 還是用truncate table 表名;
刪除方式:delete 一條一條刪除,不清空auto_increment記錄數。
truncate 直接將表刪除,重新建表,auto_increment將置爲零,從新開始。
所以truncate的效率更高i,特別是對於數據量特別大的表
三、SQL查詢
1.簡單查詢
查詢關鍵字:select from
如果需去除重複值 在列名前使用distinct 即可 :select distinct username from user
2.條件查詢
關鍵字:where
select * from user where age > 25;
select * from user where name = '狗蛋';
注:where後條件使用方法
比較運算符 | > < <= >= = <> | 大於、小於、大於(小於)等於、不等於 |
BETWEEN ...AND... | 顯示在某一區間的值(含頭含尾) | |
IN(.....) | 顯示在in列表中的值,例:in(1,2,3,4,5,100) | |
LIKE '李_' | 模糊查詢,Like語句中,% 代表零個或多個任意字符,_ 代表一個字符,例:name like ‘_a%’; | |
IS NULL | 判斷是否爲空 | |
邏輯運算符 | and | 多個條件同時成立 |
or | 多個條件任一成立 | |
not | 不成立 |
3.排序
關鍵字:order by asc(升序) desc(降序)
select * from user order by age desc;
4.聚合函數
特點:只對單列進行操作
常用的聚合函數:
sum():求某一列的和
avg():求某一列的平均值
max():求某一列的最大值
min():求某一列的最小值
count():求某一列的元素個數
5.分組
關鍵字:group by having
注意:
①select語句中的列(非聚合函數列),必須出現在group by子句中
②group by子句中的列,不一定要出現在select語句中
③聚合函數只能出現select語句中或者having語句中,一定不能出現在where語句中。
6.多表關聯查詢
①內連接:inner join
內連接也叫等值連接,內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。
select * from A inner join B on A.id = B.id
②外連接
- 左外連接:left join
select * from A left join B on A.id = B.id
- 右外連接:right join
select * from A right join B on A.id = B.id
- 全外連接MySQL不支持
注意:
通過業務需求,分析主從表
如果使用LEFT JOIN,則主表在它左邊
如果使用RIGHT JOIN,則主表在它右邊
查詢結果以主表爲主,從表記錄匹配不到,則補null
7.分頁查詢
關鍵字:limit
select * from table limit (start-1)*rows,rows; 其中start是頁碼,rows是每頁顯示的條數。
8.語法順序和執行順序
- MySQL查詢語法順序:
①SELECT
②FROM
③LEFT JOIN
④ON
⑤WHERE
⑥GROUP BY
⑦HAVING
⑧ORDER BY
⑨LIMIT
- MySQL的執行順序:
①FROM(將最近的兩張表,進行笛卡爾積)---VT1
②ON(將VT1按照它的條件進行過濾)---VT2
③LEFT JOIN(保留左表的記錄)---VT3
④WHERE(過濾VT3中的記錄)--VT4…VTn
⑤GROUP BY(對VT4的記錄進行分組)---VT5
⑥HAVING(對VT5中的記錄進行過濾)---VT6
⑦SELECT(對VT6中的記錄,選取指定的列)--VT7
⑧ORDER BY(對VT7的記錄進行排序)--遊標
⑨LIMIT(對排序之後的值進行分頁)
- where條件執行順序:
1.MySQL:從左往右執行where條件
2.Oracle:從右往左執行where條件
結論:在寫where條件時,優先級搞得部分要去編寫過濾力度最大的條件語句