MySQL數據庫05 數據庫控制和設計

DCl 語句

數據庫控制 controller

數據庫的用戶

root是超級管理員用戶,很容易引發由於誤操作所導致的數據不安全問題

查看mysql 數據庫的mysql 數據庫 user 表 存儲了mysql 數據庫所有的用戶

新建用戶語法

create user 'zhangsan'@'localhost';
# 創建沒有密碼的賬戶 zhangsan , 允許在 本機登錄
create user 'zhangsan'@'%';
# 創建沒有密碼的賬戶 zhangsan , 允許在任何主機登錄
create user 'lisi'@'localhost' identified by '456789'
# 創建密碼爲456789 的賬戶 lisi

查看 mysql 中的 user 表, 更夠發現 新建用戶的權限 全部爲N

新建用戶甚至 無法進入 emp 數據庫

授權命令

給已存在的用戶 授予 相應權限

GRANT語句可實現創建用戶同時授權或爲已存在的用戶授權
grant 權限名稱 on 數據庫.表名 to 用戶名@地址

創建用戶同時授權

grant 權限名稱 on 數據庫.表名 to 用戶名@地址 identified by 密碼
# 在創建用戶的同時授權

授權, 並指定 權限的可傳遞性

grant 權限名稱 on 數據庫.表名 to 用戶名@地址 with grant option
# with grant option 被授權的用戶, 擁有權限的傳遞功能

常用權限名稱

create
drop
insert
delete
select
update
alter
# 想要賦予多個權限 書寫多個權限名稱 使用 逗號 隔開
# 如果想要授予所有權限 可以使用 all
# 給emp數據庫的所有表 emp.*
# 給所有數據庫的所有表通配符表達式 *.* 

給’lisi’ 授權 可以查看 emp 數據庫的 emp 表

grant select on emp.emp to 'lisi'@'localhost';

給’lisi’ 授權 可以更改和刪除 emp 數據庫的 emp 表

grant update,delete,insert on emp.emp to 'lisi'@'localhost';

授予所有權限

grant all on *.* to 'lisi'@'localhost';

創建 ‘wangwu’ 用戶, 並授權

grant select on emp.emp to 'wangwu'@'%' identified by '123456';

撤銷授權命令

# revoke 跟 grant 的語法差不多,只需要把關鍵字 “to” 換成 “from” 即可:

撤銷 lisi的 刪除權限

revoke delete on emp.emp from 'lisi'@'localhost'

修改密碼

修改普通用戶密碼

# 修改當前用戶的密碼 PASSWORD() 是一個密碼加密函數 
SET PASSWORD = PASSWORD("123123"); 
#修改其他用戶密碼
SET PASSWORD  FOR `teacher`@`localhost`= PASSWORD("888888");        

修改root密碼 使用root 登錄

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '456456';

如果忘記了 root 密碼

參考網址 https://blog.csdn.net/greywolf0824/article/details/80215199

先停止MySQL服務

# 確認 命令行 處於  管理員狀態
C:\Users\Administrator>net stop MySQL57
MySQL57 服務正在停止.
MySQL57 服務已成功停止。

在這裏插入圖片描述

修改配置文件

找到目錄 C:\ProgramData\MySQL\MySQL Server 5.7 中的 my.ini 文件

[mysqld]
# 添加如下代碼
skip-grant-tables = true

重新啓動mysql 服務

net start MySQL57

直接登錄數據庫

mysql -u root  # 直接回車就可以進入到數據庫了。

執行命令修改密碼

# 已過時
# update mysql.user set password = password('123456') where user='root';
# Unknown column 'password' in 'field list'
# 需要使用 新字段 authentication_string
update mysql.user set authentication_string = password('123456') where user='root';

執行篩選權限的命令

flush privileges;

驗證密碼修改情況

驗證使用修改後的密碼登錄數據庫
在驗證新密碼是否成功之前,可以先將配置文件中新添加的跳過密碼驗證的參數去除,然後在重啓MySQL服務。
同樣可以使用命令來驗證,不使用密碼是能否登錄數據庫。
最後使用新密碼來登錄數據庫,可以成功。

刪除用戶

drop user 'zhangsan'@'localhost';

數據庫設計

三大範式

第一範式: 每列都是不可再分的最小數據單元
第二範式: 要求每個表只描述一件事情 
第三範式: 除了主鍵以外的其他列都直接依賴於主鍵列 

表與表之間的關係

一對一

一夫一妻制
丈夫 一張表
妻子 一張表
數據的對用關係 一對一
中國人 姓名 年齡 身份證號
身份證表  版本 身份證號 印發單位 有效時間
一個人只能有一張身份證, 一張身份證只能對應一個人

主從表

主表是可以單獨存在的

人 是可以脫離身份證單獨存在, 身份證不能脫離人存在
人是主表
身份證是從表

一對多 . 多對一

父親  
兒子
一個人只能有一個親生父親 
一個父親可以對應多個兒子
站在父親的角度 一對多
站在兒子的角度 多對一
員工和部門
一個員工只能屬於一個部門
一個部門可以有多個員工

一般情況下, '多’表指向 '一’表(每一個員工都有一個部門編號)

案例

一個部門有多個員工
部門表  一
員工表  多 
emp 表中 有一個字段 爲 deptno 指向了部門編號
假設 emp表中沒有 deptno 字段, 希望在dept 表中 添加字段指向emp表中的員工 該方式比較難實現

多對多

QQ 號  84204960  1874546874  2487644514 
QQ 會員 (紅鑽, 黃鑽 , 黑鑽 , 綠鑽, 藍鑽, 粉鑽)
 一個QQ號 可以開通多個 鑽業務
 一個鑽業務 可以被多個人開通
學生
課程表
一個學生可以 選多門課程
一門課程可以重複被多人選擇

學生課程表案例

CREATE DATABASE  IF NOT EXISTS `school`
USE `school`;
DROP TABLE IF EXISTS `subject`;

CREATE TABLE IF NOT EXISTS `subject` (
  `SubjectId` INT(11) NOT NULL AUTO_INCREMENT,
  `SubjectName` VARCHAR(20) NOT NULL,
  `ClassHour` INT(11) NOT NULL,
  `GradeId` INT(11) NOT NULL,
  PRIMARY KEY (`SubjectId`)
);


INSERT  INTO `subject`(`SubjectId`,`SubjectName`,`ClassHour`,`GradeId`) 
VALUES (1,'Java',78,1),(2,'OOP',40,2),(3,'Struts2',60,3),(4,'HTML',50,1),(5,'DataBase',90,2);


DROP TABLE IF EXISTS `student`;

CREATE TABLE IF NOT EXISTS `student` (
  `StudentNo` INT(11) NOT NULL,
  `LoginPwd` VARCHAR(20) NOT NULL,
  `StudentName` VARCHAR(50) NOT NULL,
  `Sex` CHAR(2) NOT NULL,
  `GradeId` INT(11) NOT NULL,
  `Phone` VARCHAR(255) NOT NULL,
  `Address` VARCHAR(255) DEFAULT NULL,
  `BornDate` DATETIME DEFAULT NULL,
  `Email` VARCHAR(50) DEFAULT NULL,
  PRIMARY KEY (`StudentNo`)
);

INSERT  INTO `student`(`StudentNo`,`LoginPwd`,`StudentName`,`Sex`,`GradeId`,`Phone`,`Address`,`BornDate`,`Email`) 
VALUES (100001,'123456','王冬雪','男',1,'13618179368','王爺墳','1999-09-09 00:00:00','[email protected]'),
(100002,'123456','王春雪','男',2,'13555555555','英家墳','2009-09-04 00:00:00','[email protected]'),
(100003,'123456','王夏雪','男',3,'13444444444','八寶山','1989-09-19 00:00:00','[email protected]'),
(100004,'123456','王秋雪','男',1,'13333333333','公主墳','1899-09-29 00:00:00','[email protected]'),
(100005,'123456','王家訓','女',2,'13222222222','八王墳','1979-09-19 00:00:00','[email protected]'),
(100007,'123','李四','男',3,'13911585602','朝陽路','2014-01-01 00:00:00','[email protected]'),
(100008,'123456','盧浩','男',2,'13911585603','豐臺路','1990-01-01 00:00:00','[email protected]'),
(100009,'123456','王旭東','男',2,'13911585604','昌平區','1996-01-01 00:00:00','[email protected]'),
(100010,'123456','鄭環環','男',2,'13911585605','中關村','1997-01-01 00:00:00','[email protected]'),
(100011,'123456','王麗麗','女',1,'13911585606','順義區','1992-01-01 00:00:00','[email protected]'),
(100012,'123456','冤大頭','女',3,'13911585607','成府路','1993-01-01 00:00:00','[email protected]'),
(100013,'123456','冤小頭','女',1,'13911585608','中府村','1994-01-01 00:00:00','[email protected]'),
(100014,'123456','喬峯','男',1,'13911585609','成義區','2014-01-01 00:00:00','[email protected]'),
(100015,'123456','段譽','男',3,'13911585610','解臺區','2013-01-01 00:00:00','[email protected]'),
(100016,'123456','虛竹','男',1,'13911585611','豐陽區','2012-01-01 00:00:00','[email protected]'),
(117006,'456','張三','男',1,'13911585601','解放路','2013-01-18 00:00:00','[email protected]');

使用中間表專門維護兩表之間的關係

create table if not exists sub_stu(
	`SubjectId` INT(11) NOT NULL, # 課程編號
	`StudentNo` INT(11) ,# 學生編號
	primary key (`SubjectId`,`StudentNo`)
);
# 張三選課爲 java
insert into sub_stu values(1,117006);
# 張三也選擇了數據庫
insert into sub_stu values(5,117006);
# 段譽選課爲 database 
insert into sub_stu values(5,100015);

查詢張三 選擇的課程是

# 三表聯查
select sub.SubjectName
from subject sub 
	join sub_stu ss on sub.SubjectId = ss.SubjectId
	join student stu on ss.StudentNo = stu.StudentNo
where stu.StudentName = '張三'

查詢選擇數據庫課程的學生有哪些

select stu.StudentName
from subject sub 
	join sub_stu ss on sub.SubjectId = ss.SubjectId
	join student stu on ss.StudentNo = stu.StudentNo
where sub.SubjectName = 'database'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章