mysql語法充電

1.關鍵字delimiter 的做用php

  ①delimiter叫作「定界符」  ,常常能夠在複合sql語句或者存儲過程等語句中看到 DELIMITER $$ 的內容,html

  ②DELIMITER $$的意義是告訴mysql解釋器,命令的結束符號是$$,當解析sql語句遇到$$符號時,就能夠執行sql語句了。mysql

  ③DELIMETER定義定界符,這個符號能夠是任意符號(只要不與sql語句衝突),sql

  ④默認狀況下,delimiter是分號;在命令行客戶端中,若是有一行命令以分號結束,數據庫

    那麼回車後,mysql將會執行該命令。如輸入下面的語句
   mysql> select * from test_table;
   而後回車,那麼MySQL將當即執行該語句。
緩存

  ⑤更改了默認的定界符;爲其餘符號的時候,記得要改回默認的;,由於,執行sql語句時;分號已經是約定俗成的符號了。函數

 

2.mysql5.一、5.5等不一樣版本數據遷移時會出現的錯誤以及解決方案,ui

 ①存儲過程的定義存儲在mysql數據庫的proc表中,proc中的comment字段的類型在mysql5.1的版本中是char(64)類型的,然而在mysql5.5版本中是text類型的,在這兩個版本的mysql進行數據遷移時,要注意更改comment的類型。url

 不修改的話會報錯"Cannot load from mysql.proc. The table is probably corrupted",spa

 關於這個報錯信息可參考http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28212952&id=3407891

http://wenku.baidu.com/link?url=exER7FiGM7PSzueM4cwJtDR5lz9jO4SQc044_a5RsBK6axIQxhODQoTEjL7e9OIhxXHx15tqcKQqXyNbHhaMJ9IKF2vknCts3vc2QnZp8hC

3.mysql命令行操做界面中使用\G能夠將打印的內容變成列狀顯示,標題在左列,

4.mysql命令行操做界面下查看存儲過程的信息的sql語句

  show create procedure XXX存儲過程名稱 \G

 5.sql語句中嵌套IF、Case、When語句:

  參考http://blog.knowsky.com/240220.htm

    http://blog.csdn.net/zoohouse/article/details/5800799

 6.用戶訪問權限設置

  GRANT ALL PRIVILEGES ON db1.* TO 'user1'@'192.168.1.1' IDENTIFIED BY '1234556' WITH GRANT OPTION; 

 最大權限GRANT ALL PRIVILEGES ON *.* TO 'user1'@'%' IDENTIFIED BY '1234556' WITH GRANT OPTION; 

7.查詢顯示序號的sql,

情景案例:根據字段分頁順序查詢tab1,顯示每條記錄的排名,假如每頁記錄數目是size,頁碼是page,第一頁的頁碼是0,則每頁的起始排名是size*page+1,

即@rownum:=size*page,sql語句爲:

SELECT (@rownum:=@rownum+1) AS rankno,t1.* FROM tab1 as t1 ,(SELECT @rownum:=size*page) b ORDER BY score LIMIT page,size

 

8.having、where的不一樣:where 的做用是對查詢結果進行分組前,將不符合where條件的行去掉,having 子句的做用是篩選知足條件的組,

  select A,count(B) as num1 from tab1 group by A having C='XX',這樣寫是錯誤的,select 中沒有C列,查詢結果集中沒有C列值,having也就無法對C進行篩選了,

應該改成select A,count(B) as num1,C from tab1 group by A having C='XX'

(ps:group by語句的意義在於分組查詢後進行聚合函數運算統計,若是隻是顯示列值就不合適了,在having執行的前面,group by 後面接的having通常是表達式,若是是字段值判斷,必定要確保是分組以前該字段的值是惟一的,因此通常要求判斷這個字段就是分組的字段

 9.Group By 和 Having, Where ,Order by這些關鍵字是按照以下順序進行執行的:Where, Group By, Having, Order by,

  參考:http://www.chengxuyuans.com/MySQL/63991.html

 

10.建立用戶:參考 http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73260878e482a958448e435061e5a35bfe87969585393d82f2747f41802bdb12b71350527b59ec89f4aaae1d477719c6269304a891e59925af1dc4755d650964d99a90e97cce74199b9d3a3c82252dd22046df0809c2905&p=aa759a43d48a57f20be296375857&newp=9b6c861f86cc47ad01be9b7c1c6492695d0fc20e39d2db4c&user=baidu&fm=sc&query=mysql%B4%B4%BD%A8%D3%C3%BB%A7&qid=a5e398780002a9d7&p1=1

 insert into mysql.user(Host,User,Password) values("localhost","phplamp",password("1234"));

 刷新系統權限表

 flush privileges;

 11.時間戳和日期轉換:

 FROM_UNIXTIME( ):轉爲時間戳類型時間
UNIX_TIMESTAMP( ) :返回長整形類型時間

例如:

SELECT FROM_UNIXTIME(1234567890, '%Y-%m-%d %H:%i:%S')

mysql>SELECT FROM_UNIXTIME( 1249488000, '%Y年%m月%d' ) 
->2007年11月20 

mysql> SELECT UNIX_TIMESTAMP('2009-08-06') ; 
->1249488000 

 12.表結構相同時A表數據導入B表:

INSERT INTO table_B SELECT * FROM table_A

特殊數據導入

A表有id,n1,n2,n3字段

B表有id,n1,n2,n3,n4,n5等字段

現將B表中的n1,n2,n3組合的記錄去重後導入A表中,而且A表主鍵也要錄入值

sql語句:

INSERT INTO A表(id,n1,n2,n3)
select @row :=@row+1 AS id,t1.* from
(
SELECT DISTINCT ,n1,n2,n3 FROM B表
) t1,(select @row :=0) as t2

 

 

13.表字段數字類型float、double、decimal、numeric

  float能夠表示小數,佔4字節,double佔8字節,double比float能存儲更多的小數位,二者當接收到整數時會默認存儲整數值,不加小數點,0.00實際存儲的是0

  decimal(M,D)能夠指定精度度最大是M位(不含小數部分)數字精確到小數點後D位,默認M是10,,如decimal(5,2)表明最大能夠存儲99999.99的數字

  numeric會自動轉化爲decimal,

  DECIMAL與FLOAT和DOUBLE的區別是:
  DECIMAL類型的值是以字符串的形式被儲存起來的,它的小數位數是固定的。
  它的優勢是,不會象 FLOAT和DOUBLE類型數據列那樣進行四捨五入而產生偏差,因此很適合用於財務計算;
  而它的缺點是:因爲它的存儲格式不一樣,CPU不能對它進行直接運算,從而影響運算效率。
  DECIMAL(M,D)總共要佔用M+2個字節。

14. mysql中自增字段id的那些事

  ①實際能夠顯示傳值插入數據,例如insert into student(id,name,age) values(10,'james',12);

      ②自動插入id時,會在當前全部記錄中的id最大值加1

      ③刪除的記錄行,新增記錄將會首先填補這些行的位置,可是自增id不會恢復原來被刪除的id值

 

15.修改密碼

use mysql;

update user set password = PASSWORD('new password') where user = ''root;

小提示:若是是mysql5.6以上安裝了密碼強度檢測插件的,強制要求密碼強度50以上的才能設置成功,

查看密碼強度select VALIDATE_PASSWORD_STRENGTH('uqIsTpYmq7%Z');

若是是mysql 5.7以上版本,user表中沒有password字段,取而代之的是authentication_string字段

update user set authentication_string = PASSWORD('uqIsTpYmq7%Z') where user = 'root';

 最後刷新相關緩存:

flush privileges;

 

 

16.Mysql字符串拼接,用函數CONCAT('a','b') 結果是'ab'

 

17.mysql計算保留一位小數

CAST(age/10 AS DECIMAL(9,1))  //將age字段值除以10獲得結果保留1位小數

 

18.Got a packet bigger than ‘max_allowed_packet’ bytes的解決方法:

數據導入報錯:Got a packet bigger than‘max_allowed_packet’bytes的問題

這個問題能夠有2個解決方法:

1.臨時修改:mysql>set global max_allowed_packet=524288000;修改 #512M

2.修改my.cnf,需重啓mysql

在 [MySQLd] 部分添加一句(若是存在,調整其值就能夠):
max_allowed_packet=256M (根據實際狀況調整數值)

 

19. DELETE和 EXISTS配合刪除記錄的方法:

DELETE t1 FROM schools AS t1
WHERE NOT EXISTS
(
    SELECT * FROM students AS t2
    WHERE t1.`school_id` = t2.`id`
)

 

20.用sql查看日誌狀況

SHOW VARIABLES LIKE 'log_%';

   錯誤日誌:     -log-err    查詢日誌:     -log    慢查詢日誌:   -log-slow-queries    更新日誌:     -log-update    二進制日誌: -log-bin
相關文章
相關標籤/搜索