一些經常使用的mysql語句實例-之後照寫

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

關於語法:算法

  1. 表的字段之間, 用逗號來分割, 同一字段內部 用 空格 分割 而不是 用 逗號分割.
  2. 表的外部,末尾, 用等號來定義 屬性, 如: engine=innodb 字符集: default charset=utf8 ...

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...服務器

建立表的方法, 除了常規的方法外, 還有兩個:

  1. 使用 like. create table foo like bar; 這時 foo表的結構就跟bar 的結構 徹底一致了..
  2. 適用 複製命令: create table foo select * from bar ; 這時候, bar表和 foo表的數據結構徹底一致, 並且 foo表中的數據 也被 複製給了 bar表;
    可是 若是隻是爲了 想 複製表的 結構, 不復制數據, 要適用 條件: create table bar2 select * from foo where 1<>1 ;

  3. 凡是 在sql語句中, 在須要 一個表結構 / 或表的數據記錄 的地方(場合), 均可以適用 子查詢 來 代替: select * from bar [where...]


對mysql的理解, 一是能夠看作是一種 編程語言, (並且這種語言, 就相似於 php, c, basic等等, 語言自己提供了一些系統的內建的經常使用函數--方便初級用戶使用, 任何一種語言, 若是不自帶一些經常使用的函數庫, 什麼功能都要用戶本身去寫本身去實現, 恐怕很難活下去!! 並且, 用戶還能夠建立本身的過程和函數. 這些過程和函數, 跟任何一種編程語言如basic中的過程和 函數徹底同樣.. ) 這種語言的輸出 /打印語句, 不是print, 也不是 echo, 而是 select. 這個select 後面 能夠 輸出任意的東西, 好比 字符串, slect "hllo world"; 好比數字, 等, 還能夠輸出mysql的內置函數. 好比 : select now(); 還能夠輸出 用戶本身建立 的 過程 和 函數; 所以 在 mysql語句中, 不要把 select看桌是 選擇, 而是要看作是 " 輸出print, echo", 第二, 對 mysql的理解, 要把它看作是一個 存儲系統, 能夠存儲數據庫/表, 固然也能夠存儲用戶自定義的表/ 臨時表/ 索引/ 和 自定義 過程和函數.

在輸出語句中, select ??? 若是輸出內容, 不帶 引號, 這時,{ 數據庫的引擎(就是myisam, innodb等)--管理存儲, 查詢, 輸出, 事務等都是由它來負責的, (至關於php的zend引擎同樣).會當作 字段 來看待 (字段就至關於 php中的 變量同樣) , 很明顯沒有這樣 的字段時, 就會報錯, 而加上引號後, 就會 當作是一個普通的 字符串來 輸出, 就是正確的


mysql中 何時, 用 select, 何時用 show?

那就是: 凡是用來 輸出 具體的 一個 值的 : 好比字符串, 數字, 好比函數的返回值,等的 就要用 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腳本的.

mysql 可能有一個 專門的 文件,(並且不是 用 內存 緩衝區), 來記錄 在當次 機器登陸期間的 所輸入的命令, 你能夠在 整個 全部 的 鏈接id之間 共有/共用 這些 歷史命令, 即便你 關閉了 shell終端,這些歷史命令都還在,

甚至! 當你 關閉了 mariadb的鏈接, 關閉了 mariadb的服務, 而後你重啓 mariadb的服務, 這些 歷史命令的 記錄 都還在 , 因此之後 能夠 反覆地適用 這些歷史命令了.

mysql的 控制檯 終端, 沒有什麼所謂的 文件目錄路徑的概念的, 它是 mysql本身這個服務器 所存儲的 系統 自身的 顯示, 其實跟你 在shell中, 從什麼位置 進入 mysql是沒有關係的, 即便你用system命令 來改變目錄, 這個也只是改變 的 shell的當前目錄...跟mysql無關??? (並且 好像 適用 system cd 或 pushd命令沒有效果: 即在 mysql控制檯中, 並不能改變shell的當前目錄???

可是 , 也不是說, 一點關係都沒有, 那就是 , 當你在用 source 命令 執行 腳本的時候, 默認是在 你 當前 目錄下(你 從哪裏進入mysql的) 尋找 sql文件, 不然, 你 執行 sql腳本的時候 就要 指明 sql腳本文件的 整個完整的 路徑...

=====================

source 命令和 . 命令執行腳本時, 若是 用 . 命令, 腳本最後面的 分號; 要跟 腳本文件名 之間 至少要 分割一個空格.....不然會把分號當作腳本文件名的一部分...

mysql中的 不少 對象, 包括 函數, 存儲過程, 視圖, 索引 等 都是 屬於數據庫的, 基於數據庫的, 因此 在建立的時候, 就要 指明所屬的 數據庫, 若是不指定 默認就表示的是 當前數據庫! 因此, 當你要執行 drop命令的時候, 你要 具備 'delete' privilege on some 數據庫!


mysql的 單精度/雙精度 數字是 用 decimal (5,2) 來表示的...
整數的類型 從小到大, 有5種: tinyint, smallint mediumint int bigint, unsigned 能夠節約一位(用來表示和存儲 正負號的), 擴大數據範圍;

要記錄mysql操做過程當中的 輸出結果, 輸出文字和 輸入命令等內容, 能夠適用 tee命令, show是顯示數據庫的 中的變量

什麼叫 /爲何 叫 存儲過程?

包括函數 也有 存儲函數和 用戶自定義函數, 存儲函數, 叫 stored function, 是指 mysql系統自帶的 , 系統內部預先給你定義好了的 函數, 叫作 存儲函數.
udf: user-defined function. 即用戶自定義 函數.

因此, 對於 過程而言, 也叫作 存儲過程


要清楚, 不論是 mysql客戶端的控制檯, 仍是 sql腳本, 都是以 "單獨的 一條一條的" 語句爲 單位, 組合起來的, 所以, 語句的 結束都是以 分號 爲結束的, 趕上 creat procedure/function 等 "語句"的時候, 由於中間可能包含 begin ... end中的 語句用分號, 因此 結束符就要 用其餘的了, 不能再用 分號了, 因此, 通用 的寫法是:

delimiter $$    -- 這是一條語句

create procedure  sp_echo_hello()
begin
select "hello world "; 
end$$                --- 這是一條語句

delimiter ;         --- 這是一條語句

遇到 drop table/function NAME 竟然會出錯?? 找到緣由了執行DROP TABLE後,全部的表數據和表定義會被取消,因此必須斷開mysql鏈接,mysql_close();這樣表數據纔會刷新,而後從新鏈接就沒問題了


mysql中 自定義函數 和 自定義 存儲過程的語法??

**在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...

由於 function 和 procedure都是 例程/程序, 因此 , 都要必須 加 括號 ().

/* 
自定義存儲過程
*/
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;

在 存儲過程 中, 的 routin_body中, 不能包含: ddl語句, 即: 操做數據庫/表/過程/函數 等的 語句...

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;

sql腳本的 註釋, 單行註釋有: --, # , 註釋符號 -- # 必須和後面的內容之間 至少隔一個空格, 多行註釋是: / * ....*/

能夠認爲, 關於函數 和 過程, 只有 在 select 調用的 時候, 才 帶 小括號, 其餘操做, 好比: show 等的時候, 都不用 括號!!!

mariadb 的版本, 爲何在操做 函數/過程 等的時候 會報錯?

  • 查看函數/過程的, 有兩個命令, 一是: show function/procedure status ; 會將全部的函數/過程都 顯示出來, 若是 只是查看某一個具體的 , 用 like... where...
    好比: show fucntion status like 'add'; 二是, show create function test.add; (注意必須帶 test.數據庫)
  • 在mariadb中, 函數和 過程 叫作: rou' tine (程序, 例程)
  • 跟mysql不一樣, 在mariadb中, 操做函數/過程, 包括: create . drop, 和 select(調用)的時候, 必須顯式的 指明 所在的 數據庫, 注意即便 當前已經 選擇了 例程所在的 數據庫, 還要在使用
    的代碼中 指明 數據庫. 若是不指定 數據庫 就會報錯~~

通常php在何時什麼狀況下, 使用 存儲過程?

mysql 是 編譯型語言, 若是是php傳遞字符串查詢, 則每次都會編譯一次, 而存儲過程, 只會在 建立的第一次, 進行編譯, 之後都直接執行編譯後的 代碼.. 使用 存儲過程 可能 會提升訪問查詢速度.
只有在 要處理的 事務 比較複雜, 要使用 大量的 sql 語句的時候, 才使用 procedure, 而平時不是太複雜的查詢, 就直接使用 字符串查詢就行了!

**在用 php進行 存儲過程的 執行時, 要 假設 當前的操做, 仍然在 mysql上, 包括 設置 "用戶變量" 等, 都要用 mysql_query("set @sum=0"); 等等.

php 要引用 mysql中的 存儲過程返回的值? 參考: http://www.php.cn/php-notebook-44169.html

  • 使用 mysql_query('seletc @sum'); 使用 select語句返回的 query, 老是 一個 resource, 其資源id是遞增的..
  • 這個資源id 被看作是: mysql result 的類型,
  • mysql_fetch_row(data), 參數是一個 mysql_query()查詢返回的結果集, 每次獲取* 一行, ** 返回一個數組! 或者false.
  • 若是是mysql_query('select @sum'); 則返回的是 一行記錄集, 這個一行記錄集中只有一個字段...
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

  1. 掌握兩個mysql的日期函數就能夠了: date_format, str_to_date('日期', 格式字符串);
  2. 增刪改查, 都是兩個關鍵字,
    select from
    insert into
    upate ... set (set是 mysql中很常見的一個關鍵字)
    delete from ... where. 注意, delete刪除的是一個記錄一個記錄的刪除, 不可能只刪除某一個字段的,
    因此,delete後面, 就不能帶、指定字段了。

  3. 注意, mysql的條件字句where, 天生就支持 like, not like in not in between 等模糊匹配符號,
    而不是隻有等號=

2.對mysql 的操做, 既能夠直接在 shell 界面 操做, 也能夠 先進入mysql控制檯, 而後再進行操做。

  1. 對mysql建立用戶並設置密碼, 有兩種方法:
    一是, 直接在shell中操做: mysqladmin -u user_name password '...'
    二是, 先進入mysql, 而後:
    set password [ for username] =password(...); -- 注意這裏的密碼 要用 password函數加密;
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());

在shell界面設置用戶的密碼後, 就會立刻生效, 可是在mysql控制檯, 設置密碼後, 還要使用 flush

privileges; 來刷新權限才能生效。 privileges: vi爲i, leges中間沒有d, 且爲複數。

  1. 要刪除表中的數據, 有兩種方法, 一是 常規的 delete from t; 二是使用truncate, 第二種truncate比
    dlete的速度要快, 佔用的內存和日誌要少, 產生的rollback快、少??

  2. 字符集, 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)

  • 一個用戶的標準形式是, ‘user'@ 'localhost'. 若是不寫localhost, 不指定host,則默認的就是 ’%’
  • 建立用戶時指定密碼, 經過identified by '明文字符串‘,若是要用password關鍵字, 則必須是 密碼字符串的hash value。


  1. 字段的標準聲明方式就是: 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 等

  2. 在mysql控制檯, 提供了很是強大/詳細的 help, 經過help key1, 或者help key1 key2能夠查看到不少詳細的信息...

  3. 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.

在mysql中, user和user_name是不一樣的: user_name僅僅只是名字, 可是因爲同一個 username能夠有多個 不一樣host的 帳戶, 所以, the user value should be given in user_name @ host_name format.

存儲過程和函數的區別: 存儲過程主要是用來處理比較複雜的業務邏輯的, 而函數, 僅僅是爲了實現某個簡單的邏輯功能/邏輯塊的處理的

匿名用戶不容許修改密碼! nonanonymous account...


修改mysql 的root的密碼的多種方法中, 推薦適用的是 : update 方法:

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 以前的版本.

mysql中的加密函數和加密方法?

  1. 如今的 加密算法不少, 好比: md5, des(數據加密標準data, encryption standard, ibm公司提出的), aes, sha等等. des在pos機, 加油卡, 購物卡等非機密機構的應用中使用.
    mysql中提供的加密算法包括: md5, password, old_password. aes_encrypt等.

  2. 它自己提供/ 支持 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)]>
  1. 可是 mysql提供的 password加密方法, 加密函數, 又是 另一種加密方法, 它加密出來的字符串老是 以星號開頭的, 並且是41位的.
    而mysql中 也有 /也提供/支持md5 加密的, 它加密出來的長度 是 32位.
    在mysql中, 計算字符串長度用 length(...) 函數. 要顯示 mysql加密函數 加密後的 結果, 直接用 select輸出

  2. 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)]>

關於新舊密碼, 有一個 會話變量: set old_passwords = on| off. 注意是 old_passwordS 加複數, 當開啓 old_passwords後, 適用 password獲得的加密長度就是16位了.

關於適用 mysqladmin 命令來修改 用戶密碼的命令使用 問題

  1. 使用mysqladmin這個命令的時候, 必定要 指明: -uroot, -p : 第一, 若是不指定 -p參數, 會直接提示你沒有使用密碼, 第二, 可是又不能直接在命令中指定 輸入密碼 ,常識: 密碼老是在tty以星號的方式來輸入.
  2. 若是是 第一次, 首次設置密碼, 即原來沒有密碼的話, 直接 用 : mysqladmin -uroot password '123' 沒必要使用 password函數加密, 會自動加密;
  3. 可是 若是已經設置了密碼, 你要修改, 那麼就必須 指定 -p 選項: 即: 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 ~]$

當忘記普通用戶的密碼後, 以root用戶登陸, 能夠 重置 普通用戶foo的密碼:

  1. 在select句子中, 若是字符序列 不加引號的話, 會被看作是 : field, column字段:
相關文章
相關標籤/搜索