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