數據庫學習之Mysql

今天整理的是自己平時使用Mysql數據庫中常用的Mysql的命令,分爲基礎和加強兩部分,有些需要注意的地方我加粗加黑了字體和標記了醒目的顏色。

基礎部分

一、數據庫管理

1.查詢所有數據庫
show databases;
--information_schema mysql元數據,基礎數據
--mysql mysql配置數據庫,其中包含用戶信息。(用戶名和密碼,權限管理)
--performance_schema mysql數據庫軟件的運行數據,日誌信息,性能數據
--test 測試數據庫,空的
2.創建數據庫
create database 數據庫名
default character set utf8; --指定默認字符集
3.查看數據庫默認字符集
show create database 數據庫名
4.刪除數據庫
drop database 數據庫名
5.修改數據庫
alter database 數據庫名 default character set 字符集類別

二、表管理

1.查看所有的表
先選擇數據庫
select 數據庫名
show tables
2.創建表
create table 表名(
字段 字段類型,
字段 字段類型
);
3. 查看錶結構
desc 表名
4.刪除表
drop table 表名
5.修改表
--添加字段
alter table 表名 add column 字段 字段類型
--刪除字段
alter table 表名 drop column 字段
--修改字段類型
alter table 表名 modify column 字段 新字段類型
--修改字段名稱
alter table 表名 change column 舊字段 新字段 新字段類型
--修改表名稱
alter table 表名 rename to 新表名

三、增刪改數據

1.增加數據
--插入所有字段,一定要依次按順序插入
insert into 表名 values(字段1值,字段2值)
--插入部分字段
insert into 表名(字段1) values(字段1值)
2.修改數據
--修改所有數據
update 表名 set 字段名=字段值
--帶條件的修改
update 表名 set 字段名=字段值 where 字段名=條件值
3.刪除數據
--刪除所有數據
delete from 表名
--帶條件刪除
delete from 表名 where 字段名=條件值
delete from 可以全表刪除 可以帶條件刪除 只能刪除表的數據,不能刪除表的約束 刪除的數據可以回滾(事務)
truncate table 表名 可以全表刪除 不可以帶條件刪除 既可以刪除表的數據,也可以刪除表的約束 刪除的數據不可以回滾

四、查詢數據

1.查詢所有列
select * from 表名
2.查詢指定列
select 字段名1,字段名2 from 表名
3.查詢時添加常量列
select 字段名1,字段名2 新加列內容 as 新加列名 from 表名
4.查詢時合併列
select (字段1+字段2) as 別名 from 表名
--合併列只能合併數值類型的字段
5.查詢時去除重複記錄
select distinct 字段名 from 表名
--或者 select distinct(字段名) from 表名
6.條件查詢
--邏輯條件
and or
--比較條件
> < >= <= = <>(不等於) between and(包前包後) (>= <=)
--判空條件
null 空字符串
is null is not null =' ' <>' '
--null表示沒有值
--空字符串是有值的
--模糊條件
like
--%任意個字符
--_ 一個字符
聚合查詢
--聚合函數
sum() avg() max() min() count()
--count()函數統計的數量不包含null的數據
分頁查詢
--limit 起始行,查詢幾行
分頁查詢當前頁數據的sql -->select * from 表名 limit (當前頁-1)*每頁顯示多少條,每頁顯示多少條
查詢排序
order by 字段名 asc/desc
--asc:順序,正序 數值:遞增 字母:a-z
--desc:和asc相反
分組查詢
group by
分組查詢後篩選
having

加強部分

一、數據約束

1.默認值
default 默認值
2.非空
not null
--非空字符必須賦值且不能賦null
3.唯一
--unique
--可插入null且可以插入多個null
4.主鍵
primary key
--非空+唯一
5.自增長
auto_increment
6.外鍵
主表
create table 表名1(
字段1 字段類型 primary key,
字段2 字段類型
)
副表/從表
create table 表名2(
字段3 字段類型 primary key,
字段4 字段類型,
constraint 外鍵名稱 foreign key(字段3) peferences 表名1(字段1)
^
|
外鍵
)
--注意
1)被約束的表稱爲副表,約束別人的表稱爲主表,外鍵設置在副表上的!!!
2)主表的參考字段通用爲主鍵!
3)添加數據: 先添加主表,再添加副表
4)修改數據: 先修改副表,再修改主表
5)刪除數據: 先刪除副表,再刪除主表
級聯操作
級聯修改 on update cascade
級聯刪除 on delete cascade
注意: 級聯操作必須在外鍵基礎上使用
三大範式
**************************************
第一範式: 要求表的每個字段必須是不可分割的獨立單元
                                                                 student     :   name              -- 違反第一範式
                                                                                               張小名|狗娃                                            
                                                                 sutdent    : name    old_name    --符合第一範式
                                                                                             張小名    狗娃
 
                   第二範式: 在第一範式的基礎上,要求每張表只表達一個意思。表的每個字段都和表的主鍵有依賴
                                              
                                               employee(員工): 員工編號  員工姓名 部門名稱   訂單名稱  --違反第二範式
 
                                               員工表:員工編號  員工姓名 部門名稱  
 
                                               訂單表:  訂單編號  訂單名稱             -- 符合第二範式
                                                    
                   第三範式: 在第二範式基礎,要求每張表的主鍵之外的其他字段都只能和主鍵有直接決定依賴關係
 
                                               員工表: 員工編號(主鍵) 員工姓名  部門編號  部門名 --符合第二範式,違反第三範式                                                                                                                                                       (數據冗餘高)
 
                                               員工表:員工編號(主鍵) 員工姓名  部門編號    --符合第三範式(降低數據冗餘)
                                               部門表:部門編號  部門名
*******************************************************************
多表查詢規則:1)確定查詢哪些表   2)確定哪些哪些字段   3)表與表之間連接條件 (規律:連接條件數量是表數量-1)
--內連接查詢
select 字段1,字段2 from 表1 inner join 表2 on 表1.字段 = 表2.字段
或者 select 字段1,字段2 from 表1,表2 where 表1.字段 = 表2.字段
--左外連接查詢:使用左邊表的數據去匹配右邊表的數據,如果符合連接條件的結果則顯示,如果不符合連接條件則顯示null
left outer join on
--右外連接查詢:使用右邊表的數據去匹配左邊表的數據,如果符合連接條件的結果則顯示,如果不符合連接條件則顯示null
right outer join on

二、存儲過程

--1)執行效率非常快!存儲過程是在數據庫的服務器端執行的!!!
    2)移植性很差!不同數據庫的存儲過程是不能移植。

-- 創建存儲過程
DELIMITER $       -- 聲明存儲過程的結束符
CREATE PROCEDURE pro_test()           --存儲過程名稱(參數列表)
BEGIN             -- 開始
         -- 可以寫多個sql語句;          -- sql語句+流程控制
         SELECT * FROM 表名;
END $            -- 結束 結束符
 
-- 執行存儲過程
CALL pro_test();          -- CALL 存儲過程名稱(參數);
 
參數:
IN:   表示輸入參數,可以攜帶數據帶存儲過程中
OUT: 表示輸出參數,可以從存儲過程中返回結果
INOUT: 表示輸入輸出參數,既可以輸入功能,也可以輸出功能

*************************
--  全局變量(內置變量):mysql數據庫內置的變量 (所有連接都起作用)
        -- 查看所有全局變量: show variables
        -- 查看某個全局變量: select @@變量名
        -- 修改全局變量: set 變量名=新值
        -- character_set_client: mysql服務器的接收數據的編碼
        -- character_set_results:mysql服務器輸出數據的編碼
       
--  會話變量: 只存在於當前客戶端與數據庫服務器端的一次連接當中。如果連接斷開,那麼會話變量全部丟失!
        -- 定義會話變量: set @變量=值
        -- 查看會話變量: select @變量
       
-- 局部變量: 在存儲過程中使用的變量就叫局部變量。只要存儲過程執行完畢,局部變量就丟失!!
三、觸發器
-- 需求: 當向員工表插入一條記錄時,希望mysql自動同時往日誌表插入數據
-- 創建觸發器(添加)
CREATE TRIGGER tri_empAdd AFTER INSERT ON employee FOR EACH ROW    -- 當往員工表插入一條記錄時
     INSERT INTO test_log(content) VALUES('員工表插入了一條記錄');
    
-- 插入數據
INSERT INTO employee(id,empName,deptId) VALUES(7,'扎古斯',1);
INSERT INTO employee(id,empName,deptId) VALUES(8,'扎古斯2',1);
 
-- 創建觸發器(修改)
CREATE TRIGGER tri_empUpd AFTER UPDATE ON employee FOR EACH ROW    -- 當往員工表修改一條記錄時
     INSERT INTO test_log(content) VALUES('員工表修改了一條記錄');
    
-- 修改
 UPDATE employee SET empName='eric' WHERE id=7;
 
-- 創建觸發器(刪除)
CREATE TRIGGER tri_empDel AFTER DELETE ON employee FOR EACH ROW    -- 當往員工表刪除一條記錄時
     INSERT INTO test_log(content) VALUES('員工表刪除了一條記錄');
 
-- 刪除
 DELETE FROM employee WHERE id=7;

四、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 SELECT ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';
GRANT DELETE ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章