MySQL入門詳解(一)---mysql的語言


MySQL語言分為:DCL(數據庫控制語言)、DDL(數據庫定義語言)、DQL(數據庫查詢語言)、DML(數據庫操作語言),這一節我們先從mysql的語言開始。

DCL:數據庫控制語言,用來設置數據庫用戶或角色權限的語句,關鍵字grant revoke等

mysql -u 用戶名 -p 密碼 -h 服務器IP地址 -P服務器MySQL端口號 -D數據庫名

當客戶端連接到服務器是,MySQL訪問控制有兩個階段:連接驗證 對用戶名密碼,請求驗證 對權限驗證

默認表:MySQL安裝時自動創建一個名為mysql的數據庫,包含五個權限表:

user表包含用戶賬號密碼主機信息 (Host:賬號作用IP范圍,%-為不限制)

db表包含某用戶對數據庫訪問權限

table_priv表和columns_priv表包含表列級權限

procs_priv 表存儲函數和存儲過程權限

#創建新用戶賬戶
CREATE USER username@hostname IDENTIFIED BY 'password'
"%.baidu.com","%"/"-"
​
#查看用戶權限
SHOW GRANTS FOR username@hostname
​
#刪除用戶賬戶
DROP USER username@hostname[,username@hostname]
​
#添加權限
GRANT privilege[,privilege] ON privilege_level #指定一個或多個權限或'ALL' 在層級(表)
TO user [IDENTIFIED BY 'password'] #給某個用戶
[REQUIRE tsl_option] #安全的連接
[WITH [GRANT_OPTION | resource_option]] #是否可以被改掉(選可以)
//GRANT SELECT,UPDATE,INSERT ON alibaba.* TO rfc;
​
#允許遠程連接
grant all privileges on *.* to 'root@%' identified by '123456' with grant with grant option;
flush privileges; #刷新權限
​
#撤銷權限
REVOKE privilege_type [(colimn_list)] [,privilege_type [(colimn_list)]]
ON [object_type] privilege_level 
FROM user[,user]
​
#修改密碼
1.用SET PASSWORD命令:
登錄之后
set password for username@host = '123456'
2.用UPDATE編輯user表:
use mysql;
update user set password=password('123456') where user='user';
flush privileges;
3.用mysqladmin:
mysqladmin -u用戶名 -p舊密碼 password 新密碼
4.在忘記root密碼或初始化密碼時:
windows為例:
    關閉正在運行的MySQL服務
    打開DOS窗口,轉到mysql的bin目錄
    mysqld --skip-grant-tables  #此DOS窗口運行着跳過權限檢查啟動mysql的命令,8.0版本使用mysqld --console --skip-grant-tables --shared-memory
    再打開一個DOS窗口輸入mysql回車,use mysql;
    改密碼
    flush privileges;
    退出quit
    注銷系統
​
#數據庫備份
mysqldump -u[username] -p[password] [database_name] > [dump_file.sql]
mysqldump -u[username] -p[password] --no-date [database_name] > [dump_file.sql] #不包含數據只導出結構
mysqldump -u[username] -p[password] --no-create-info [database_name] > [dump_file.sql] #不包含結構只導出數據
mysqldump -u[username] -p[password] --all-database > [all_dbs_dump_file.sql] #導出全部數據庫
​
#數據庫維護
#分析表語句
ANALYZE TABLE 表名1[,表名2] #返回表名 操作 分析狀態 和信息,會嘗試修復
#優化表語句
OPTIMIZE TABLE tabe_name; #優化由於表操作導致的碎片問題
#檢查表語句
CHECK TABLE table_name; #僅檢查
#修復表語句
REPAIR TABLE table_name; #僅修復

DDL:數據庫定義語言,用於描述數據庫中創建庫表,關鍵字create alter drop等

#創建數據庫
CREATE DATABASE [IF NOT EXISTS] database_name;
​
#刪除數據庫
DROP DATABASE [IF EXISTS] database_name;
​
#創建表
CREATE TABLE [IF NOT EXISTS] table_name(
    colume_list
)engine=table_type;
#定義列
字段名 數據類型 整型寬度、字符大小極限65535 是否可空NOT NULL 是否自增auto_increment 默認值default 索引 主鍵primary key 注釋等等
​
eg:create table tname(
id int(10) auto_increment primary key, #auto_increment自增 primary key主鍵
name varchar(255),
age varchar(10),
sex varchar(10)) default charset=utf8;
​
#修改表
ALTER TABLE table_name CHANGE column_name new_column_name(不改寫原來的) varchar(200) not null;
ALTER TABLE table_name ADD column_name varchar(200) not null [FIRST | AFTER 字段];
ALTER TABLE DROP column_name;
#刪除索引
ALTER TABLE 'table_name' DROP UNIQUE(index) name;
#添加索引
ALTER TABLE 'table_name' ADD UNIQUE(name) #唯一索引
ALTER TABLE 'table_name' ADD FULLTEXT(name) #全文索引
ALTER TABLE 'table_name' ADD INDEX(name) #普通索引
#修改引擎 
ALERT TABLE table_name ENGINE = InnoDB;

 

空值有NULL和None之分:NULL占了空間但內容是空的,None沒有內容也不占空間 數據類型:

  • 數值類型:TINYINT 1字節 范圍255;SMALLINT 2字節 范圍65535;MEDIUMINT 3字節 8388607;INT 4字節 2^32;BIGINT 8字節 2^64;FLOAT 4字節;DOUBLE 8字節;DECIMAL(M,D) M整體位數,D小數位數;

    UNSIGHED無符號 ;zerofill剩余寬度用0補齊

  • 字符類型:CHAR 255字節(定長字符串,無論存多少內容255字節都是);VARCHAR 0-65535字節;TINYBLOB 0-255字節 存儲二進制字符串;TINYTEXT 0-255字節 短文本;BLOB 0-65535字節 長二進制字符串;TEXT 0-65535字節 文本;MEDIUM BLOB/TEXT...;ENUM 數據長度為1則為0,1,2;SET 集合;

  • 時間類型:DATE 3字節 YYYY-MM-DD;TIME 3字節 HH:MM:SS;YEAR 1字節 YYYY;DATETIME 8字節 YYYY-MM-DD HH:MM:SS;TIMESTAMP 4字節 時間戳 默認插入/更新數據時的值;

  • 空間數據類型:GEOMETRY POINT 等等

 

數值類型(寬度) 字符類型(長度) 枚舉enum("1","0")

 

引擎類型:

  • InnoDB:健壯的事務型存儲引擎。表文件夾中存放.frm表結構文件 date文件夾中.ibdata1存放數據 .ibd存放索引
  • MyISAM:訪問速度很快,但不支持外鍵和事務。每個MyISAM在磁盤上生成三個文件 .frm 表結構信息 .MYD 數據 .MYI 存儲索引

設置引擎:默認InnoDB 顯示所有支持的引擎:SHOW ENGINEs 字符集:默認latin1

 

索引類型:

  • 主鍵索引:primary

    在一個表中唯一,值不能重復,在數據查寫讀時能按一定順序和排列工作

  • 唯一鍵:unique

    一個表中可以同時給多個字段設置unique,設置了的字段值不能重復null除外

  • 普通索引:index

    沒有其他約束

    文本索引:fulltext

    5.7版本之后使用,加快大批量文本中的查找效率
  • mysql外鍵

    副表的非主鍵字段與主表的主鍵字段關聯,那么這個副表的非主鍵字段稱為外鍵

    在副表中添加一個主鍵中不存在的數據,操作會報錯

    如果在主表修改或刪除,副表中有對應數據,主表會默認阻止
  
#創建外鍵
  [CONSTRAINT constraint_name] #約束名
  FOREIGN KEY [foreign _key_name] (columns)
  REFERENCES parent_table(columns_name)
  ON DELETE 模式 #模式:district默認嚴格模式 cascade關聯 set null將管理數據設置null no action什么都不做
  ON UPDATE 模式;
  
  #添加外鍵
  ALTER TABLE table_name ADD constraint FK_ID foreign key(key_name) REFERENCES parent_table(columns_name);
  
  #刪除外鍵
  ALTER TABLE table_name DROP FOREIGN KEY key_name

DQL:數據庫查詢語言,查詢,關鍵字select等

SELECT
column_1,column_2,...
FROM table_1
[INNER | LEFT |RIGHT] JOIN table_2 ON CONDITIONS
WHERE conditions
GROUP BY column_1
HAVING group_conditions
ORDER BY column limit offset,length
​
#條件查詢
select * from 表名 [where 條件];
select field1,field2,...fieldn... from 表名 [where 條件];
where后面的條件可以用>、<、>=、<=、!=等多種比較運算符,多個條件之間可以用or、and、not等邏輯運算符、
between begin_expr AND end_expr;<= >=;eg:BETWEEN CAST('2000-01-01' AS DATE) AND CAST('2001-01-01' AS DATE)、
LIKE 'value' #精准查詢,可加% _ 如果需要可以加 ESCAPE'\'轉譯,此處\也可以指定為其他符號、in eg;
where in ...#不確定字符串包含關鍵字查找 FIND_IN_SET(要包含字符串,字段)、
group by 表達式,表達式... having group_conditions 
#GROUP BY分組 having分組后進行過濾 配合聚合函數avg()計算一組值平均值 count()計算表中行數 instr()返回子字符串在字符串中第一次出現位置 sun()計算一組數值綜合 min()在一組數值中找到最小值 max()在一組數值中找到最大值、 order by asc升序 desc降序,多列排序時后一列是在前一列基礎上排,自定義 field(column,
"A","D","B","C") ​ #去重查詢 select distinct 字段 from 表名; eg: select distinct name from students;//查詢名字不相同的學生;   select distinct name,age from students;//查詢名字和年齡同時不同的學生   1.distinct必須放在最開頭   2.distinct只能使用需要去重的字段進行操作。 ----也就是說我sidtinct了name,age兩個字段,我后面想根據id進行排序,是不可以的,因為只能name,age兩個字段進行操作.   3.distinct去重多個字段時,含義是:幾個字段 同時重復 時才會被 過濾。 ​ #排序查詢 select * from 表名 [where 條件] [ order by field1 [desc/asc],field2 [desc/asc]... ]; ​ eg:select *from student order by age desc;//查詢學生表並按年齡降序排列。 1.desc 降序排列,asc 升序排列 2.order by 后面可以跟多個不同的排序字段,每個排序字段都可以有不同的排序順序。 3.如果排序字段的值一樣,則相同的字段按照第二個排序字段進行排序。 4.如果只有一個排序字段,則字段相同的記錄將會無序排列。 ​ #限制查詢 select ... [limit 起始偏移量,行數]; ​ eg:select * from student order by mark desc limit 5;//取出成績前五名的學生(省略了起始偏移量,此時默認為0) 默認情況下,起始偏移量為0,只寫記錄行數就可以。 ​ #聚合查詢 select 字段 fun_name from 表名 [where 條件] [group by field1,field2...] [with rollup] [having 條件]; 1.fun_name 表示要做的聚合操作,也就是說聚合函數,常用的有 : sum(求和)、count(*)(記錄數)、max(最大值)、min(最小值)。 2.group by關鍵字 表示要進行分類聚合的字段。比如要按照部門分類統計員工數量,部門就應該寫在group by 后面。 3.with rollup 是可選語法,表明是否對分類聚合后的結果進行再匯總 4.having 關鍵字表示對分類后的結果再進行條件過濾。 ​ #表連接 表連接分為內連接和外連接。 他們之間最主要的區別:內連接僅選出兩張表中互相匹配的記錄,外連接會選出其他不匹配的記錄。 內連接: ... from table1 inner join table2 on table1.name=table2.name; 外連接 分為左連接和右連接 左連接:包含所有左邊表中的記錄,甚至是右邊表中沒有和他匹配的記錄。 ... from table1 left join table2 on table1.name=table2.name; 右連接:包含所有右邊表中的記錄,甚至是右邊表中沒有和他匹配的記錄。 ... from table1 right join table2 on table1.name=table2.name; 交叉連接: ...from table1 cross join table2 #產生a*b條,笛卡爾乘積 ​ #聯合查詢 把多個SELECT查詢結果合並起來 select column_1 from table1 union select column_2 from table2 列名總顯示第一個查詢語句列名,默認清除重復項,union all不去重 ​ #子查詢 select * from table1 where id =(select column from table2 where ...) select * from table1 where id = and exisit (select column from table2 where ...) #加上and exists 有就查,沒有不會報錯 ​ #查詢用戶信息 select user(); #查看當前用戶 select user,host,db,command FROM information_schema.processlist; #查詢連接的用戶信息 ​ #查看查詢語句運行效率 explain select語句

DML:數據庫操作語言,插入更新刪除,關鍵字insert update delete等

#插入
insert into tname(id,name) values ("1","xm") [ON DUPLICATE KEY UPDATE id=id+1];
​
#拷貝表,具有SELECT字句的INSERT
create table new_table_name like table_name;
insert into new_table_name select * from table_name;
​
#替換
replace into tname(id,name) values ("1","xm");
​
#更新
UPDATE [LOW_PRIORITY]#優先查詢再更新 [IGNORE]#忽略錯誤 table_name SET column='value'
UPDATE table_name SET column=(select * from table_name)
​
#關聯更新
updata table1,table2 set table1.arr=val,table2.arr=val where table1.column=value and table2.column=value
updata table1 join table2 set table1.column='val' , table2.column='val' where table1.col='value' and table2.col='value'
​
#刪除
delete * from table_name [order by id desc] [limit row_count] [where ];
truncate * from table_name ; #這種方式效率很快,且重置自增
​
#關聯刪除
delete table1,table2 from table1 inner join table2 on...;
​
#設置寫內存配置
max_allowed_packet=1M #限制接收的數據包大小,打的插入和更新會被限制導致失敗
net_buffer_length=2K #insert語句緩存值2K-16M
bulk_insert_buffer_size=8M #一次性insert語句插入大小

常用內置函數

1.聚合函數
avg() #返回平均值,計算中忽略NULL
count() #返回行數,不忽略NULL
sum() #求和
min() 
max()
2.字符串函數
group_concat() #select group_cancat(column) from table group by .. 將各項連接
concat() # select cancat(column1,column2) from table 將內容連接起來 
concat_ws() # select cancat_ws("-",column1,column2) from table 將內容以-連接起來 
left() #從左邊取x個字符 left("abcde","3") -> "abc"
replace() #替換 replace(整體字符串對象,被替換字符串,新字符串) update products set productsDescription = REPLACE(productsDescription,"old","new")
substring() #截取 substring(string,start[,length])start是從1開始計數的
trim() #trim( [ {both|leading|trailing} [removed_str] ],obj ) 參數:從兩邊去,前面去,后面去,去掉什么(不傳為空格)
format() #保留位數 format(N,D[,locale]) N數字,D格式化小數位數,表示方式默認en_US
3.日期和時間函數
curdate() #返回當前日期 2000-01-01
now() #返回當前時間 2000-01-01 00:00:00 此時間只算程序執行時的時間
sysdate() #返回當前系統時間 2000-01-01 00:00:00 此時間時刻運算
sleep()
day() month() year() week()今年第幾周 weekday()周一到周日對應0-6 dayname() #返回指定日期函數,設置dayname顯示中文:SET @@lc_time_names='zh_CN'
datediff() #計算兩時間之差天數 datediff('2000-01-01','2000-01-02')
timediff() #計算兩時間之差時間返回00:00:00 參數可以是日期也可以是時間
timestampdiff() #timestampdiff(單位,start,end) 計算兩時間之差返回單位可以是 day week month hour quarter second minute...
date_add()/datetime_add() #將時間間隔添加到date或datetime date_add(start,INTERVAL 數字 單位) 也可以例date_add(2000-01-01,INTERVAL '1:1' day_month)

視圖

1.創建視圖:
create view viewname as select ...
2.修改視圖:
alter view viewname as select ...
或
create or replace view as select ...
3.刪除視圖:
drop view viewname;
4.查看視圖:
show full tables;
​
臨時表與視圖區別:視圖一直存在,而臨時表存在於內存中當客戶端會話結束時自動刪除
創建臨時表 create temporary table tempname select ...

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM