介紹常用的DDL語句、DML語句
基本語法
- 分號結尾
- 使用空格和縮進
- 不區分大小寫
- --或#注釋單行內容 ?/*注釋多行內容*/
DDL數據定義語句:定義數據庫、表、字段
一、操作庫
-- 創建庫create database db1;-- 創建庫是否存在,不存在則創建create database if not exists db1;-- 查看所有數據庫show databases;-- 查看某個數據庫的定義信息show create database db1;-- 修改數據庫字符信息alter database db1 character set utf8;-- 刪除數據庫drop database db1;
二、操作表
--創建表create table student(id int,name varchar(32),age int ,score double(4,1),birthday date,insert_time timestamp);??-- 查看表結構desc 表名;-- 查看創建表的SQL語句show create table 表名;-- 修改表名alter table 表名 rename to 新的表名;-- 添加一列alter table 表名 add 列名 數據類型;-- 刪除列alter table 表名 drop 列名;-- 刪除表drop table 表名;drop table ?if exists 表名 ;
DML(Data Manipulation Language)數據操作語句:增刪改
一、增加 insert into
-- 寫全所有列名insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);-- 不寫列名(所有列全部添加)insert into 表名 values(值1,值2,...值n);-- 插入部分數據insert into 表名(列名1,列名2) values(值1,值2);
二、刪除 delete
-- 刪除表中數據delete from 表名 where 列名 ?= 值;-- 刪除表中所有數據delete from 表名;-- 刪除表中所有數據(高效 先刪除表,然后再創建一張一樣的表。)truncate table 表名;
三、修改 update
-- 不帶條件的修改(會修改所有行)update 表名 set 列名 = 值;-- 帶條件的修改update 表名 set 列名 = 值 where 列名=值;
DQL(Data Query Language)數據查詢語句:查詢
關于查詢語句有很多,這里基礎的不再介紹。主要介紹排序查詢、聚合函數、模糊查詢、分組查詢、分頁查詢、內連接、外連接、子查詢
一、基礎關鍵字
?BETWEEN...AND (在什么之間)和 ?IN( 集合)
-- 查詢年齡大于等于20 小于等于30SELECT * FROM student WHERE age >= 20 && ?age <=30;SELECT * FROM student WHERE age >= 20 AND ?age <=30;SELECT * FROM student WHERE age BETWEEN 20 AND 30;-- 查詢年齡22歲,18歲,25歲的信息SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25SELECT * FROM student WHERE age IN (22,18,25);is not null(不為null值) 與 like(模糊查詢)、distinct(去除重復值)-- 查詢英語成績不為nullSELECT * FROM student WHERE english ?IS NOT NULL;
?_:單個任意字符
?%:多個任意字符
-- 查詢姓馬的有哪些? likeSELECT * FROM student WHERE NAME LIKE '馬%';-- 查詢姓名第二個字是化的人SELECT * FROM student WHERE NAME LIKE "_化%";-- 查詢姓名是3個字的人SELECT * FROM student WHERE NAME LIKE '___';-- 查詢姓名中包含德的人SELECT * FROM student WHERE NAME LIKE '%德%';-- 關鍵詞 DISTINCT 用于返回唯一不同的值。-- 語法:SELECT DISTINCT 列名稱 FROM 表名稱SELECT DISTINCT NAME FROM ?student ;
二、排序查詢 order by
語法:order by 子句
??????????order by 排序字段1 排序方式1 , ?排序字段2 排序方式2...
注意:
????????????如果有多個排序條件,則當前邊的條件值一樣時,才會判斷第二條件。、
-- 例子SELECT * FROM person ORDER BY math; --默認升序SELECT * FROM person ORDER BY math desc; --降序
三、 聚合函數:將一列數據作為一個整體,進行縱向的計算。
1.count:計算個數
2.max:計算最大值
3.min:計算最小
4.sum:計算和
5.avg:計算平均數
四、分組查詢 grout by
??????語法:group by 分組字段;
??????注意:分組之后查詢的字段:分組字段、聚合函數
-- 按照性別分組。分別查詢男、女同學的平均分SELECT sex , AVG(math) FROM student GROUP BY sex;-- 按照性別分組。分別查詢男、女同學的平均分,人數SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;-- ?按照性別分組。分別查詢男、女同學的平均分,人數 要求:分數低于70分的人,不參與分組SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;-- ?按照性別分組。分別查詢男、女同學的平均分,人數 要求:分數低于70分的人,不參與分組,分組之后。人數要大于2個人SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;SELECT sex , AVG(math),COUNT(id) 人數 FROM student WHERE math > 70 GROUP BY sex HAVING 人數 > 2;
五、 分頁查詢
????1. 語法:limit 開始的索引,每頁查詢的條數;
????2. 公式:開始的索引 = (當前的頁碼 - 1) * 每頁顯示的條數
????3. limit 是一個MySQL"方言"
-- 每頁顯示3條記錄SELECT * FROM student LIMIT 0,3; -- 第1頁SELECT * FROM student LIMIT 3,3; -- 第2頁SELECT * FROM student LIMIT 6,3; -- 第3頁
六、內連接查詢:
???1. 從哪些表中查詢數據
???2.條件是什么
???3. 查詢哪些字段
1.隱式內連接:使用where條件消除無用數據
-- 查詢員工表的名稱,性別。部門表的名稱SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`;SELECTt1.name, -- 員工表的姓名t1.gender,-- 員工表的性別t2.name -- 部門表的名稱FROMemp t1,dept t2WHEREt1.`dept_id` = t2.`id`;
?2.顯式內連接
-- 語法:select 字段列表 from 表名1 [inner] join 表名2 on 條件-- 例如:SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`; ??SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;
?七、外連接查詢
1.左外連接 -- 查詢的是左表所有數據以及其交集部分。
-- 語法:select 字段列表 from 表1 left [outer] join 表2 on 條件;-- 例子:-- 查詢所有員工信息,如果員工有部門,則查詢部門名稱,沒有部門,則不顯示部門名稱SELECT ?t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;
?2.右外連接 ?-- 查詢的是右表所有數據以及其交集部分。
-- 語法:select 字段列表 from 表1 right [outer] join 表2 on 條件;-- 例子:SELECT ?* FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;
?八、子查詢:查詢中嵌套查詢
-- 查詢工資最高的員工信息-- 1 查詢最高的工資是多少 9000SELECT MAX(salary) FROM emp;-- 2 查詢員工信息,并且工資等于9000的SELECT * FROM emp WHERE emp.`salary` = 9000;-- 一條sql就完成這個操作。這就是子查詢SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);
???1.子查詢的結果是單行單列的
?子查詢可以作為條件,使用運算符去判斷。 運算符: > >= < <= =
-- 查詢員工工資小于平均工資的人SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
???2. 子查詢的結果是多行單列的:
???子查詢可以作為條件,使用運算符in來判斷
-- 查詢'財務部'和'市場部'所有的員工信息SELECT id FROM dept WHERE NAME = '財務部' OR NAME = '市場部';SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2;-- 子查詢SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '財務部' OR NAME = '市場部');
???3. 子查詢的結果是多行多列的:
???子查詢可以作為一張虛擬表參與查詢
-- 查詢員工入職日期是2011-11-11日之后的員工信息和部門信息-- 子查詢SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2 WHERE t1.id = t2.dept_id;-- 普通內連接SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` > ?'2011-11-11'
DCL(Data Control Language)數據控制語句:創建用戶,控制訪問權限
管理用戶
添加用戶
語法:CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼';
刪除用戶
語法:DROP USER '用戶名'@'主機名';
權限管理
查詢權限
-- 查詢權限SHOW GRANTS FOR '用戶名'@'主機名';SHOW GRANTS FOR 'lisi'@'%';
授予權限
-- 授予權限grant 權限列表 on 數據庫名.表名 to '用戶名'@'主機名';-- 給張三用戶授予所有權限,在任意數據庫任意表上GRANT ALL ON *.* TO 'zhangsan'@'localhost';
撤銷權限
-- 撤銷權限:revoke 權限列表 on 數據庫名.表名 from '用戶名'@'主機名';REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';