Mysql 基本操作與權限機制
MySQL是一種關係數據庫管理系統,關係數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。
SQL 語言主要用於存取數據,查詢數據。更新數據和管理關係數據庫系統。
- DDL語句 數據庫定義語言: 數據庫、表、識圖、索引、存儲過程。
- DML語句 數據庫操縱語言:插入數據 INSERT 、刪除數據庫DELETE、更新數據庫UPDATE
- DCL語句 數據庫控制語言: 如控制用戶的訪問權限GRANT、REVOKE
- DQL語句 數據庫查詢語言: 查詢數據SELECT
安裝
rpm -ivh
yum makecahe //刷新yum庫
md5sum 包名 //檢查完整性
yum list | grep mysql-community-server //安裝mysql-server
yum list -y
查看密碼
# grep 'password' /var/log/mysqld.log
登錄
# mysql -uroot -p‘密碼’
名詞解釋
數據庫: 表的管理單元
表:記錄的管理單元
記錄:字段的管理單元
字段(列):字段名,字段類型(長度),字段約束組成
類型:字符,數字,日期
約束:不能爲空,自動增長
庫操作
系統數據庫
information_schema
虛擬庫,主要存儲了系統中的一些數據庫對象的信息,例如用戶表信息、列信息、權限信息、字符信息等
performance_schema
主要存儲數據庫服務器的性能參數。
mysql
授權庫,主要存儲系統用戶的權限信息
sys
主要存儲數據庫服務器性能參數
創建數據庫
mysql> create database db2;
數據庫命名規則
- 區分大小寫
- 唯一性
- 不能使用關鍵字 create select
- 不能單獨使用數字
查看數據庫
mysql> show databases;
mysql> show create database wing;
查看所在庫
mysql> select database();
切換數據庫
mysql> use wing;
刪除數據庫
mysql> drop database 數據庫名;
表操作
數據類型(常見)
數值類型
整數類型INT
- int 正常大小整數
- tinyint 0 -255 大小的整形數據
浮點整數型float
定點數類型 decimal
二進制bit類型測試
字符串類型
varchar
列中的值爲可變長字符串,長度,0~65535
char
列的長度固定爲創建表時聲明長度,0~255
BLOB 特殊符號
枚舉和集合
enum 枚舉類型 (單選)
只能在給定範圍內選擇一個值
set 集合類型 (多選)
在給定範圍內可以選擇一個或一個以上的值
時間和日期類型
- date
- time
- datetime
- timestamp
- year
表完整性約束
PRIMARY KEY (PK)
標識該字段爲該表的主鍵,可以唯一的標識記錄,不可以爲空 UNIQUE + NOT NULL
FOREIGN KEY (FK)
標識該字段爲該表的外鍵,實現表與表(父表主鍵/子表1外鍵/子表2外鍵)之間的關聯
NOT NULL
標識該字段不能爲空
UNIQUE KEY (UK)
標識該字段的值是唯一的,可以爲空,一個表中可以有多個UNIQUE KEY
AUTO_INCREMENT
標識該字段的值自動增長(整數類型,而且爲主鍵)
DEFAULT
爲該字段設置默認值
UNSIGNED
無符號,正數
ZEROFILL
使用0填充,例如0000001
基礎操作
表示數據庫存儲數據的基本單位,由若干個字段組成,主要用來存儲數據記錄。
使用編輯器編輯指令
mysql> edit
mysql> \e
命令行操作數據庫
^注:在腳本使用
# mysql -u root -p1 -e "use db2;create table t3(name char(20),pass char(100));insert into t3 set name='wing',pass=password('123')"
在mysql客戶端內執行系統命令
mysql> system ls
mysql> \! ls
表數據操作
數據操作
語法
create table 表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件])[存儲引擎 字符集];
# 在同一張表中,字段是不能相同
# 寬度和約束條件可選
# 字段名和類型必須寫
mysql> CREATE DATABASE school; //創建數據庫school
mysql> use school;
mysql> create table student1(
-> id int,
-> name varchar(50),
-> sex enum('m','f'),
-> age int
-> );
查看錶
mysql> show tables;
查看錶結構
mysql> desc school;
表中插入內容
mysql> insert into 表名(字段1,字段2...)values(字段值列表...);
# 指定字段插入
mysql> inser into 表名 values(順序插入);
查看所有表中所有字段的值
mysql> select * from 表名;
查看錶中指定字段的值
mysql> select 字段名 from hello;
更新數據
語法
語法:
UPDATE 表名 SET
字段1=值1,
字段2=值2,
WHERE CONDITION;
示例
mysql> update hello set name="hai" where id=12;
更改的地方 條件
# 條件用來定位
修改表
修改表名
alter table 表名 rename 新表名;
添加字段
1.默認追加到最後
alter table 表名 add 字段名 數據類型 約束條件 ;
2.追加到開頭
alter table 表名 add 字段名 數據類型 約束條件 first;
3.追加到某個字段之後
alter table 表名 add 字段名 數據類型 約束條件 after 舊字段名;
修改字段
1.修改數據類型
alter table 表名 modify 字段名 數據類型 完整性約束條件;
2.修改字段名和數據類型
alter table 表名 change 舊字段 新字段 新數據類型 完整性約束;
刪除字段
alter table 表名 drop 字段名;
複製表
複製表結構和記錄
^注:不會複製:主鍵、外鍵、索引
cretae table 新表名 select * from 舊錶名;
複製表結構
^包括key
create tabe 新表名 like 舊錶名;
刪除表
drop table 表名;
刪除表數據
delete from 表名 where 字段名=內容;
單表查詢
基本查詢
簡單查詢
select * from 表名;
select 字段名,字段名 from 表名;
四則運算查詢
select 字段名+運算 from 表名;
定義顯示格式
select concat(字段名,字段名) from 表名;
單條件查詢
select * from 表名 where 字段名=內容;
多條件查詢
select * from 表名 where 字段名+條件 and 字段名+條件;
or
關鍵字查詢
select * from 表名 where not 字段名+條件;
select * from 表名 where 字段名 is null;
select * from 表名 where 字段名 in/no in (條件);
關鍵字like 模糊查詢
1.通配符 % 代表一個或多個
select * from 表名 where 字段名 like ‘xx%’
2.通配符 _ 每一個代表一個字節
select * from 表名 where 字段名 like ‘xx_’
# 注意 一定要用單引號。
查詢排序
單列排序
1.按從小到大
select * from 表名 where order by 字段名; //默認從到大
select * from 表名 where order by 字段名 asc //從小到大
2.按從大到小
select * from 表名 where order by 字段名 desc;
按多列排序
select * from 表名 order by 字段名 asc/desc ,字段名 asc/desc;
限制查詢的記錄數
select * from 表名 order by 字段名 desc limit 5; //顯示5條
select * from 表名 order by 字段名 desc limit 0,5 //0條到第5條
使用正則表達式查詢
select * from 表名 where 字段名 regep '內容'
多表查詢
交叉連接
生成笛卡爾積,它不使用任何匹配條件
內連接
只連接匹配的行
- where
select 表1.字段1,表1.字段2,表2.字段1,表2.字段2 from 表1,表2 where 表1.字段=字段
- inner join
select 表1.字段1,表1.字段2,表2.字段1,表2.字段2 from 表1 inner join 表2 on 字段=字段
外鏈接
- 左連接 (left):會顯示左邊表內所有的值,不論在右邊表內不匹配
select 表1.字段1,表1.字段2,表2.字段1,表2.字段2 from 表1 left join 表2
on 表1.字段1=表2.字段2;
- 右連接(right) :會顯示右邊表內所有的值,不論在左邊表內不匹配
select 表1.字段1,表1.字段2,表2.字段1,表2.字段2 from 表1 right join 表2 on 表1.字段1=表2.字段2;
全外鏈接
包含左、右兩個表的全都行。
select * from 表1 full join 表2 on 表1.字段1=表2.字段2;
複合條件查詢
內連接查詢+條件;
子查詢
將一個查詢語句嵌套在另一個查詢語句中。
內層查詢語句的查詢結果,可以爲外層查詢語句提供查詢條件。
帶IN關鍵字的子查詢
select * from 表1 where 字段1 IN (select 字段1 from 表2);
權限機制
權限級別
- Global level 系統級,所有庫,所有表的權限
- database level 某個數據庫中所有的表的權限
- table level 庫中某個表的權限
- column level 表中某個字段的權限
- procs level 某個存儲過程的權限
- proxies level 代理服務器的權限
權限原理
語法格式
grant 權限列表 on 庫名.表名 to '用戶名'@'客戶端主機' [identified '密碼' with option參數]
權限列表
all:所有權限(不包括授權權限)
select.update 查詢更新
數據庫.表名
*.* 所有庫下的所有表 Global level
web.* web庫下的所有表 Database level
web.stu_info web庫下的stu_info表 Table level
客戶端主機
% 所有主機
192.168.2.% 192.168.2.0網段的所有主機
192.168.2.168 指定主機
localhost 本地主機
with_option參數
GRANT OPTION: 授權選項
MAX_QUERIES_PER_HOUR: 定義每小時允許執行的查詢數
MAX_UPDATES_PER_HOUR: 定義每小時允許執行的更新數
MAX_CONNECTIONS_PER_HOUR: 定義每小時可以建立的連接數
MAX_USER_CONNECTIONS: 定義單個用戶同時可以建立的連接數
權限應用的順序
user (Y|N) ==> db ==> tables_priv ==> columns_priv
查看權限表
Global level
select * from mysql.user\G;
Database level
select * from mysql.db\G;
Table level
select * from mysql.tables_priv\G;
Column level
select * from mysql.columns_priv\G;
前提是有庫,有表,有權限。
用戶管理
登錄和退出
# nysql -h IP -P 端口 -uroot -p‘密碼’ -e“sql語句”
-h 指定主機名 默認本機
-P 指定服務器端口 默認3306
-u 指定用戶名 默認root
-p 指定登錄密碼 默認空密碼
-e 接sql語句
創建用戶
create user
create user name@'localhost' identified by 'password';
grant … on … to
grant授權
grant all on *.* to 'name'@'localhost' identified by 'password';
| |---左庫 右表 |--本地或遠程
|---可換select insert 等
^注:在mysql8.0.11後grant授權需要先創建賬號再進行授權。
手動更新權限表的時候需要刷新權限
mysql> flush privileges;
刪除用戶
drop user 語句刪除
drop user 'name'@'localhost';
delete語句刪除
delete from mysql.user where user='name' and host='loacalhost';
修改密碼
修改自己的密碼
1.系統命令修改
# mysqladim -uroot -p'密碼' password '新密碼'
2.修改表
mysql> update mysql.user set authentication_string=password where user='root' and host='localhost';
3.mysql命令修改
mysql> set password=password('新密碼');
mysql> set password='新密碼'; #不同版本兩種方式
修改其他用戶的密碼
mysql> set password for achan@'loaclhost'=password('新密碼');
mysql> set password for achan@'loaclhost'='新密碼';
忘記root密碼
1.修改配置文件,使登錄mysql不需要密碼
2.登陸之後修改密碼,取消上一步操作
# vim /etc/my.cnf
[mysqld]
skip-grant-tables <---增加
# systemctl restart mysqld
# myslq -uroot
grant
賦予權限
grant all on *.* to admin1@'%' identified by '密碼';
回收權限
查看權限
1.查看自己的權限
show grants\G
2.查看別人的權限
SHOW GRANTS FOR admin1@'%'\G
回收權限revoke
revoke 權限列表 on 數據庫名 from 用戶名@客戶端主機;
revoke delete ON *.* from admin1@’%’; //回收部分權限
revoke all provo;eges on *.* from admin2@’%’; //回收所有權限
遠程登錄
創建賬戶
create user tom@'%' identified by 'password';
%包括127.0.0.1和localhost
遠程登錄
# mysql -utom -h IP -P 3307
端口
默認端口3306
端口號修改
# vim /etc/my.cnf
[mysqld]
prot=3307
本地登錄,端口號不生效,任何端口都可以,遠程登錄需使用改過的端口。