create database blog;php
create table blog_user
(
user_Name char(15) not null check(user_Name !=''),
user_Password char(15) not null,
user_emial varchar(20) not null unique,
primary key(user_Name) // 主鍵的規定 , 只有 auto_increment纔是下劃線連字 其餘都是分開 的單詞...html
)engine=innodb default charset=utf8 auto_increment=1;mysql
關於語法:算法
supplicant: 懇求, 祈求, supplicator: 請求者, 祈求者. 也能夠作 "客戶端" 的意思
因此 手機上的 wifi 萬能鑰匙的解碼密碼的查看 目錄是 : /data/wifi/wpa_supplicant.conf 中.
須要安裝兩個軟件, 一個是 : root權限軟件; 另外一個是 RE: rootexplorer.sql
sql中的use, 表示的是 "選擇" 至關於 select, 在表中, 選擇, 適用 select, 而數據庫的選擇 使用 use.
即: use mysql; 表示的是 "選擇" mysql數據庫shell
要查看數據庫和 數據表, 要使用show, 不能直接使用databases和 tables;數據庫
在shell 控制檯 界面, (不進入數據庫的狀況下), 管理數據庫的命令是: mysqldump db.table
> dump.sql 和 導入數據庫的命令: source dump.sql;
即: mysqldump 和 對應的 source 命令;
mysqldump 並不會導出"建立數據庫 " 的語句, 因此 , 在 導入source腳本的時候, 要本身手動 先建立好數據庫..編程
建立表/數據庫時, 能夠指定條件: if (not) exists db/table..
注意的是, 條件判斷 和 前面的create語句 共用後面的 "表名稱" ...
create table ---- if not exists --- table_name(....)數組
另外一個命令是: mysqladmin...服務器
建立表的方法, 除了常規的方法外, 還有兩個:
適用 複製命令: create table foo select * from bar ; 這時候, bar表和 foo表的數據結構徹底一致, 並且 foo表中的數據 也被 複製給了 bar表;
可是 若是隻是爲了 想 複製表的 結構, 不復制數據, 要適用 條件: create table bar2 select * from foo where 1<>1 ;
凡是 在sql語句中, 在須要 一個表結構 / 或表的數據記錄 的地方(場合), 均可以適用 子查詢 來 代替: select * from bar [where...]
在輸出語句中, select ??? 若是輸出內容, 不帶 引號, 這時,{ 數據庫的引擎(就是myisam, innodb等)--管理存儲, 查詢, 輸出, 事務等都是由它來負責的, (至關於php的zend引擎同樣).會當作 字段 來看待 (字段就至關於 php中的 變量同樣) , 很明顯沒有這樣 的字段時, 就會報錯, 而加上引號後, 就會 當作是一個普通的 字符串來 輸出, 就是正確的
那就是: 凡是用來 輸出 具體的 一個 值的 : 好比字符串, 數字, 好比函數的返回值,等的 就要用 select
凡是 用來 顯示 信息的 , 用來顯示 "描述/說明" 信息的, 用show.
在mysql中 可使用 help show; 來查看 show語句的用法.
因此 version(); database() -- 用來查看 當前數據庫是哪一個數據庫的 , 用 select 來表示 ....
mysql 控制檯中, 命令能夠 用後面相應的 ??? 來代替, 是同樣的,好比: system == !
執行 外部的 shell command 用system, 好比: system pwd; system cd /etc等.
而執行sql腳本, 用 source命令, 注意這個source命令, 並非專門針對sql的什麼 導入命令, 不是(sqlimport) , 而是能夠執行任意的 sql腳本的.
甚至! 當你 關閉了 mariadb的鏈接, 關閉了 mariadb的服務, 而後你重啓 mariadb的服務, 這些 歷史命令的 記錄 都還在 , 因此之後 能夠 反覆地適用 這些歷史命令了.
可是 , 也不是說, 一點關係都沒有, 那就是 , 當你在用 source 命令 執行 腳本的時候, 默認是在 你 當前 目錄下(你 從哪裏進入mysql的) 尋找 sql文件, 不然, 你 執行 sql腳本的時候 就要 指明 sql腳本文件的 整個完整的 路徑...
=====================
source 命令和 . 命令執行腳本時, 若是 用 . 命令, 腳本最後面的 分號; 要跟 腳本文件名 之間 至少要 分割一個空格.....不然會把分號當作腳本文件名的一部分...
mysql的 單精度/雙精度 數字是 用 decimal (5,2) 來表示的...
整數的類型 從小到大, 有5種: tinyint, smallint mediumint int bigint, unsigned 能夠節約一位(用來表示和存儲 正負號的), 擴大數據範圍;
包括函數 也有 存儲函數和 用戶自定義函數, 存儲函數, 叫 stored function, 是指 mysql系統自帶的 , 系統內部預先給你定義好了的 函數, 叫作 存儲函數.
udf: user-defined function. 即用戶自定義 函數.
因此, 對於 過程而言, 也叫作 存儲過程
delimiter $$ -- 這是一條語句 create procedure sp_echo_hello() begin select "hello world "; end$$ --- 這是一條語句 delimiter ; --- 這是一條語句
找到緣由了執行DROP TABLE後,全部的表數據和表定義會被取消,因此必須斷開mysql鏈接,mysql_close();這樣表數據纔會刷新,而後從新鏈接就沒問題了
**在sql中, 要給變量賦值, 有兩種方式: 一種是用set是單獨的. set a=b+1; 另外一種是在 查詢 語句中, 用select, select的方式有兩種, 主要 是用在查詢語句中, select sum:=count(name) from user; 另外一種是用 select into... select count(*) into sum from user; **
並且在調用 函數 / 過程的時候, 一般適用的是 用戶變量 : @param1,, @p2, @p3...
/* 自定義存儲過程 */ create procedure sp_add(a int, b int, out sum int) set sum=a+b; -- 建立存儲過程 的 特徵子句 language sql not determi'nistic adj. 肯定性的, 必然的. 指存儲過程的 輸入和輸出 的 結果是能預知的, 不會改變的.. comment 'this is a procedure for add' sql security definer : definer只是在建立時檢查建立用胡的權限, invoker還會檢查調用者的權限 create procedure sp_add( a int, b int) begin set @sum=0; set @sum = a +b; -- 賦值必須用set end; 執行存儲過程 : call sp_add(10, 2); 而後 , select @sum;
drop function if exists add; create function test.add(a int unsigned , b int unsigned ) returns int begin if a is null then set a=0; end if; if b is null then //對於 定義了 b的 int 類型值, 是能夠傳遞 null 實參的. set b=0; end if; return a+b; end; -- 調用 函數 set @a=10; set @b=20; select test.add(@a, @b) as Add; select test.add(10, 20) as Add2;
mysql 是 編譯型語言, 若是是php傳遞字符串查詢, 則每次都會編譯一次, 而存儲過程, 只會在 建立的第一次, 進行編譯, 之後都直接執行編譯後的 代碼.. 使用 存儲過程 可能 會提升訪問查詢速度.
只有在 要處理的 事務 比較複雜, 要使用 大量的 sql 語句的時候, 才使用 procedure, 而平時不是太複雜的查詢, 就直接使用 字符串查詢就行了!
**在用 php進行 存儲過程的 執行時, 要 假設 當前的操做, 仍然在 mysql上, 包括 設置 "用戶變量" 等, 都要用 mysql_query("set @sum=0"); 等等.
1 <?php 2 3 header('Content-type: text/html; charset=utf8'); 4 5 $conn = mysql_connect('localhost', 'root', '') or die('failed to connect!'.mysql_error()); 6 mysql_select_db('test', $conn); // 注意,這裏的參數, 必定是'db'數據庫名稱 在前面, $c 7 8 try{ // 注意這裏是用 大括號, 不是 小括號... 9 mysql_query('call test.sp_add(10, 20)'); 10 11 $res = mysql_query('select @sum'); 12 13 // $res 是一個resource, 返回的是id. 14 15 $ret = mysql_fetch_row($res); 16 17 echo "調用 sp_add(10, 20)的結果是: ". $ret[0]; // 全部的 正確處理代碼都放在try{...} 裏面 18 19 } catch(Exception $e){ /// 這裏 是容許 這種用法的, 在$e前面有一個 類型 Exception 20 21 echo $e; 22 } 23
增刪改查, 都是兩個關鍵字,
select from
insert into
upate ... set (set是 mysql中很常見的一個關鍵字)
delete from ... where. 注意, delete刪除的是一個記錄一個記錄的刪除, 不可能只刪除某一個字段的,
因此,delete後面, 就不能帶、指定字段了。
注意, mysql的條件字句where, 天生就支持 like, not like in not in between 等模糊匹配符號,
而不是隻有等號=
2.對mysql 的操做, 既能夠直接在 shell 界面 操做, 也能夠 先進入mysql控制檯, 而後再進行操做。
mysql> set password for 'bar'=password('bar'); ERROR 1133 (42000): Can't find any matching row in the user table mysql> set password for 'bar'@'somehost' = password('bar'); -- 這裏在指定用戶的時候, 必定要顯式地使用 ’user'@ 'host'的方式, 不然會說找不到。。。 Query OK, 0 rows affected (0.00 sec) mysql>
insert into mysql.user(host, user, password) values('%', user_name, password());
privileges; 來刷新權限才能生效。 privileges: vi爲i, leges中間沒有d, 且爲複數。
要刪除表中的數據, 有兩種方法, 一是 常規的 delete from t; 二是使用truncate, 第二種truncate比
dlete的速度要快, 佔用的內存和日誌要少, 產生的rollback快、少??
字符集, latin1 就是iso8859-1. iso8859有多個字符集的子集, 其中latin1就是第一個子集
能夠同時建立多個用戶, 每一個用戶用 user_specification來指定, 用戶之間用逗號來分隔
mysql> create user 'foo'@'localhost' identified by 'foo', 'bar'@'somehost';Query OK, 0 rows affected (0.00 sec)
建立用戶時指定密碼, 經過identified by '明文字符串‘,若是要用password關鍵字, 則必須是 密碼字符串的hash value。
字段的標準聲明方式就是: fieldname int(10) unsigned not null default null.
mysql中操做數據和結構的語言主要有四種, 分別叫作, d?L: data ? language
?: 能夠是查詢:query, 即select: 叫作:dql
能夠是m: manipulation, 即對數據自己的操做, 對錶中的記錄進行操做... dml
能夠是:表和數據庫的結構, 即定義語言,define。 叫: ddl, 如: create, drop,add, change.等
能夠是: 對錶和數據的控制,control, 叫dcl,包括grant受權, 事務transaction 和回滾等。
dml和ddl的區別是: 一樣的增刪改查: dml由於是對數據/記錄的操做, 因此是: insert into, update set, delete where, 而ddl因爲是對錶結構自己的操做,因此是: add, drop, change 等
在mysql控制檯, 提供了很是強大/詳細的 help, 經過help key1, 或者help key1 key2能夠查看到不少詳細的信息...
set password: [for user] = password/old_password('明文字符串');
for user 能夠不指定, 那就是默認的對當前登陸用戶進行設置密碼.
若是不用 password/old..函數, 等號後面的密碼字符串就必須是通過password加密後的 hash字符串值.
任何 非匿名用戶均可覺得本身修改密碼. any nonanonymous account can change the password for that account.
你能夠在命令行 顯式的用 '' 匿名帳戶登陸mysql, 可是你沒有權限去修改這個匿名用戶的密碼的: you are using mysql as an anonymous user, and anonymous accounts are not allowed to change passwords.
匿名用戶不容許修改密碼! nonanonymous account...
use mysql; update user set password=password('new_password') where user="root"; flush privileges;
password [new-password] Change old password to new-password in current format 適用 新的 長哈希hash 密碼值, 從4.1版本後適用 password(..)函數. 獲得的是41位的... old-password [new-password] Change old password to new-password in old format 適用 舊的老的 加密格式: old_password('123'), 加密出來的是 16位: 兼容 4.1 以前的版本.
如今的 加密算法不少, 好比: md5, des(數據加密標準data, encryption standard, ibm公司提出的), aes, sha等等. des在pos機, 加油卡, 購物卡等非機密機構的應用中使用.
mysql中提供的加密算法包括: md5, password, old_password. aes_encrypt等.
它自己提供/ 支持 aes加密( aes"啊餓死'), 兩個函數 aes_encrypt, 和 aes_decrypt, 須要輔助的 輸入 key來加密和解密:
MariaDB [(none)]> select aes_decrypt(aes_encrypt('123', 'abc'), 'abc') as '加密解密'; // 單獨的加密出來的 是 亂碼!! +--------------+ | 加密解密 | +--------------+ | 123 | +--------------+ 1 row in set (0.00 sec) MariaDB [(none)]>
可是 mysql提供的 password加密方法, 加密函數, 又是 另一種加密方法, 它加密出來的字符串老是 以星號開頭的, 並且是41位的.
而mysql中 也有 /也提供/支持md5 加密的, 它加密出來的長度 是 32位.
在mysql中, 計算字符串長度用 length(...) 函數. 要顯示 mysql加密函數 加密後的 結果, 直接用 select輸出
mysql也支持 old_password加密算法, 加密出來的是 16位長度.
MariaDB [(none)]> select old_password('123') as 'old加密' , length(old_password('123')) as 'old加密長度'; +------------------+-----------------+ | old加密 | old加密長度 | +------------------+-----------------+ | 773359240eb9a1d9 | 16 | +------------------+-----------------+ 1 row in set (0.00 sec) MariaDB [(none)]>
mysqladmin -uroot password '123'
沒必要使用 password函數加密, 會自動加密;mysqladmin -uroot -p password ['123']
新的 密碼能夠直接輸入[foo@localhost ~]$ mysqladmin -uroot -p 'root' password Enter password: mysqladmin: Unknown command: 'root' // 舊密碼不能直接輸入! [foo@localhost ~]$ mysqladmin -uroot password mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: NO)' // 提示沒有使用密碼, 即要加 -p [foo@localhost ~]$ mysqladmin -uroot -p password 'root2' Enter password: [foo@localhost ~]$ mysqladmin -uroot -p password Enter password: New password: ### 凡是: 提示: Enter password的, 表示 要輸入: 舊的, 原來的密碼; ### 只有在 : New password的時候, 纔是 要你 輸入 新的密碼 Confirm new password: [foo@localhost ~]$