1、資料庫語言的分類 2、DDL:資料庫定義語言 data Definition language 3、DQL:數據查詢語言 data Query language 4、DQL:數據查詢語言 data Query language 5、常用函數 6、DCL:數據控制語言 (管理用戶許可權)data C... ...
1、資料庫語言的分類
DDL:資料庫定義語言 data Definition language
用於創建、修改、和刪除資料庫內的數據結構,如:
1:創建和刪除資料庫(CREATE DATABASE || DROP DATABASE);
2:創建、修改、重命名、刪除表(CREATE TABLE || ALTER TABLE|| RENAME TABLE||DROP TABLE,TRUNCATE TABLE);
3:創建和刪除索引(CREATEINDEX || DROP INDEX)
DML:數據操控語言 data Manipulation language
修改資料庫中的數據,包括插入(INSERT)、更新(UPDATE)和刪除(DELETE)
DCL:數據控制語言 (管理用戶許可權)data Control language
用於對資料庫的訪問,主要包括創建用戶、給用戶授權、對用戶撤銷授權、查詢用戶授權和刪除用戶等
,如:1.創建用戶(create user)2:給用戶授予訪問許可權(GRANT);3:取消用戶訪問許可權(REMOKE),4刪除用戶(drop user)。
DQL:數據查詢語言 data Query language
從資料庫中的一個或多個表中查詢數據(SELECT)
下麵一一來介紹這四種類型的語言
2、DDL:資料庫定義語言 data Definition language
2.1、創建資料庫,並且以utf8的字元集創建
-- 如果不存在,則創建資料庫,並且以utf的字元集創建
CREATE DATABASE IF NOT EXISTS westos DEFAULT CHARACTER SET = 'utf8'
2.2、如果存在,刪除資料庫
-- 如果存在,則刪除資料庫
DROP DATABASE IF EXISTS westos
2.3、使用資料庫
-- 使用資料庫
USE westos
2.4、查看所有的資料庫
-- 查看所有的資料庫
SHOW DATABASES
2.5、查看所有的數據表
-- 查看所有的數據表
SHOW TABLES
2.6、創建表
-- 創建學生表,如果不存在
CREATE TABLE IF NOT EXISTS student (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '學生表id',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密碼',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性別',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '郵箱',
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET = 'utf8'
2.7、查看創建資料庫和數據表的語句
-- 查看創建資料庫的語句
SHOW CREATE DATABASE westos
-- 查看創建數據表的語句
SHOW CREATE TABLE student
2.8、查看表的結構
-- 查看表的具體結構
DESC student
3、DQL:數據查詢語言 data Query language
3.1、修改表名
-- 修改表名
ALTER TABLE student RENAME AS teacher
3.2、增加表的欄位
-- 增加表的欄位
ALTER TABLE teacher ADD age INT
3.3、修改表的欄位
-- 修改表的欄位(重命名,修改約束)
ALTER TABLE teacher MODIFY age VARCHAR(11) -- 修改約束,不能改欄位名
ALTER TABLE teacher CHANGE age is_del INT -- 欄位重命名
3.4、刪除表的欄位
-- 刪除表的欄位
ALTER TABLE teacher DROP is_del
3.5、刪除表
-- 刪除表
DROP TABLE IF EXISTS student
3.6、插入語句
-- 插入語句(添加)
INSERT INTO teacher (`name`) VALUES ('xgp')
3.7、修改語句
-- 修改語句
UPDATE teacher SET `name`='xgp',sex='女' WHERE id=1
3.8、設置資料庫的時間
-- 設置資料庫的時間
UPDATE `teacher` SET `birthday` = CURRENT_TIME WHERE id=1
3.9、刪除指定數據
-- 刪除指定數據
DELETE FROM teacher WHERE id=1
3.10、清空一個數據表
-- 完全清空一個資料庫表,表的結構和索引約束不變,自增會歸零
TRUNCATE TABLE teacher
4、DQL:數據查詢語言 data Query language
4.1、使用別名查詢
-- 查詢(使用別名)
SELECT `name` 姓名,pwd 密碼 FROM teacher 老師表
4.2、拼接字元串
-- 函數 拼接字元串 Concat(a,b)
SELECT CONCAT('姓名:',`name`) 新名字 FROM teacher
4.3、去重
-- 去重
SELECT DISTINCT `name` FROM teacher
4.4、查看系統版本
-- 查看系統版本
SELECT VERSION()
4.5、計算結果
-- 計算結果
SELECT 100*3-23 計算結果
SELECT pwd+'1' 密碼加1 FROM teacher
4.6、模糊查詢
-- 模糊查詢
-- like結合 %(代表0到任意個字元) _(代表一個字元)
SELECT `name`,pwd FROM teacher
WHERE `name` LIKE '_g_'
-- in
SELECT id,`name`,pwd FROM teacher
WHERE id IN (4,7,10)
4.7、排序查詢
-- 排序:升序 ASC 降序 DESC
-- order by 通過哪個欄位排序,怎麼排
SELECT * FROM teacher ORDER BY id DESC
SELECT * FROM teacher ORDER BY id ASC
4.8、分頁查詢
-- 分頁:
SELECT * FROM teacher ORDER BY id DESC LIMIT 2,10
5、常用函數
5.1、數學函數
-- 常用函數
SELECT ABS(-78) -- 絕對值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4) -- 向下取整
SELECT SIGN(-9) -- 判斷一個數的符號
5.2、字元串函數
-- 字元串函數
SELECT CHAR_LENGTH('哈哈哈') -- 字元串長度
SELECT CONCAT('xgp','aaa') -- 拼接字元串
SELECT INSERT('asa',1,2,'ss') -- 替換字元串
SELECT LOWER('AAAAAAAA') -- 轉小寫
SELECT UPPER('aaaaaaaa') -- 轉大寫
SELECT INSTR('aaaaa','a') -- 返回第一次出現子串的索引
SELECT REPLACE('aaaa','a','x') -- 替換字元串
SELECT SUBSTR('asasasxsssas',4,6) -- 截取字元串,截取的位置,截取的長度
SELECT REVERSE('aasss') -- 字元串反轉
5.3、時間和日期函數
-- 時間和日期函數(獲取當前日期)
SELECT CURRENT_DATE(); -- 獲取當前日期
SELECT CURDATE(); -- 獲取當前日期
SELECT NOW(); -- 獲取當前的時間
SELECT LOCALTIME(); -- 獲取本地時間
SELECT SYSDATE() -- 獲取系統時間
5.4、系統函數
-- 系統
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()
5.5、聚合函數
-- 聚合函數
SELECT COUNT(*) FROM teacher
SELECT COUNT(欄位) FROM teacher -- 會忽略null值
SELECT COUNT(1) FROM teacher
SELECT COUNT(主鍵) FROM teacher -- 速度更快
SELECT SUM(pwd) 求和 FROM teacher
SELECT AVG(pwd) 平均 FROM teacher
SELECT MAX(pwd) 最高 FROM teacher
SELECT MIN(pwd) 最低 FROM teacher
6、DCL:數據控制語言 (管理用戶許可權)data Control
6.1、創建用戶
-- 創建用戶
CREATE USER xgp123 IDENTIFIED BY '123456'
6.2、修改密碼
-- 修改密碼(修改當用戶密碼)
SET PASSWORD = PASSWORD('111111')
-- 修改密碼(修改自定的用戶的密碼)
SET PASSWORD FOR xgp123 = PASSWORD('123456')
6.3、給用戶重命名
-- 給用戶重命名
RENAME USER xgp123 TO xgp
6.4、用戶授權
-- 用戶授權(授予全部的許可權,庫,表)
GRANT ALL PRIVILEGES ON *.* TO xgp
6.5、查看指定用戶許可權
-- 查看指定用戶許可權
SHOW GRANTS FOR xgp
6.6、查看管理員許可權
-- 查看管理員許可權
SHOW GRANTS FOR root@localhost
6.7、撤銷許可權
-- 撤銷許可權(撤銷全部許可權)
REVOKE ALL PRIVILEGES ON *_* FROM xgp
7、事務
7.1、開啟/和關閉事務的自動提交,mysql預設是開啟的
-- 事務(測試轉賬)mysql 是預設開啟事務自動提交的
SET autocommit = 0; -- 先關閉事務提交
SET autocommit = 1; -- 開啟
7.2、進行手動處理事務
-- 事務開啟
START TRANSACTION -- 標記一個事務的開始
-- 提交
COMMIT
-- 回滾
ROLLBACK
-- 事務結束
-- 瞭解
SAVEPOINT -- 設置一個事務的保存點
ROLLBACK TO SAVEPOINT 保存點名,會滾到保存點
7.3、通過轉賬案例手動測試事務
-- 編寫轉賬案例
CREATE TABLE account (
id INT(3) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (id)
)ENGINE=INNODB DEFAULT CHARSET = 'utf8'
INSERT INTO account(`name`,money) VALUES ('張三',2000.00),('李四',10000.00)
-- 模擬轉賬
SET autocommit = 0; -- 關閉自動提交
START TRANSACTION; -- 開啟事務
UPDATE account SET money = money - 500 WHERE `name` = '張三';
UPDATE account SET money = money + 500 WHERE `name` = '李四';
COMMIT; -- 提交事務
ROLLBACK; -- 回滾
SET autocommit = 1; -- 恢復預設值
8、其他技術
8.1、對資料庫進行備份
命令行執行導出命令 mysqldump
mysqldump -hlocalhost -uroot -p123456 westos > D:/a.sql
8.2、對資料庫進行導入
-- 導入
source sql文件路徑
8.3、對資料庫進行md5加密
-- 資料庫級別的MD5加密
UPDATE teacher SET pwd = MD5(pwd)
-- 插入時進行加密
INSERT INTO teacher(`name`,pwd) VALUES ('aaa',MD5('123456'))
-- 如何校驗
SELECT * FROM teacher WHERE `name`='aaa' AND pwd = MD5('123456')
9、mysql基礎語法的詳細語法格式文檔
mysql產品的常見命令
1,mysql服務的啟動和停止
方式一:電腦——右鍵管理——服務
方式二:通過管理員身份運行
net start 服務名(啟動服務)
net stop 服務名(停止服務)
2,mysql服務的登陸和退出
方式一:通過mysql自帶的客戶端
只限於root用戶
方式二:通過cmd命令行
登陸:
mysql [-h主機名 -P埠號] -u用戶名 -p[密碼]
退出:
exit 或者 ctrl+c
3,sql語句的基本使用
1.查看當前所有資料庫
show databases;
2.打開指定庫
user 庫名
3.查看當前庫的所有表
show tables;
4.查看其它庫的所有表
show tables from 庫名;
5.創建表
create table 表名 (
列名 列類型,
列名 列類型,
...
);
6.查看表結構
desc 表名;
7.查看伺服器版本
方式一:登陸到mysql服務端
select version();
方式二:沒有登陸到mysql服務端
mysql --version 或者 mysql -V
8.註釋
單行:#註釋文字
-- 註釋文字
多行:/*註釋文字*/
DQL語言的學習
階段一:1,基礎查詢
語法:
select 查詢列表 from 表名;
查詢列表:
表中的欄位,常量值,表達式,函數
1.查詢表中的單個欄位
select last_name from employees;
2.查詢表中的多個欄位
select last_name,salary,email from employees;
3.查詢表中的所有欄位
select * from employees;
2,其他基礎查詢
1.查詢常量值
select 100;
select 'join';
2.查詢表達式
select 100*98;
select 100%98;
3.查詢函數
select version();
3,為欄位起別名
1.方式一:(使用as)
select 100%98 as 結果;
select last_name as 姓 from employees;
2.方式二:(使用空格)
select last_name 姓 from employees;
4,去重(distinct)
1.案例:查詢員工表的所有部門的編號
select distinct
department_id
from
employees;
5,+號的作用
1.案例:查詢員工名和姓連接成一個欄位,並顯示為 姓名
錯誤做法:
select
last_name + first_name as 姓名
from
employees;
正確做法:(使用concat()函數)
select
concat(last_name,first_name) as 姓名
from
employees;
6,ifnull()函數的使用
格式:
ifnull(判斷是否為空的參數,若為空返回的值)
舉例:
select ifnull(commission_pct,0) as 獎金率;
階段二:1,條件查詢
語法:
select
查詢列表
from
表名
where
篩選條件;
篩選條件:
1.按照條件表達式篩選
條件運算符:
> < = ....
案例:
select
*
from
employees
where
salary > 12000;
2.按照邏輯運算符刷選
邏輯運算符:
&& || !
mysql推薦:
and or not
案例:
select
*
from
employees
where
salary > 12000 and salary < 20000;
3.模糊查詢
1.關鍵字:like
特點:
一般和通配符使用
% 任意多個字元,包含0個字元
_ 任意多個字元
案例:查詢員工名中包含字元a的員工信息
select
*
from
employees
where
last_name like '%a%';
特殊案例(需要轉義通配符 escape):查詢員工名中第二個字元為_的員工信息
select
*
from
employees
where
last_name like '_$_%' escape '$';
2.關鍵字:between and
特點:
包含臨界值
案例:
select
*
from
employees
where
salary between 12000 and 20000;
3.關鍵字:in
案例:
select
*
from
employees
where
job_id in ('IT_PROT','AD_VP','AD_PRES');
4.關鍵字:is null
註意:=號不能判斷null值
案例:
select
*
from
employees
where
commission_pct is null;
2,兩個特殊符號的介紹(<>,<=>)
1.<>相當於!=,不過mysql更推薦改寫法
2.<=>安全等於,可以判斷null值
階段三:1,排序查詢
語法:
select
查詢條件
from
表
[where 篩選條件]
order by
排序列表 [asc|desc]
註意:
asc:升序
desc:降序
不寫:預設升序
案例(從高到低 desc):
select
*
from
employee
order by
salary desc;
案例(從低到高 asc):
select
*
from
employee
order by
salary asc;
特殊案列:按姓名的位元組長度顯示員工的姓名和工資(按函數排序 length(last_name))
select
length(last_name) 位元組長度,last_name,salary
from
employees
order by
length(last_name) desc;
2,多個欄位排序
1.案例:查詢員工信息,要求先按工資排序,再按員工編號排序【按多個欄位排序】
select
*
from
employees
order by
salary asc,employee_id desc;
階段四:常見函數
1.調用:select 函數名(實參列表) [from 表];
2.分類:單行函數,聚合函數
1,字元函數
1.length(字元) 獲取參數值的位元組個數
select length('join');
select length('哈');
2.concat(參數1,參數2,...) 拼接字元串
select concat(last_name,'_',first_name) 姓名 from employees;
3.upper(字元) lower(字元)
select upper('dadada');
select lower('HJJJI');
4.substr(字元,位置1,位置2),substring(字元,位置1,位置2) 截取字元
註意:mysql中索引從1開始
select substr('hduxshdfkjsf',2,6);
5.instr(字元,查找的字元字串) 放回子串第一次出現的索引,如果找不到放回0
select instr('dsfsfd','fs');
6.trim(字元) 去除前後空格
select length(trim(' 長記性了 ')) as out_put
其他用法:去除前後指定字元
trim(字元 from 字元串);
select trim('a' from 'aaaaaaaaa或許是第aaaaaacxhddjkhaaaaaaaaa') as out put;
7.lpad(字元,個數,填充字元) 用指定的字元實現左填充指定的長度
select lpad('xgp',2,'*') as out_put;
8.rpad(字元,個數,填充字元) 用指定的字元實現右填充指定的長度
select rpad('xgp',12,'*') as out_put;
9.replace(原字元串,要替換字元,替換字元) 替換
select replace('xgp123','xgp','123') as oup_put;
2,數學函數
1.round(數值,保留幾位小數) 四捨五入
select round(1.65);
select round(1.675,2);
2.ceil(數值) 向上取整
select ceil(1.02);
3.floor(數值) 向下取整
select floor(-9.99);
4.truncate(數值,保留幾位小數) 截斷
select truncate(1.66,1);
5.mod(被取餘數,取餘子) 取餘
select mod(-10,-3);
3,日期函數
1.now() 放回當前系統的日期+時間
select now();
2.curdate() 放回當前系統日期,不包含時間
select curdate();
3.curtime() 放回當前系統時間,不包含日期
select curtime();
4.可以獲取指定的部分,年、月、日、小時、分鐘、秒
select year(now()) 年;
5.str_to_date(格式,字元類型) 將日期格式的字元轉換成指定格式的日期
select str_to_date('1998-3-2','%Y-%c-%d');
6.date_format(格式,字元類型); 將日期轉換成字元
select date_format(now(),'%y年%m月%d日');
4,其他函數
1.select version(); 查看mysql版本
2.select database(); 查看當前資料庫
3.select user(); 查看當前用戶
5,流程式控制制函數
1.if(判斷條件,if結果,else結果)函數 if else 的效果
select if(10>5,'大','小');
2.case()函數的使用一
case 要判斷的欄位或者表達式
when 常量1 then 要顯示的值1或語句1
when 常量2 then 要顯示的值2或語句2
when 常量3 then 要顯示的值3或語句3
......
else 要顯示的值n或者語句n
end
案例:查詢員工工資,要求
部門號=30,顯示工資為1.1倍
部門號=40,顯示工資為1.2倍
部門號=50,顯示工資為1.3倍
其他部門,顯示為原工資
SELECT
salary 原始工資,department_id ,
CASE
department_id = 30
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE
salary
END
AS 新工資
FROM
employees;
3.case()函數的使用二
case
when 條件1 then 要顯示的值1或語句1
when 條件2 then 要顯示的值2或語句2
......
else 要顯示的值n或語句n
end
案例:查詢員工的工資的情況
如果工資>20000,A
如果工資>15000,B
如果工資>10000,C
否則 D
SELECT salary,
CASE
WHEN salary > 20000 THEN 'A'
WHEN salary > 15000 THEN 'B'
WHEN salary > 10000 THEN 'C'
ELSE 'D'
END AS 工資級別
FROM employees;
6,聚合函數
1.sum(欄位) 求和 avg() 平均值 min() 最小值 max() 最大值 count() 計數
select sum(salary) from employees;
2.特點:
1.sum(),avg() 支持數值型
min(),max(),count() 支持任何類型
2.上述聚合函數都排除了null值
3.和distinct搭配使用
select count(distinct salary),count(salary) from employees;
4.count() 函數的詳細介紹
select count(*) from employees;
select count(1) from employees;
效率:
MYISAM存儲引擎下,count(*) 的效率高
INNODB存儲引擎下,count(*)和count(1)的效率差不多,比count(欄位)要高一些
5.和聚合函數使用,一般都不會帶欄位
階段五:1,分組查詢
1.語法:
select 分組函數,列 (要求出現在group by的後面)
from 表
[where 篩選條件]
group by 分組的列表
[order by 子句]
2.註意:
查詢列表必須特殊,要求是分組函數和group by後出現的欄位
3.案例1:查詢每個工種的最高工資
select max(salary),job_id
from employees
group by job_id;
2,添加分組前篩選
案例1:查詢郵箱中包含a字元的,每個部門的平均工資
select
avg(salary),department_id
from
employees
where
email like '%a%'
group by
department_id;
案例2:查詢有獎金的每個領導手下員工的最高工資
select
max(salary),manager_id
from
employees
where
commission_pct is not null
group by
manager_id;
3,添加分組後篩選
1.案例1:查詢哪個部門的員工個數>2
1.查詢每個部門的員工個數
select
count(*),department_id
from
employees
group by
deparment_id;
2.根據1的結果,查詢哪個部門的員工數>2
select
count(*),department_id
from
employees
group by
deparment_id;
having
count(*)>2;
2.案例2:查詢每個工種有獎金的員工的最高工資>12000的工種編號和最高工資
select
max(salary),job_id
from
employees
where
commission_pct is not null
group by
job_id
having
max(salary) > 12000;
4,按多個欄位分組
1.案例:查詢每個部門每個工種的員工的平均工資
select
avg(salary),department_id,job_id
from
employees
group by
deparentment_id,job_id;
5,添加排序
1.案例:查詢每個部門各個工種的員工的平均工資,並且按平均工資的高低顯示
select
avg(salary) a,department_id,job_id
from
employees
where
department_id is not null
group by
job_id,department_id
having
avg(salary) > 10000
order by
avg(salary) desc;
階段六:1,連接查詢(多表查詢)
笛卡爾乘積現象:沒有有效的連接條件
如何避免:添加有效的連接條件
舉例:
SELECT
NAME,boyName
FROM
boys,beauty
WHERE
beauty.boyfriend_id = boys.id;
分類:
按年代分類:
sql92標準:僅僅只支持內連接
sql99標準【推薦】:支持內連接+外連接(左外和右外) + 交叉連接
按功能分類:
內連接:
等值連接
非等值連接
自連接
外連接:
左外連接
右外連接
全外連接
交叉連接
2,sql92標準
1,等值連接
1.案例1:查詢員工名和對應的部門名
SELECT
last_name,department_name
FROM
employees,departments
WHERE
employees.department_id = departments.department_id
2.案例2:查詢每個工種的工種名和員工的個數,並且按員工個數升序
SELECT
job_title,COUNT(*)
FROM
employees e,jobs j
WHERE
e.job_id = j.job_id
GROUP BY
job_title
ORDER BY
COUNT(*) DESC;
3.案例3:查詢員工名、部門名和所在的城市(三表查詢)
SELECT
last_name,department_name,city
FROM
employees e,departments d,locations l
WHERE
e.department_id = d.department_id
AND
d.location_id = l.location_id
AND
city LIKE 's%'
ORDER BY
department_name DESC;
2,非等值連接
1.案例1:查詢員工的工資和工資級別
SELECT
salary,grade_level
FROM
employees e,job_grades g
WHERE
salary BETWEEN g.lowest_sal AND g.highest_sal;
3,自連接
1.案例:查詢 員工名和上級的名稱
SELECT
e.employee_id,e.last_name,m.employee_id,m.last_name,m.department_id
FROM
employees e,employees m
WHERE
e.manager_id = m.employee_id;
3,sql99標準
1.語法:
select
查詢列表
from
表1 別名 連接類型
join
表2 別名
on
連接條件
[where
篩選條件]
[group by
分組]
[having
篩選條件]
[order by
排序列表]
2.連接類型
內連接(*):inner
外連接:
左外(*):left [outer]
右外(*):right [outer]
全外:full [outer]
交叉連接:cross join
1,內連接
1.語法:
select
查詢列表
from
表1 別名
inner join
表2 別名
on
連接條件
1,等值連接
1.案例1:查詢哪個部門的員工個數>3的部門名和員工個數,並按照個數降序(添加排序)
1.查詢每個部門的員工個數
SELECT
COUNT(*),department_name
FROM
employees e
INNER JOIN
departments d
ON
e.department_id = d.department_id
GROUP BY
department_name
2.在1的結果上篩選員工個數>3的記錄,併排序
SELECT
COUNT(*),department_name
FROM
employees e
INNER JOIN
departments d
ON
e.department_id = d.department_id
GROUP BY
department_id
HAVING
COUNT(*) > 3
ORDER BY
COUNT(*) DESC;
2,非等值連接
2.案例1:查詢員工的工資級別
SELECT
salary,grade_level
FROM
employees e
JOIN
job_grades g
ON
e.salary
BETWEEN
g.lowest_sal
AND
g.highest_sal;