MySQL資料庫管理 資料庫-->數據表-->行(記錄):用來描述一個對象的信息 列(欄位):用來描述對象的一個屬性 常用的數據類型: int :整型 無符號[0,2^32-1],有符號[-2^31,2^31-1] float :單精度浮點 4位元組32位 double :雙精度浮點 8位元組64位 c ...
資料庫-->數據表-->行(記錄):用來描述一個對象的信息 列(欄位):用來描述對象的一個屬性
常用的數據類型:
int :整型 無符號[0,2^32-1],有符號[-2^31,2^31-1] float :單精度浮點 4位元組32位 double :雙精度浮點 8位元組64位 char :固定長度的字元類型 varchar :可變長度的字元類型 text :文本 image :圖片 decimal(5,2) :5個有效長度數字,小數點後面有2位
--------查看資料庫結構--------
1.查看當前伺服器中的資料庫
SHOW DATABASES; #大小寫不區分,分號“;”表示結束
USE 資料庫名;//選擇要查看的庫,進入該庫
SHOW TABLES;//顯示當前選擇的資料庫中的所有表
3.查看表的結構(欄位)
USE 資料庫名;
DESCRIBE [資料庫名.]表名;
可縮寫成:DESC 表名;
--------SQL語句--------
SQL語句用於維護管理資料庫,包括數據查詢、數據更新、訪問控制、對象管理等功能。
SQL語言分類: DDL:數據定義語言,用於創建資料庫對象,如庫、表、索引等 DML:數據操縱語言,用於對錶中的數據進行管理 DQL:數據查詢語言,用於從數據表中查找符合條件的數據記錄 DCL:數據控制語言,用於設置或者更改資料庫用戶或角色許可權
----創建及刪除資料庫和表----
1.創建新的資料庫
CREATE DATABASE 資料庫名;
2.創建新的表
CREATE TABLE 表名 (欄位1 數據類型,欄位2 數據類型[,...][,PRIMARY KEY (主鍵名)]);
#主鍵一般選擇能代表唯一性的欄位不允許取空值(NULL),一個表只能有一個主鍵。
例:
CREATE DATABASE fsj;
USE fsj;
create table fsj01 (id int NOT NULL,name char(10) NOT NULL,score decimal(5,2),passwd char(48) DEFAULT '',PRIMARY KEY (id));
#用於在資料庫中創建一個名為"fsj01"的表格。
"id"欄位,類型為整數(int),不能為空(NOT NULL)。
"name"欄位,類型為字元型(char),長度為10個字元,不能為空(NOT NULL)。
"score"欄位,類型為十進位數(decimal),總長度為5位,其中有2位小數。
"passwd"欄位,類型為字元型(char),長度為48個字元,預設值為空字元串(‘’)。
"id"欄位被定義為主鍵(PRIMARY KEY),用於唯一標識每一行數據。
DESC fsj01;//查看該表結構
3.刪除指定的數據表
DROP TABLE [資料庫名.]表名; #如不用USE進入庫中,則需加上資料庫名
4.刪除指定的資料庫
DROP DATABASE 資料庫名;
----管理表中的數據記錄----
1.向數據表中插入新的數據記錄
INSERT INTO 表名(欄位1,欄位2[,...]) VALUES(欄位1的值,欄位2的值,...);
例:
INSERT INTO fsj01(id,name,score,passwd) values(1,'zhangsan',70.5,PASSWORD('123456'));
#PASSWORD('123456'):查詢數據記錄時,密碼字串以加密形式顯示;若不使用PASSWORD(),查詢時以明文顯示。
INSERT INTO fsj01 VALUES(2,'lisi',90.5,123456);
SELECT * FROM fsj01; #查詢表的數據記錄
將會返回"fsj01"表中的所有行和所有列的數據。符號 “*” 表示選擇所有的列。
2.查詢數據記錄
SELECT 欄位名1,欄位名2[,...] FROM 表名 [WHERE 條件表達式];
例:
SELECT * FROM fsj01;
SELECT id,name,score FROM fsj01 WHERE id=2;
select name from fsj01\G #以列表方式豎向顯示
select * from fsj01 limit 2; #只顯示頭2行
select * from fsj01 limit 2,3; #顯示第2行後的前3行
3.修改、更新數據表中的數據記錄
UPDATE 表名 SET 欄位名1=欄位值1[,欄位名2=欄位值2] [WHERE 條件表達式];
例:
UPDATE fsj01 SET passwd=PASSWORD('') WHERE name='zhangsan';
UPDATE fsj01 SET name='wangxiaoer',passwd='' WHERE id=3;
4.在數據表中刪除指定的數據記錄
DELETE FROM 表名 [WHERE 條件表達式];
例:
DELETE FROM fsj01 WHERE id=4;
----修改表名和表結構----
1.修改表名
ALTER TABLE 舊表名 RENAME 新表名;
例:
ALTER TABLE fsj01 RENAME ylc;
ALTER TABLE ylc RENAME fsj;
2.擴展表結構(增加欄位)
ALTER TABLE 表名 ADD address varchar(50) default '地址不詳';
#default '地址不詳':表示此欄位設置預設值 地址不詳;可與 NOT NULL 配合使用
3.修改欄位(列)名,添加唯一鍵
唯一鍵唯一但是可以為空值
ALTER TABLE 表名 CHANGE 舊列名 新列名 數據類型 [unique key];
**例:**
ALTER TABLE ylc CHANGE name user_name varchar(10) unique key;
#CHANGE可修改欄位名、數據類型、約束等所有項。
4.刪除欄位
ALTER TABLE 表名 DROP 欄位名;
例:
ALTER TABLE ylc DROP passwd;
案例擴展:
use fsj;
create table if not exists info ( #如果有info表就不執行,沒有info表自動創建
id int(4) zerofill primary key auto_increment, zerofill用零填充0001 primary key #指定主鍵的第二種方式auto_increment 自增長欄位不指定每次自增一
name varchar(10) not null default '匿名',
cardid int(18) not null unique key);
hobby varchar(50));
**#if not exists:**表示檢測要創建的表是否已存在,如果不存在就繼續創建
**#int(4) zerofill:**表示若數值不滿4位數,則前面用“0”填充,例0001
**#auto_increment:**表示此欄位為自增長欄位,即每條記錄自動遞增1,預設從1開始遞增;自增長欄位數據不可以重覆;自增長欄位必須是主鍵;如添加的記錄數據沒有指定此欄位的值且添加失敗也會自動遞增一次
**#unique key:**表示此欄位唯一鍵約束,此欄位數據不可以重覆;一張表中只能有一個主鍵, 但是一張表中可以有多個唯一鍵
#not null:表示此欄位不允許為NULL
----數據表高級操作----
1.克隆表,將數據表的數據記錄生成到新的表中
方法一:
create table test01 like ylc; #通過 LIKE 方法,複製 ylc 表結構生成 test01 表
insert into test01 select * from ylc;
#此方法能保證 新表的表結構、表數據 跟舊表都是一致的
方法二:
CREATE TABLE test02 (SELECT * from ylc);
#此方法創建的新表的表數據和舊表是一樣的,但可能會出現新表的表結構和舊表的不一致
show create table test02\G #獲取數據表的表結構、索引等信息
SELECT * from test02;
2.清空表,刪除表內的所有數據 方法一:
delete from test02;
#DELETE清空表後,返回的結果內有刪除的記錄條目;DELETE工作時是一行一行的刪除記錄數據的;如果表中有自增長欄位,使用DELETE FROM 刪除所有記錄後,再次新添加的記錄會從原來最大的記錄 ID 後面繼續自增寫入記錄。
方法二:
truncate table test01;
#TRUNCATE 清空表後,沒有返回被刪除的條目;TRUNCATE 工作時是將表結構按原樣重新建立,因此在速度上 TRUNCATE 會比 DELETE 清空表快;使用 TRUNCATE TABLE 清空表內數據後,ID 會從 1 開始重新記錄。
3.創建臨時表 臨時表創建成功之後,使用SHOW TABLES命令是看不到創建的臨時表的,臨時表會在連接退出後被銷毀。 如果在退出連接之前,也可以可執行增刪改查等操作,比如使用 DROP TABLE 語句手動直接刪除臨時表。
CREATE TEMPORARY TABLE 表名 (欄位1 數據類型,欄位2 數據類型[,...][,PRIMARY KEY (主鍵名)]);
例:
create temporary table test03 (
id int(4) zerofill primary key auto_increment,
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar(50));
insert into test03 values(1,'zhangsan',123456,'running');
select * from test03;
show tables;
quit
select * from test03;
4.創建外鍵約束,保證數據的完整性和一致性。
外鍵的定義:如果同一個屬性欄位X在表一中是主鍵,而在表二中不是主鍵,則欄位X稱為表二的外鍵。
主鍵表和外鍵表的理解: (1)以公共關鍵字作主鍵的表為主鍵表(父表、主表) (2)以公共關鍵字作外鍵的表為外鍵表(從表、外表)
註意:與外鍵關聯的主表的欄位必須設置為主鍵。要求從表不能是臨時表,主從表的欄位具備相同的數據類型、字元長度和約束。
#創建主表 profession
create table profession (pid int(4),proname varchar(50));
#創建從表 student
create table student (id int(4) primary key auto_increment,name varchar(10),age int(3),proid int(4));
//ALTER TABLE 是用於在關係型資料庫中修改已存在的表結構的命令。通過 ALTER TABLE,可以添加、修改或刪除表的列、約束等。
#為主表 profession 添加一個主鍵約束。主鍵名建議以“PK_”開頭。
alter table profession add constraint PK_pid primary key (pid);
#為從表 student 表添加外鍵,並將 student 表的 proid 欄位和 profession 表的 pid 欄位建立外鍵關聯。外鍵名建議以“FK_”開頭。
alter table student add constraint FK_pro foreign key (proid) references profession (pid);
desc student;
#插入新的數據記錄時,要先主表再從表
insert into profession values(1,'雲計算');
insert into profession values(2,'大數據');
insert into student values(1,'zhangsan',18,1);
insert into student values(2,'lisi',19,1);
insert into student values(3,'wangwu',20,2);
#刪數數據記錄時,要先從表再主表,也就是說刪除主鍵表的記錄時必須先刪除其他與之關聯的表中的記錄。
delete from student where proid=1;
delete from profession where pid=1;
#查看和刪除外鍵約束
show create table student;
desc student;
alter table student drop foreign key FK_pro;
alter table student drop key FK_pro;
MySQL中6種常見的約束:
主鍵約束(primary key) 外鍵約束(foreign key) 非空約束(not null) 唯一性約束(unique [key|index]) 預設值約束(default) 自增約束(auto_increment)
----資料庫用戶管理----
1.新建用戶
CREATE USER '用戶名'@'來源地址' [IDENTIFIED BY [PASSWORD] '密碼'];
'用戶名':指定將創建的用戶名 '來源地址':指定新創建的用戶可在哪些主機上登錄,可使用IP地址、網段、主機名的形式,本地用戶可用localhost,允許任意主機登錄可用通配符% '密碼':若使用明文密碼,直接輸入'密碼',插入到資料庫時由Mysql自動加密; 若使用加密密碼,需要先使用SELECT PASSWORD('密碼'); 獲取密文,再在語句中添加 PASSWORD '密文';
若省略“IDENTIFIED BY”部分,則用戶的密碼將為空(不建議使用)
CREATE USER 'user1'@'localhost' IDENTIFIED BY '123456';
SELECT PASSWORD('abc123');
CREATE USER 'user2'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
2.查看用戶信息
#創建後的用戶保存在 mysql 資料庫的 user 表裡
USE mysql;
SELECT User,authentication_string,Host from mysql.user;
#這將返回用戶表中的用戶名,密碼和主機信息,其中 mysql.user 是存儲用戶信息的表。
#查看當前登錄用戶
select user();
3.重命名用戶
RENAME USER 'zhangsan'@'localhost' TO 'lisi'@'localhost';
4.刪除用戶
DROP USER 'lisi'@'localhost';
5.修改當前登錄用戶密碼
SET PASSWORD = PASSWORD('abc123');
6.修改其他用戶密碼
SET PASSWORD FOR 'user1'@'localhost' = PASSWORD('abc123');
7.忘記 root 密碼的解決辦法
(1)修改 /etc/my.cnf 配置文件,不使用密碼直接登錄到
mysql
vim /etc/my.cnf
[mysqld]
skip-grant-tables #添加,使登錄mysql不使用授權表
systemctl restart mysqld
mysql #直接登錄
(2)使用 update 修改 root 密碼,刷新資料庫
UPDATE mysql.user SET AUTHENTICATION_STRING = PASSWORD('abc123') where user='root';
FLUSH PRIVILEGES;
quit
mysql -u root -pabc123
註意:最後再把 /etc/my.cnf 配置文件里的 skip-grant-tables 刪除,並重啟 mysql 服務。
----資料庫用戶授權----
1.授予許可權 GRANT語句:專門用來設置資料庫用戶的訪問許可權。當指定的用戶名不存在時,GRANT語句將會創建新的用戶;當指定的用戶名存在時, GRANT 語句用於修改用戶信息。
GRANT 許可權列表 ON 資料庫名.表名 TO '用戶名'@'來源地址' [IDENTIFIED BY '密碼'];
#許可權列表:用於列出授權使用的各種資料庫操作,以逗號進行分隔,如“select,insert,update”。使用“all”表示所有許可權,可授權執行任何操作。 #資料庫名.表名:用於指定授權操作的資料庫和表的名稱,其中可以使用通配符“”。例如,使用“kgc.”表示授權操作的對象為 kgc資料庫中的所有表。 #'用戶名@來源地址':用於指定用戶名稱和允許訪問的客戶機地址,即誰能連接、能從哪裡連接。來源地址可以是功能變數名稱、IP地址,還可以使用“%”通配符,表示某個區域或網段內的所有地址,如“%.kgc.com”、“192.168.80.%”等。
#IDENTIFIED BY:用於設置用戶連接資料庫時所使用的密碼字元串。在新建用戶時,若省略“IDENTIFIED BY”部分,則用戶的密碼將為空。
例子:
#允許用戶 zhangsan 在本地查詢 kgc 資料庫中 所有表的數據記錄,但禁止查詢其他資料庫中的表的記錄。
GRANT select ON fsj.* TO 'zhangsan'@'localhost' IDENTIFIED BY '123456';
#允許用戶 lisi 在所有終端遠程連接 mysql ,並擁有所有許可權。
GRANT ALL [PRIVILEGES] ON *.* TO 'lisi'@'%' IDENTIFIED BY '123456';
flush privileges;
quit
mysql -u zhangsan -p123456
use fsj;
show tables;
select * from ylc;
2.查看許可權
SHOW GRANTS FOR 用戶名@來源地址;
例:
SHOW GRANTS FOR 'lisi'@'%';
3.撤銷許可權
REVOKE 許可權列表 ON 資料庫名.表名 FROM 用戶名@來源地址;
例:
REVOKE ALL ON *.* FROM 'lisi'@'%';
SHOW GRANTS FOR 'lisi'@'%';
#USAGE許可權只能用於資料庫登陸,不能執行任何操作;USAGE許可權不能被回收,即 REVOKE 不能刪除用戶。
flush privileges;