用於建立、修改、和刪除數據庫內的數據結構,如:mysql
1:建立和刪除數據庫(CREATE DATABASE || DROP DATABASE);sql
2:建立、修改、重命名、刪除表(CREATE TABLE || ALTER TABLE|| RENAME TABLE||DROP TABLE,TRUNCATE TABLE);數據庫
3:建立和刪除索引(CREATEINDEX || DROP INDEX)安全
修改數據庫中的數據,包括插入(INSERT)、更新(UPDATE)和刪除(DELETE)服務器
用於對數據庫的訪問,主要包括建立用戶、給用戶受權、對用戶撤銷受權、查詢用戶受權和刪除用戶等數據結構
,如:1.建立用戶(create user)2:給用戶授予訪問權限(GRANT);3:取消用戶訪問權限(REMOKE),4刪除用戶(drop user)。xss
從數據庫中的一個或多個表中查詢數據(SELECT)函數
-- 若是不存在,則建立數據庫,而且以utf的字符集建立 CREATE DATABASE IF NOT EXISTS westos DEFAULT CHARACTER SET = 'utf8'
-- 若是存在,則刪除數據庫 DROP DATABASE IF EXISTS westos
-- 使用數據庫 USE westos
-- 查看全部的數據庫 SHOW DATABASES
-- 查看全部的數據表 SHOW TABLES
-- 建立學生表,若是不存在 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'
-- 查看建立數據庫的語句 SHOW CREATE DATABASE westos -- 查看建立數據表的語句 SHOW CREATE TABLE student
-- 查看錶的具體結構 DESC student
-- 修改表名 ALTER TABLE student RENAME AS teacher
-- 增長表的字段 ALTER TABLE teacher ADD age INT
-- 修改表的字段(重命名,修改約束) ALTER TABLE teacher MODIFY age VARCHAR(11) -- 修改約束,不能改字段名 ALTER TABLE teacher CHANGE age is_del INT -- 字段重命名
-- 刪除表的字段 ALTER TABLE teacher DROP is_del
-- 刪除表 DROP TABLE IF EXISTS student
-- 插入語句(添加) INSERT INTO teacher (`name`) VALUES ('xgp')
-- 修改語句 UPDATE teacher SET `name`='xgp',sex='女' WHERE id=1
-- 設置數據庫的時間 UPDATE `teacher` SET `birthday` = CURRENT_TIME WHERE id=1
-- 刪除指定數據 DELETE FROM teacher WHERE id=1
-- 徹底清空一個數據庫表,表的結構和索引約束不變,自增會歸零 TRUNCATE TABLE teacher
-- 查詢(使用別名) SELECT `name` 姓名,pwd 密碼 FROM teacher 老師表
-- 函數 拼接字符串 Concat(a,b) SELECT CONCAT('姓名:',`name`) 新名字 FROM teacher
-- 去重 SELECT DISTINCT `name` FROM teacher
-- 查看系統版本 SELECT VERSION()
-- 計算結果 SELECT 100*3-23 計算結果 SELECT pwd+'1' 密碼加1 FROM teacher
-- 模糊查詢 -- like結合 %(表明0到任意個字符) _(表明一個字符) SELECT `name`,pwd FROM teacher WHERE `name` LIKE '_g_' -- in SELECT id,`name`,pwd FROM teacher WHERE id IN (4,7,10)
-- 排序:升序 ASC 降序 DESC -- order by 經過哪一個字段排序,怎麼排 SELECT * FROM teacher ORDER BY id DESC SELECT * FROM teacher ORDER BY id ASC
-- 分頁: SELECT * FROM teacher ORDER BY id DESC LIMIT 2,10
-- 經常使用函數 SELECT ABS(-78) -- 絕對值 SELECT CEILING(9.4) -- 向上取整 SELECT FLOOR(9.4) -- 向下取整 SELECT SIGN(-9) -- 判斷一個數的符號
-- 字符串函數 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') -- 字符串反轉
-- 時間和日期函數(獲取當前日期) SELECT CURRENT_DATE(); -- 獲取當前日期 SELECT CURDATE(); -- 獲取當前日期 SELECT NOW(); -- 獲取當前的時間 SELECT LOCALTIME(); -- 獲取本地時間 SELECT SYSDATE() -- 獲取系統時間
-- 系統 SELECT SYSTEM_USER() SELECT USER() SELECT VERSION()
-- 聚合函數 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
-- 建立用戶 CREATE USER xgp123 IDENTIFIED BY '123456'
-- 修改密碼(修改當用戶密碼) SET PASSWORD = PASSWORD('111111') -- 修改密碼(修改自定的用戶的密碼) SET PASSWORD FOR xgp123 = PASSWORD('123456')
-- 給用戶重命名 RENAME USER xgp123 TO xgp
-- 用戶受權(授予所有的權限,庫,表) GRANT ALL PRIVILEGES ON *.* TO xgp
-- 查看指定用戶權限 SHOW GRANTS FOR xgp
-- 查看管理員權限 SHOW GRANTS FOR root@localhost
-- 撤銷權限(撤銷所有權限) REVOKE ALL PRIVILEGES ON *_* FROM xgp
-- 事務(測試轉帳)mysql 是默認開啓事務自動提交的 SET autocommit = 0; -- 先關閉事務提交 SET autocommit = 1; -- 開啓
-- 事務開啓 START TRANSACTION -- 標記一個事務的開始 -- 提交 COMMIT -- 回滾 ROLLBACK -- 事務結束 -- 瞭解 SAVEPOINT -- 設置一個事務的保存點 ROLLBACK TO SAVEPOINT 保存點名,會滾到保存點
-- 編寫轉帳案例 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; -- 恢復默認值
命令行執行導出命令 mysqldump mysqldump -hlocalhost -uroot -p123456 westos > D:/a.sql
-- 導入 source sql文件路徑
-- 數據庫級別的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')
方式一:計算機——右鍵管理——服務 方式二:經過管理員身份運行 net start 服務名(啓動服務) net stop 服務名(中止服務)
方式一:經過mysql自帶的客戶端 只限於root用戶 方式二:經過cmd命令行 登錄: mysql [-h主機名 -P端口號] -u用戶名 -p[密碼] 退出: exit 或者 ctrl+c
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.註釋 單行:#註釋文字 -- 註釋文字 多行:/*註釋文字*/
語法: select 查詢列表 from 表名; 查詢列表: 表中的字段,常量值,表達式,函數 1.查詢表中的單個字段 select last_name from employees; 2.查詢表中的多個字段 select last_name,salary,email from employees; 3.查詢表中的全部字段 select * from employees;
1.查詢常量值 select 100; select 'join'; 2.查詢表達式 select 100*98; select 100%98; 3.查詢函數 select version();
1.方式一:(使用as) select 100%98 as 結果; select last_name as 姓 from employees; 2.方式二:(使用空格) select last_name 姓 from employees;
1.案例:查詢員工表的全部部門的編號 select distinct department_id from employees;
1.案例:查詢員工名和姓鏈接成一個字段,並顯示爲 姓名 錯誤作法: select last_name + first_name as 姓名 from employees; 正確作法:(使用concat()函數) select concat(last_name,first_name) as 姓名 from employees;
格式: ifnull(判斷是否爲空的參數,若爲空返回的值) 舉例: select ifnull(commission_pct,0) as 獎金率;
語法: 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;
1.<>至關於!=,不過mysql更推薦改寫法 2.<=>安全等於,能夠判斷null值
語法: 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;
1.案例:查詢員工信息,要求先按工資排序,再按員工編號排序【按多個字段排序】 select * from employees order by salary asc,employee_id desc;
1.調用:select 函數名(實參列表) [from 表]; 2.分類:單行函數,聚合函數
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;
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);
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日');
1.select version(); 查看mysql版本 2.select database(); 查看當前數據庫 3.select user(); 查看當前用戶
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;
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.語法: 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;
案例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;
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;
1.案例:查詢每一個部門每一個工種的員工的平均工資 select avg(salary),department_id,job_id from employees group by deparentment_id,job_id;
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;
笛卡爾乘積現象:沒有有效的鏈接條件
如何避免:添加有效的鏈接條件
學習
舉例: SELECT NAME,boyName FROM boys,beauty WHERE beauty.boyfriend_id = boys.id;
分類:測試
按年代分類: sql92標準:僅僅只支持內鏈接 sql99標準【推薦】:支持內鏈接+外鏈接(左外和右外) + 交叉鏈接 按功能分類: 內鏈接: 等值鏈接 非等值鏈接 自鏈接 外鏈接: 左外鏈接 右外鏈接 全外鏈接 交叉鏈接
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;
1.語法: select 查詢列表 from 表1 別名 鏈接類型 join 表2 別名 on 鏈接條件 [where 篩選條件] [group by 分組] [having 篩選條件] [order by 排序列表] 2.鏈接類型 內鏈接(*):inner 外鏈接: 左外(*):left [outer] 右外(*):right [outer] 全外:full [outer] 交叉鏈接:cross join
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;