1數據庫的基本操作
1.1查看所有存在數據庫
show databases;
1.2創建數據庫
(1)create databaseday15;
(2)create database day15
default character set utf8;(指定默認字符集爲utf-8)
1.3刪除數據庫
drop datebase day15;
1.4查看數據庫的默認字符集
show create database day15;
1.5修改數據庫(修改數據庫的字)
alter database day15 defaultcharacter set gbk;
6選擇數據庫
useday15;
2數據庫表的操作
2.1查看數據庫的所有表
useday15;(查看錶之前需要先選擇數據庫)
showtabkes(查看數據庫中的所有表)
.2.2創建表 這裏寫代碼片
(數據名稱 數據類型, 數據名稱 數據類型)
createtable student(sid int,sname varchar(20),sage int);
(sidint,sname varchar(20),sage int);
.2.3查看錶的結構
desc student;
.2.4刪除表
droptable student;
2.5修改表
2.5.1添加一個字段(添加一列)
altertable student add column sgender varchar(20);
ALTERTABLE student ADD servlet INT,ADD jsp INT;
2.5.2刪除一個字段(添加一列)
altertable student drop column sgender;
2.5.3修改一個字段的類型
altertable student modify( column) sgender varchar(100);
2.5.3修改一個字段的名稱
altertable student change( column) sgender gender varchar(20);
2.5.3修改表的名稱
altertable student rename(to)teacher;
3增刪改數據
3.1增加數據
3.1.1插入所有字段
INSERTINTO student VALUES(1,'張三','男',20);
⚠️注意:插入所有的字段;要一次按順序插入,不能少或者多字段的值
3.1.2插入部分字段
INSERTINTO student(id,NAME) VALUES(1,'張三');
3.2查詢數據
3.2.1查詢表中所有數據
SELECT *FROM student;
(查詢表中所有數據);
3.3修改數據
3.3.1修改所有數據(少用)
UPDATEstudent SET gender='女';
3.3.2帶條件的修改
UPDATEstudent SET gender='女' where id=1;
3.3.3帶條件的修改(修改多個字段)
UPDATEstudent SET gender='男',age=30 WHERE id=2;
3.4刪除數據
3.4.1刪除所有數據(少用)
deletefrom student;
3.4.2刪除待條件數據
DELETEFROM student WHERE id=1;
3.4.2另一種刪除數據的方式
TRUNCATETABLE student;
3.4.2 (delete from)和(truncatetable)的區別
(deletefrom)可以帶條件刪除(truncate table)不能帶條件刪除
(deletefrom)不可以刪除約束(truncate table)可以刪除約束
(deletefrom)刪除的數據可以回滾(事務) (truncate table) 刪除的數據不可以回滾(事務)
3.5查詢數據(重點)—基於一張表的查詢
3.5.1查詢所有列
SELECT *FROM student;
3.5.2查詢指定列
SELECTid,NAME FROM student;
SELECTid AS ‘編號’,NAMEAS ‘姓名’ FROM student;(查詢時指定別名-在多表查詢時很有用)
3.5.3查詢時添加常量列
SELECTid,NAME,chinese,english,math,'java就業班' FROM student;
SELECTid,NAME,chinese,english,math,'java就業班'AS '年級' FROM student;
3.5.4查詢時合併列 (只能合併數值類型的列)
SELECTid,NAME,(servlet+jsp) AS '總成績' FROM student;
3.5.5查詢時去除重複記錄
SELECTDISTINCT gender FROM student;
3.5.6條件查詢(where)
①邏輯條件:and(與) or(或)
SELECT *FROM student WHERE id=2 OR NAME='王五';
②比較條件:< > >= <= == <>(不等於) (between and)代表>=並且<=
SELECT *FROM student WHERE jsp>90;
③判空條件(null 空字符串): is null/is not null /==/<
SELECT *FROM student WHERE jsp IS NULL;
④模糊條件(like)
SELECT *FROM student WHERE NAME LIKE '李_';(只能是兩個字)
SELECT *FROM student WHERE NAME LIKE '李%';(不限制字符)
3.5.7聚合查詢
常用的聚合函數:sum() avg() max() min() count()
SELECTSUM(servlet) AS ‘總成績’ FROM student;
SELECTAVG(servlet) AS ‘平均分’ FROM student;
SELECTMAX(servlet) AS ‘最高分’ FROM student;
SELECTMIN(servlet) AS ‘最低分’ FROM student;
SELECTCOUNT(*) AS ‘字段數’ FROM student;(統計字段最大的數量.
COUNT統計的數量不包括null的數據,儘量使用不包含null的字段)SELECTCOUNT(id) AS ‘字段數’ FROM student;
3.5.8分頁查詢(LIMIT 起始行(從0開始),查詢幾條記錄)沒有記錄則不顯示
分頁查詢sql語句SELECT * FROM student LIMIT (當前頁-1)*每頁顯示的條數,每頁顯示的條數
SELECT *FROM student LIMIT 0,2;
3.5.9查詢排序
–查詢排序 默認情況下按插入記錄的順序–
–語法 ORDER BY 字段 ASC/DESC–
–ASC 順序,正序,遞增,字母,自然順序(a-z)–
–DESC 倒序,反序,遞減,字母,自然反序(z-a)–
SELECT *FROM student ORDER BY id ASC;
SELECT *FROM student ORDER BY id DESC;
SELECT *FROM student ORDER BY jsp DESC,servlet DESC;
3.5.10分組查詢
–分組查詢(GROUP BY )–
–需求:查詢男女的人數—
SELECTgender,COUNT(*) AS '人數' FROM student GROUP BY gender;
3.5.11分組查詢後篩選
– 需求:查詢人數大於2的性別(分組之後的篩選用having-分組之前用where-
SELECTgender,COUNT() FROM student GROUP BY gender HAVING COUNT()>3;
總結
mysql基礎
1)mysql存儲結構:數據庫 -> 表 -> 數據 sql語句
2)管理數據庫:
增加: create database 數據庫 default character utf8;
刪除: drop database 數據庫;
修改: alter database 數據庫 default character gbk;
查詢: show databases / show createdatabase 數據庫;
3) 管理表:
選擇數據庫:use 數據庫;
增加: create table 表(字段名1字段類型,字段名2 字段類型......);
刪除: drop table 表;
修改:
添加字段: alter table 表 add [column] 字段名 字段類型;
刪除字段: alter table 表 drop[column] 字段名;
修改字段類型: alter table 表 modify 字段名 新的字段類型;
修改字段名稱 : alter table 表 change 舊字段名 新字段名 字段類型;
修改表名稱: alter table 表 rename [to] 新表名;
查詢:
showtables / desc student;
4) 管理數據:
增加: insert into 表(字段1,字段2,。。。) values(值1,值2.。。。。);
刪除: delete from 表 where 條件;
修改: update 表 set 字段1=值1,字段2=值2...... where條件;
查詢:
4.1)所有字段: select * from 表;
4.2)指定字段: select 字段1,字段2....from 表;
4.3)指定別名: select 字段1 as 別名from 表;
4.4 )合併列: select (字段1+字段2) from 表;
4.5)去重: select distinct 字段 from 表;
4.6)條件查詢:
a)邏輯條件 :and(與) or(或)
select* from 表 where 條件1 and/or 條件2
b)比較條件: > < >= <= = <> between and(在。。。之間)
select* from 表 whereservlet>=90;
c)判空條件:
判斷null: is null / isnot null
判斷空字符串: ='' / <>''
d)模糊條件: like
%: 替換任意個字符
_: 替換一個字符
4.7 分頁查詢:limit 起始行,查詢行數
起始行從0開始
4.8 排序: order by 字段 asc/desc
asc:正序,順序
desc:反序,倒序
4.9 分組查詢:group by 字段
4.10: 分組後篩選: having 條件
SQL語句的分類:
DDL: 數據定義語言
create /drop / alter
DML:數據操作語句
insert /delete /update / truncate
DQL: 數據查詢語言:
select / show
今天的目標:
大綱:
1)數據約束
2)數據庫設計(表設計)
3)存儲過程
4)觸發器
5)mysql權限問題
5數據的約束
5.1什麼是數據約束
對用戶操作表的數據進行約束
5.2默認值(DEFAULT)
默認值插入允許爲null
只有在不插入值的時候默認值纔可以使用
CREATE TABLE TEXT(
id INT,
NAME VARCHAR(20),
address VARCHAR(20) DEFAULT '河南信陽'-- 默認值
);
5.3非空(not null)
必須得賦值,而且不能賦值爲null
CREATETABLE student(
id INT NOT NULL,
NAME VARCHAR(20),
address VARCHAR(20) DEFAULT '河南信陽'-- 默認值
);
5.4唯一(unique)
不能有一樣的id,但是不能對null起作用,在有值的情況下才起作用
CREATETABLE student(
id INT UNIQUE,
NAME VARCHAR(20) NOT NULL,
address VARCHAR(20) DEFAULT '河南信陽'-- 默認值
);
5.5主鍵(非空+唯一PRIMARY KEY,)
通常情況下,每張表都會設置一個主鍵的字段,用於標記表中數據的唯一性。
建議不要選擇表的包含業務含義的字段作爲主鍵,建議給每張表設計一個非業務字段的id作爲主鍵
CREATETABLE student(
id INT(4) ZEROFILL PRIMARYKEY,//不滿四位用0填充
NAME VARCHAR(20) NOT NULL,
address VARCHAR(20) DEFAULT '河南信陽'-- 默認值
);
5.6自增長(AUTO_INCREMENT)
作用:自動的遞增
可以不賦值,自動的增加
CREATETABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
address VARCHAR(20) DEFAULT '河南信陽'-- 默認值
);
5.6外鍵的約束
作用;主要約束兩張表
插入數據是部門名稱冗餘比較高
–解決冗餘問題,給冗餘的字段放到一張單獨的表中,將冗餘的字段單獨出一張表
外鍵是設置在副表上的,主表的參考字段通常爲主鍵
添加數據必須添加主表
1.當有了外鍵約束的時候,添加數據的順序:先添加主表的數據,在添加副表的數據
2.當有外鍵的約束,修改數據的順序:不能先修改主表,先改副表(確認副表中沒有與主表關聯的數據),再改主表
3.當有外鍵的約束的時候,刪除數據的順序:先刪除副表是的數據,再刪除主表的數據
CREATETABLE employee(–副表/從表)
id INT PRIMARY KEY,
empName VARCHAR(20),
-- deptName varchar(20) -- 部門名
deptId INT, -- 部門id
-- 聲明外鍵約束
CONSTRAINTemploy_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
-- 外鍵的名稱 外鍵 參考表(參考字段)
); SHOWTABLES;
– 設計一個部門表
CREATETABLE dept((–主表)
id INT PRIMARY KEY,
deptName VARCHAR(20)
);
INSERTINTO employee VALUE(1,’張三’,1);
INSERTINTO employee VALUE(2,’李四’,1);
INSERTINTO employee VALUE(3,’王五’,2);
4.問題 當有了外鍵約束的時候,必須先刪除或修改副表的數據,才能修改主表中的數據
5.7級聯的操作
問題: 當有了外鍵約束的時候,必須先修改或刪除副表中的所有關聯數據,才能修改或刪除主表!但是,我們希望直接修改或刪除主表數據,從而影響副表數據。可以使用級聯操作實現!!!
級聯修改: ON UPDATE CASCADE
級聯刪除: ON DELETE CASCADE
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptId INT,-- 把部門名稱改爲部門ID
-- 聲明一個外鍵約束
CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE -- ON CASCADE UPDATE :級聯修改
-- 外鍵名稱 外鍵 參考表(參考字段)
)
注意: 級聯操作必須在外鍵基礎上使用
– 級聯修改(修改)
– 直接修改部門
UPDATE dept SET id=5 WHERE id=4;
– 級聯刪除
– 直接刪除部門
DELETE FROM dept WHERE id=1;
6數據庫的設計
6.1三大範式
6.1.1第一範式
要求每個字段必須是不可分割的獨立單元
Student : name —違反了第一範式
張小明|狗娃 查詢的時候會出問題
正確做法: Student: name oldname
張小明 |狗娃
6.1.2第二範式
在第一範式的基礎上,要求每張表只表達一個意思,表的每個字段和表的主鍵有依賴
6.1.3第三範式
在第二範式基礎,要求每張表的主鍵之外的其他字段都只能和主鍵有直接決定依賴關係。
違反第三範式,數據冗餘會比較高,需要使用外鍵
7關聯查詢(多個表之間的查詢)
– 關聯查詢–
– 需求:查詢出員工及其所在的部門(希望顯示員工姓名,部門名稱)
– 交叉鏈接查詢(產生笛卡爾乘積現象;3*3=9,有些記錄重複)不推薦使用
SELECT empName,deptName FROM employee,dept
– 內連接查詢
– 多表查詢的規則,1、確定查詢哪些表。2,確定哪些字段
– 3.表與表之間連接條件
– 需求:查詢出員工及其所在的部門(希望顯示員工姓名,部門名稱)
SELECT empName,deptName
FROMemployee,dept
WHEREemployee.deptId=dept.id;-- 連接條件是查詢表數目減一
– 內連接的另一種語法
SELECT empName,deptName
FROMemployee
INNERJOIN dept
ONemployee.deptId=dept.id;
– 內連接使用別名
SELECT empName,deptName
FROMemployee AS e
INNERJOIN dept AS d
ONe.deptId=d.id;
– 左外連接查詢:使用左邊表的數據去匹配右邊的數據,如果符合連接條件的結果則顯示,如果不符合連接條件則顯示爲null
– 如果是左外連接,左邊表的數據一定會顯示
– 需求 查詢每個部門的員工
SELECT d.deptName,e.empName
FROMdept d
LEFTOUTER JOIN employee e
ONd.id=e.deptId;
– 右[外]連接查詢
– 使用右邊表的數據去匹配左邊的數據,如果符合連接條件的結果則顯示,如果不符合連接條件則顯示爲null
– 如果是右外連接,右邊表的數據一定會顯示
SELECT d.deptName,e.empName
FROMemployee e
RIGHTOUTER JOIN dept d
ONd.id=e.deptId;
– 自連接查詢
– 需求:查詢員工及其上司
SELECT e.empName,b.empName
FROMemployee e
LEFTOUTER JOIN employee b
ONe.bossId=b.id;
ALTER TABLE employee ADD bossId INT;
UPDATE employee SET bossId=NULL WHERE id=1;
UPDATE employee SET bossId=2 WHERE id=2;
UPDATE employee SET bossId=3 WHERE id=3;
8存儲過程
8.1什麼是存儲過程
存儲過程:帶有邏輯的sql語句
之前是sql沒有條件判斷,沒有循環
存儲過程帶上流程控制語句(if while)
8.2存儲過程特點
1)執行效率非常快!存儲過程是在數據庫的服務器執行的!!
2)移植性很差,不同數據庫的存儲過程是不能移植的
8.3存儲過程的使用
– 存儲過程
– 聲明結束符
DELIMITER ¥ –聲明存儲過程的結束符
CREATE PROCEDURE pro_test() – 存儲過程名稱(參數列表)
BEGIN
--可以寫多個sql語句;
SELECT* FROM employee;
END ¥ – 結束 結束符
– 調用存儲過程
CALL pro_test();
參數:
IN:表示輸入參數,可以攜帶數據帶存儲過程中
– 帶有存儲輸入參數的存儲過程
– 需求 傳入一個員工的id,查詢員工的信息
DELIMITER $
CREATE PROCEDURE pro_finfById(IN eid INT)
BEGIN
SELECT* FROM employee WHERE id=eid;
END $
– 調用
CALL pro_finfById(2);
OUT:表示輸出參數,可以從存儲過程中返回結果
– 帶有輸出參數的存儲過程
DELIMITER $
CREATE PROCEDURE pro_testOut(OUT strVARCHAR(20))
BEGIN
SETstr='這是一個輸出參數';
END $
– 調用
– 如何接受返回參數的值?
– *****MySQL的變量
– 全局變量(內置變量):
--查看所有的全局變量:show variables
--查看某個全局變量:select @@變量名
--修改全局變量:set 變量名=新值
--character_set_client:mysql服務器接收數據的編碼
--character_set_results:mysql服務器輸出數據的編碼
– 會話變量:只存在於當前客戶端與數據庫服務器端是一次連接當中,如果連接斷開,變量丟失
--定義會話變量:set @變量=值
--查看會話變量:select @變量
– 局部變量:在存儲過程中使用的變量就叫局部變量,只要存儲過程執行完畢,局部變量就會丟失
– 定義一個會話變量
CALL pro_testOut(@NAME);
– 查看變量值
SELECT @NAME;
INOUT: 表示輸入輸出參數,既可以輸入,也可以輸出功能
– 帶有輸入輸出參數的存儲過程
DELIMITER $
CREATE PROCEDURE pro_testInOut(INOUT n INT)
BEGIN
– 查看變量
SELECTn;
SETn=500;
END $
– 調用
SET @n=10;
CALL pro_testInOut(@n);
SELECT @n;
– 帶有條件判斷的存儲過程
– 需求 輸入一個整數,如果是1 返回“星期一”,如果是2,返回“星期二”
DELIMITER $
CREATE PROCEDURE pro_testIf(IN num INT,OUTstr VARCHAR(20))
BEGIN
IFnum=1 THEN
SETstr='星期一';
ELSEIFnum=2 THEN
SETstr='星期二';
ELSEIFnum=3 THEN
SETstr='星期三';
ELSE
SET str='輸入錯誤';
END IF;
END $
– 調用
SET @num=1;
CALL pro_testIf(@num,@str);
SELECT @str;
– 把查詢結果作爲返回值
DELIMITER $
CREATE PROCEDURE pro_testfindById(IN eidINT,OUT vname VARCHAR(20))
BEGIN
SELECTempaName INTO vname FROM employee WHERE id=eid;
END $
9觸發器
9.1觸發器的作用
當操作
9.2觸發器的用法
– 觸發器
USE day16;
SELECT * FROM employee;
– 日誌表
CREATE TABLE test_log(
idINT PRIMARY KEY AUTO_INCREMENT,
contentVARCHAR(100)
);
– 需求:當向員工表插入一條記錄時,希望MySQL自動同時在日表中插入數據】
– 創建觸發器
CREATE TRIGGER tri_empAdd AFTER INSERT ONemployee FOR EACH ROW – 當往員工表插入一條記錄時
INSERTINTO test_log(content) VALUES('員工表插入一條記錄');
– 插入數據
INSERT INTO employee(id,empName,deptId)VALUES(4,’張三’,1);
INSERT INTO employee(id,empName,deptId)VALUES(5,’李四’,2);
– 修改數據
CREATE TRIGGER tri_empUpd AFTER UPDATE ONemployee FOR EACH ROW – 當往員工表修改一條記錄時
INSERTINTO test_log(content) VALUES('員工表修改一條記錄');
– 修改
UPDATE employee SET deptId=2 WHERE id=4;
– 刪除數據
CREATE TRIGGER tri_empDel AFTER DELETE ONemployee FOR EACH ROW – 當往員工表刪除一條記錄時
INSERTINTO test_log(content) VALUES('員工表刪除一條記錄');
– 刪除
DELETE FROM employee WHERE id=4;
SELECT * FROM employee;
SELECT * FROM test_log;
9權限問題
– ********MySQL權限問題
– MySQL數據庫權限問題:root:擁有所有權限(可以幹任何事情)
– 權限賬戶:只擁有部分權限(CURD)例如,只能操作摸個數據庫的某張表
– 如何修改MySQL的用戶密碼?
– password:md5加密函數(單向加密)
SELECT PASSWORD(‘root’);–*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
– mysql數據庫 用戶配置:user表
USE mysql;
SELECT * FROM USER;
– 修改密碼
UPDATE USER SET PASSWORD=PASSWORD(‘123456’)WHERE USER=’root’;
– 分配權限賬戶
GRANT 權限 ON 數據庫.表 TO ‘賬戶名’@’賬戶類型’ IDENTIFIED BY ‘密碼’;
GRANT SELECT ON day16.employee TO’lijun’@’localhost’ IDENTIFIED BY ‘5618’;
– * mysql的備份和還原
– 備份 必須退出數據庫登錄 在命令行中寫入此命令 不需要登錄
mysqldump -u root -p day16 > e:/dayl6.sql;
– 還原必須退出數據庫登錄 在命令行中寫入此命令 不需要登錄
mysql -u root -p day16 < e:/dayl6.sql;