MySQL我的學習筆記

目錄:mysql

  數據庫的基本操做正則表達式

  建立、刪除用戶及受權sql

  數據庫字符校對集數據庫

  建立、刪除數據庫和表安全

  DML操做服務器

  DDL操做session

  索引併發

  事務ide

 

1、數據庫的基本操做函數

-- 選擇要操做的數據庫
-- world:數據庫名
use world;

-- 顯示已存在的數據庫列表
show databases;

-- 顯示指定數據庫下的表的信息
show tables;

-- 顯示指定表的列的信息
-- world.country:數據庫名.表名
show columns from world.country;

-- 顯示指定表的索引信息
-- world.country:數據庫名.表名
show index from world.country;

-- 顯示指定數據庫下的表的詳細信息
-- world:數據庫名
show table status from world;

-- 顯示指定數據庫下的表名稱以字母'c'開頭的表的詳細信息
-- world:數據庫名
show table status from world like 'c%';

-- 顯示數據庫表的結構,如:字段名,字段類型等
-- world.country:數據庫名.表名
describe world.country;

-- 查看建立表的SQL語句
-- demo.test:數據庫名.表名
show create table demo.test;

-- 查看建立存儲過程的SQL語句
-- demo.test_proc:數據庫名.存儲過程名
show create procedure demo.test_proc;

-- 查看建立視圖的SQL語句
-- demo.test_view:數據庫名.視圖名
show create view demo.test_view;

-- 查看建立函數的SQL語句
-- demo.test_fun:數據庫名.函數名
show create function demo.test_fun;

-- 查看當前用戶的數據庫權限
show grants;

-- 查看指定用戶的數據庫權限
-- admin@localhost:用戶名@訪問主機
show grants for 'admin'@'localhost';        

-- 查詢數據庫用戶信息
select * from mysql.user;

-- 獲取服務器版本信息
SELECT VERSION();

-- 獲取當前數據庫名 (或者返回空)
SELECT DATABASE();

-- 獲取當前用戶名
SELECT USER();

-- 獲取服務器狀態
SHOW STATUS;

-- 獲取服務器配置變量
SHOW VARIABLES;
例如:
-- 查詢自增加值的步長,即每次增長多少,默認爲1。
show variables like '%auto_increment%';
-- 設置自增加值每次增長的數值,會影響全部數據表。
set auto_increment_increment=3;
-- 設置自增加值的起始值,會影響全部數據表。
set auto_increment_offset=100;

-- mysql運行在安全模式下時,非主鍵條件下是沒法執行update或者delete命令的
-- 查看安全模式狀態
show variables like '%sql_safe_updates%';
-- 設置安全模式爲關閉
set sql_safe_updates=off;

-- 獲取最近一次向具備identity屬性(即自增列)的表插入數據時對應的自增列的值,@@identity是系統定義的全局變量。
select @@identity;

-- LAST_INSERT_ID函數將返回當前鏈接自增列最新的 insert or update 操做生成的第一個記錄的ID。由於其基於Connection的,因此也是線程安全的。
select LAST_INSERT_ID();

 

2、建立、刪除用戶及受權

-- 建立一個新的用戶,並設置登陸密碼
-- test:用戶名;localhost:本地主機訪問(若是須要其餘任意主機訪問,請使用通配符'%');123456:用戶密碼;
create user 'test'@'localhost' identified by '123456';

-- 建立一個新的用戶,不指定登陸密碼,即不須要登陸密碼
create user 'test01'@'localhost';

-- 刪除指定的用戶
drop user 'test01'@'localhost';

-- 修改用戶名
-- test@localhost:要修改的用戶名和訪問主機
-- test@%:修改成的用戶名和訪問主機
rename user 'test'@'localhost' to 'test'@'%';

-- 修改用戶密碼
-- test@localhost:要修改的用戶名和訪問主機
-- 123456:新的用戶密碼
set password for 'test'@'localhost' = Password('123456');-- 授予指定用戶'test'對於'world'數據庫下'country'表的查詢權限
-- select:查詢權限;world.country:數據庫名.表名;'test'@'localhost':用戶名@訪問主機;
grant select on world.country to 'test'@'localhost';
-- 當即啓用修改(默認再次登陸纔會生效)
flush privileges;

-- 撤銷指定用戶'test'對於'world'數據庫下'country'表的查詢權限
-- select:查詢權限;world.country:數據庫名.表名;'test'@'localhost':用戶名@訪問主機;
revoke select on world.country from 'test'@'localhost';
-- 當即啓用修改(默認再次登陸纔會生效)
flush privileges;

-- 授予指定用戶'test'對於'world'數據庫下全部表的查詢、新增、修改、刪除權限
grant select,insert,update,delete on world.* to 'test'@'localhost';

-- 撤銷指定用戶'test'對於'world'數據庫下全部表的查詢、新增、修改、刪除權限
revoke select,insert,update,delete on world.* from 'test'@'localhost';

-- 授予指定用戶'test'對於'world'數據庫下全部表的表結構進行建立、修改、刪除權限
grant create,alter,drop on world.* to 'test'@'localhost';

-- 撤銷指定用戶'test'對於'world'數據庫下全部表的表結構進行建立、修改、刪除權限
revoke create,alter,drop on world.* from 'test'@'localhost';

-- 授予指定用戶'test'對於'world'數據庫下全部存儲過程的執行權限,而且該用戶有權限轉授予其餘用戶
grant execute on world.* to 'test'@'localhost' with grant option;

-- 撤銷指定用戶'test'對於'world'數據庫下全部存儲過程的執行權限,轉授予權限一併撤銷
revoke execute on world.* from 'test'@'localhost';

 

3、數據庫字符校對集

字符校對集,即排序規則,在某個字符集的狀況下,字符集的排列順序應該是什麼,稱之爲校對集。

-- 查看全部的字符校對集
-- 後綴爲_bin:表示基於二進制編碼的直接比較
-- 後綴爲_ci:表示對大小寫不敏感的比較
-- 後綴爲_cs:表示對大小寫敏感的比較
show collation;

 

4、建立、刪除數據庫和表

-- 建立一個名爲'test'的數據庫
create database test;

-- 建立一個名爲'test'的數據庫,若是該數據庫已存在則不建立,不然再建立
-- 並指定默認字符集爲'utf8',字符校對集爲'utf8_general_ci'
create database if not exists test default charset utf8 collate utf8_general_ci;

-- 刪除名爲'test'的數據庫
drop database test;


-- 建立一個名爲'Student'的數據表,若是該數據表已存在則不建立,不然再建立
-- engine:指定數據庫引擎爲'InnoDB'
-- auto_increment:指定自增列的起始值爲1
create table if not exists Student
(
    ID        int        not null    auto_increment,        #自動增加列
    StuNo    varchar(32)     not null,
    StuName    varchar(8)        not null,
    StuSex        varchar(8)        null,
    StuBirthday        tinyint     null,
    CreateTime        datetime     null,
    primary key (ID)    #指定主鍵列
)
engine=InnoDB auto_increment=1 default charset=utf8 collate=utf8_general_ci;

-- 刪除數據表 student,該操做會刪除全部數據包括表結構、視圖、索引、約束等。
drop table test.student;

-- 刪除數據表中的全部數據,該操做會刪除表中全部的數據,可是會保留表結構、視圖、索引、約束等。
truncate table test.student;


-- 建立一個臨時表,臨時表的建立與數據表的建立相似,只不過須要添加關鍵字 temporary。
-- 臨時表的做用域爲當前會話,即當前鏈接可見,當斷開當前鏈接時會自動銷燬,固然也能夠手動刪除,刪除方式與數據表同樣。
create temporary table Product
(
    ProName     varchar(32)     not null,
    Price        decimal(10,3)    not null     default 0.000
);

-- 複製指定數據表的表結構到建立的新表。
create table test.StudentBak like test.student;

-- 複製指定數據表的表結構及全部數據到建立的新表。
create table test.StudentBak select * from test.student;

 

5、DML操做

-- 向數據表中插入數據
insert into student(StuNo,StuName,StuSex,Stubirthday,CreateTime)
select 'A001','小張','',str_to_date('1988-06-09','%Y-%m-%d'),current_timestamp() union all 
select 'A002','小紅','',str_to_date('1990-08-10','%Y-%m-%d'),current_timestamp() 

-- 在插入重複的數據時,會直接跳太重複數據的插入。在有自增列或主鍵的數據表中不起做用,由於自增列和主鍵都具備惟一性。
insert ignore into test.student(stuno,stuname,stusex,stubirthday,createtime)
values ('A003','小魚','','1991-07-07',current_timestamp());


-- MySQL的WHERE子句默認是不區分大小寫的,若是須要區分大小寫,就要在字段前加上關鍵字 binary
select * from student where stuno='a001';    #'1', 'A001', '小張', '', '1988-06-09', '2018-01-12 12:17:00'
select * from student where binary stuno='a001';    #null


-- limit:用於設置返回的記錄數。
-- offset:用於設置select語句開始查詢的數據偏移量,默認爲零。
-- 表示只取前10條數據
select * from world.city limit 10;

-- 表示躍過5條,從第6條數據開始取10條數據。
select * from world.city limit 10 offset 5;

-- 表示從第10條開始取5條數據。
select * from world.city limit 10,5;


-- regexp:用於設置正則表達式匹配項,相似於模糊匹配like。
-- 表示查詢名稱以字符 'A'(不區分大小寫)開頭的記錄。
select * from world.city where Name regexp '^A';

-- 表示查詢名稱中包含字符串 'mer' 的記錄。
select * from world.city where Name regexp 'mer';

-- 表示查詢名稱以字符 'a' 或字符 'b' 開頭的記錄或者以字符 'r' 結尾的記錄。
select * from world.city where Name regexp '^[ab]|r$';

 

6、DDL操做

-- 向指定數據表添加一列,默認添加到數據表字段的末尾。
alter table test.student add column1 varchar(10) null;

-- 向指定數據表添加一列,並設置默認值爲:0
alter table demo.chinesecharinfo add column IsUseful tinyint unsigned not null default 0;

-- first關鍵字用於把添加的列設置爲第一列。
alter table test.student add column1 varchar(10) null first;

-- after關鍵字用於把添加的列設置在指定列的後面,StuSex爲指定列的列名。
alter table test.student add column1 varchar(10) null after StuSex;

-- 刪除指定列名的列,當數據表僅剩一個字段時,沒法進行刪除。
alter table test.student drop column1;

-- 修改指定列的數據類型,並設置該列位於指定列名的列以後。
alter table test.student modify column1 char(10) null after CreateTime;        -- 關鍵字column可省略
alter table test.student modify column column1 char(10) null after CreateTime;

-- 修改指定列的列名和數據類型,並設置該列位於指定列名的列以後。
-- column1:爲原列名
-- column2:爲新的列名
alter table test.student change column1 column2 varchar(10) null after CreateTime;

-- 修改指定列的默認值。
alter table test.student alter column2 set default '123';

-- 刪除指定列的默認值。
alter table test.student alter column2 drop default;

-- 修改數據表的存儲引擎。
alter table test.student engine = myisam;
alter table test.student engine = InnoDB;

-- 修改數據表的自增加值的起始值。
alter table test.student auto_increment=10;

-- 重建自增加列,當刪除數據過多,自增加列的值比較混亂時可使用,可是重建時若是有新的數據插入,有可能會出現混亂。
alter table test.student drop ID;
alter table test.student add ID int not null auto_increment first;
alter table test.student add primary key(ID);

-- 修改數據表的表名稱。
alter table test.student rename to test.StudentBak;

 

7、索引

-- 查看指定數據表的索引。
show index from test.student;

-- 刪除指定的索引。
drop index index_name on test.student;

-- 修改表結構的方式刪除索引。
alter table test.student drop index index_name;

-- 建立普通索引。
create index index_name on test.student(StuNo);

-- 修改表結構的方式添加索引,這種方式能夠不指定索引名稱,不指定系統會自動默認一個索引名稱。
alter table test.student add index index_name(StuNo);

-- 建立惟一索引,指定建立惟一索引的列的值必須是惟一的,不能重複,可是能夠爲null。
create unique index index_name on test.student(StuNo);

-- 修改表結構的方式添加惟一索引。
alter table test.student add unique index index_name(StuNo);

-- 修改表結構的方式添加主鍵,必須保證添加主鍵的列的值不能爲null,而且是惟一的,不可重複。
alter table test.student add primary key PrimaryKey_Name(ID);

-- 刪除指定數據表的主鍵,刪除主鍵時只需指定 primary key,刪除索引時必須指定索引名。
-- 注意:當主鍵列同時是自增加列時,不能直接刪除主鍵,須要先刪除自增加約束。
alter table test.student drop primary key;

-- 添加全文索引。
alter table test.student add fulltext index_name(StuNo);

-- 加上關鍵字ignore建立的惟一索引和主鍵,在插入重複數據時,會直接過濾掉重複數據,而且不會報錯,不然就會拋出錯誤。
alter ignore table test.student add primary key(ID);
alter ignore table test.student add unique index index_name(StuNo);

 

8、事務

-- 關閉自動提交事務
set autocommit=0;

-- 開啓自動提交事務,默認爲開啓。
set autocommit=1;

-- 顯式地開啓一個事務,有如下兩種方法。
start transaction;
begin;

-- commit用於提交事務,只有當自動提交事務被關閉時須要使用。
commit;

-- rollback用於回滾事務,撤銷對於數據庫所作的未提交的操做。
rollback;

-- 用於設置一個保存點,identifier是指保存點的名稱。
savepoint identifier;

-- 用於刪除一個保存點,若是指定的保存點不存在,將會拋出一個異常。
release savepoint identifier;

-- 把事務回滾到指定的保存點。
rollback to identifier;

-- 設置事務隔離級別,只對下一個事務有效。
set transaction isolation level {事務隔離級別};

-- 設置事務隔離級別,對當前會話的事務有效。
set session transaction isolation level {事務隔離級別};

-- 設置事務隔離級別,對後面創建MySQL鏈接的事務有效。
set global transaction isolation level {事務隔離級別};

-- 事務的隔離級別
read uncommitted(讀取未提交):
-- 該級別引起的問題是髒讀,會讀取到其餘事務未提交的數據。

read committed(讀取已提交):
-- 該級別引起的問題是不可重複讀,即設置爲該級別的事務只能讀取到其餘事務已經提交的數據,未提交的數據不能讀取,會形成屢次查詢的結果不一致。

repeatable read(可重複讀):
-- 該級別引起的問題是幻讀,即當用戶修改某一範圍內的數據行時,另外一個事務又在該範圍內插入了新的行,當用戶再次讀取該範圍內的數據時,會發現有新的數據行沒有被修改。
-- 該級別是MySQL數據庫默認的事務隔離級別。注意:該級別不會對事務查詢到的行加行鎖,也就是該事務查詢到的行,其餘事務依然能進行修改,可是能保證數據的一致性。

serializable(可串行化):
-- 該級別是MySQL中事務隔離級別最高的,該級別會鎖住事務中操做的整張表,所以不會出現以上三個級別的問題。可是這種隔離級別併發性極地,開發中不多會用到。
相關文章
相關標籤/搜索