總結: MySQL(基礎,字段約束,索引,外鍵,存儲過程,事務)操做語法

 

1. 顯示數據庫列表 mysql

show databases; # 查看當前全部數據庫 sql

show databases \G   #以行的方式顯示 shell

2. 在命令行中,執行sql語句 數據庫

mysql -e 'show databases' -uroot -p123456 express

mysqlshow -uroot -p123456 # 不經常使用,記住上面那個就好了 編程

3.建立數據庫語法 windows

create database 數據庫名; 編程語言

例如: create database `HA-test`; 函數

4. 切換數據庫 oop

use HA-test;

5. 登錄時,直接切換到指定數據庫

mysql -uroot -p123456 <數據庫名>

6. 查看數據庫當前時間,用戶,和當前數據庫

select now(),user(),database();

7.刪除數據庫

Way 1:

drop database <數據庫名>;

Way 2: 直接從數據庫數據目錄中,將對應文件刪除

cd /usr/local/mysql/data

# 切換到數據庫存放目錄, /etc/my.cnf 能夠查到

mv HA@002dtest /tmp

8. if (not) exists

# 建立和刪除時,檢查是否存在,在shell編程中,可用到

drop database if exists `HA-test`;

create database if not exists HA;

9. 建立表

create table student(

    id int(20),

name char(40),

age int);

10. 切換數據庫後,查看當前數據庫中的全部表

use HA;

show tables;

11. 查看錶結構 desc # 還有一層意思,在order by 後面,表示降序排列

desc student;

mysql> explain mysql.user; # 相似 desc mysql.user;

mysql> show columns from mysql.user;

mysql> show fields from mysql.user;

mysql> show columns from mysql.user like '%user';

12. 查看錶建立語句 # \G 按行顯示

show create table student \G

13. 建立表時,使用指定存儲引擎和字符集

CREATE TABLE `student` (

  `id` int(20) DEFAULT NULL,

  `name` char(40) DEFAULT NULL,

  `age` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

## ---> 可在建立表時,指定存儲引擎和字符集

13. 刪除表

drop table student2;

14. 禁止預讀表信息

mysql> use performance_schema;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

mysql -uroot –p123456 -A # 禁止預讀表信息

# 在登陸mysql時,添加-A選項

14. 修改表的屬性信息

alter table 表名

    add 字段名

列類型

[not null|null][primary key][unique][auto_increment][default value]

14.1 修改表名稱

alter table 表名 rename 新表名;

14.2 修改表中字段類型

alter table 表名 modify 要修改的字段名 要修改的類型;

14.3 修改表中字段的名稱 ---> 此時必須指定類型,即便不改變類型

alter table 表名 change 原字段名 新字段名 新字段類型;

14.4 向表中添加新的字段

alter table 表名 add 字段名 字段類型;

14.5 指定添加的字段位置

# 字段位於第一行

alter table students add uid int(10) first;

# 字段位於age後

alter table students add address char(40) after age;

14.6 刪除表中字段

alter table 表名 drop 字段名 ;

15.1 向表中插入信息

Way 1:

insert [into] 數據表名稱 [(字段列表)] values|value

(表達式|null|default,...),

(表達式|null|default,...)

Way 2:

insert [into] 數據表名稱 set

字段名稱=值,

...

區別:insert與insert...set的區別--->insert...set能夠帶有子查詢.

15.2 向表中插入信息的其餘方式

Way 1:字段值的順序與建表時順序相同

insert into 表名 values (字段值1,字段值2, 字段值3);

Way 2: 字段名=字段值,此方式不用糾結順序

insert into 表名 values ( 字段名=字段值,...);

Way 3: 按照前面指定的字段名順序

insert into 表名 (字段名,字段名...) values (字段值,字段值...);

Way 4: 插入多條數據

insert into 表名 values

(字段值,字段值...),

(字段值,字段值...)...;

16. 查看錶中信息 select語句

查看錶中全部信息 * 表明表中全部字段

select * from 表名稱;

查看指定一個或多個字段信息

select 字段名,字段名... from 表名稱;

跨數據庫查看

SELECT 字段 FROM 數據庫名.表名;

17. 刪除表中信息

delete from 數據表名稱 [where 條件]

若是省略where條件,將刪除所有記錄

delete from students where id=3;

delete from students where age is null;

delete from students; # 刪除表中全部記錄

18. 修改 更新表中信息

update 數據表名稱 set 字段名稱=值,... [where 條件]

若是省略WHERE條件將更新所有記錄.

update students set sex='M' where id=2;

update students set id=2;  全部的都變爲2

update students set stname='zhangsan',age=21 where uid=1;

19. where子句

select 字段名1,字段名2 from 表名 [where 條件];

20. 查詢結果去重

select distinct name,age from students;

select  distinct id,name,age from students where id=3;

distinct 只針對查詢語句 直接處理查詢出的記過,不對數據庫中的實際數據產生影響

21. and or多條件查詢

# and優先級高於or,同時出現,沒有括號的狀況下,先and後or

使用and和or進行多條件查詢

or和and 同時存在時,先算and的兩邊值,邏輯與先執行

select id,name,age from students where id>3 and age>25;

22. binary 類型轉換運算符

# 解決查詢中大小寫不區分的問題 

mysql查詢中不區分大小寫,可加修飾符 binary解決

select * from students where binary name='jk';

BINARY是類型轉換運算符

它用來強制它後面的字符串爲一個二進制字符串,能夠理解爲在字符串比較的時候區分大小寫.

select 字段列表 from 數據表 [[as] 別名] [where 條件]

23. 別名的使用

別名:

數據表 [[as] 別名]

select AA.money,BB.name from

    product_offer_instance_object_xxx as AA ,

    product_offer_instance_object_ZZZ BB

    where AA.id = BB.id

字段名稱 [[as]別名]

例如:

select product_offer_instance_object_id as ID,

product_offer_instance_object_name name,

coumn33 ‘金額’ from tablename;

24. 對查詢結果進行排序處理

# 按照指定的一個或多個字段排序

# 可以使用去重複字段

select distinct 字段1,字段2 from 表名order by 字段名;

asc 升序 默認

desc 降序

select distinct id from students order by id desc;

排序:

升序:order by 「排序的字段」 asc  默認

降序:oredr by 「排序的字段」 desc

多個字段排序

select bName,price from books where price  in (50,60,70) order by price desc,bName desc;

表中數據增刪改查總結

select語句返回零條或多條記錄;屬於記錄讀操做

insert、update、delete只返回這次操做影響的記錄數;屬於寫操做

25. mysql數據庫中的函數

select now(); -- 打印當前的日期和時間

select curdate(); -- 打印當前的日期

select curtime(); -- 打印當前的時間

select database();-- 打印當前數據庫

select version(); -- 打印MySQL版本

select user(); -- 打印當前用戶

26. mysql數據庫的一些信息查詢方式

show variables;--查看系統信息

show global variables; --查看全局變量

show global variables like '%version%'; --查看版本信息

show variables like '%storage_engine%'; --默認的存儲引擎

show engines;--查看支持哪些存儲引擎

show status;--查看系統運行狀態信息

show global status like 'Thread%'; --查看當前運行狀態

27. 幫助

help show;

? show;

28. 數據庫導入

導入數據庫前必須建立一個空數據庫

Way 1:

create database book;

mysql -uroot -p123456 book < book.sql

Way 2:

create database book;

mysql> use book;

mysql> source /root/book.sql  #sql腳本的路徑 此路徑可爲當前路徑相對路徑

29. 數據庫導出

導出數據庫:

Usage:

    mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名

30. 查詢結果導出  outfile # mysql用戶須要對導出的路徑有訪問權限

例如:

select * into outfile '/tmp/123.txt' from books;

select name,ctfid,birthday,mobile,tel,email from info where ctfid like '130000%' into outfile '/tmp/fuping-of-rujia';

select bName,publishing,price from books where price=30 or price=40 or price=50 or price=60;

31.

in 運算符

IN 運算符用於 WHERE 表達式中,以列表項的形式支持多個選擇,語法以下:

WHERE column IN (value1,value2,...)

WHERE column NOT IN (value1,value2,...)

Not in 與in相反

當 IN 前面加上 NOT 運算符時,表示與 IN 相反的意思,即不在這些列表項內選擇.

32. 算術運算符

= 等於,<> 不等於  !=,> 大於,< 小於,>= 大於等於,<= 小於等於

33. 範圍運算

[not] between ....and....

Between and 可使用大於小於的方式來代替,而且使用大於小於意義表述更明確

查詢範圍總結 :

這裏的查詢條件有三種:between...and,or 和 in

(30,60) >30 and <60

[30,60] >=30 and <=60

模糊匹配查詢:

字段名 [not]like '通配符'  ----》% 任意多個字符

例如

select * from students where stname like '%l%1%2%3%';

34. MySQL子查詢:

概念:在select 的where條件中又出現了select

查詢中嵌套着查詢

select * from book where price=(select max(price) from book);

35. Limit限定顯示的條目:

Usage:

SELECT * FROM table LIMIT [offset,] rows

offset 偏移量,rows行數

好比select * from table limit m,n語句

表示其中m是指記錄開始的index,從0開始,表示第一條記錄

n是指從第m+1條開始,取n條.

36. 多行子查詢: all表示小於子查詢中返回所有值中的最小值

mysql> select bName,price from books where price<(select price from books where publishing="電子工業出版社" order by price asc limit 0,1);

mysql> select bName,price from books where price<all(select price from books where publishing="電子工業出版社");

37. 鏈接查詢:

內鏈接Usage:

select 字段  from 表1 inner join 表2  on 表1.字段=表2.字段

外鏈接

左鏈接: select  字段 from a表 left join b表  on 鏈接條件

右鏈接: select 字段 from a表 right join  b表 on 條件

右鏈接,能夠多表鏈接

38. 聚合函數  --> 函數:執行特定功能的代碼塊.

算數運算函數:

38.1 求和: Sum() --顯示全部圖書單價的總合

select sum(price) from books;

38.2 平均值:avg()

例如:求書籍Id小於3的全部書籍的平均價格

mysql> select avg(price) from books where bId<=3;

例如:查詢書籍的價格小於全部數據平均價格的數目 (嵌套子查詢)

select bName,price from books

        where price< (

        select avg(price) from books );

38.3 最大值:max()

求全部圖書中價格最貴的書籍

mysql> select bName,max(price) from books; # 這種方法是錯誤的

mysql> select bName,price from books where price=(select max(price) from books);

38.4 最小值:min()

求全部圖書中價格便宜的書籍

mysql> select bName,price from books where price=(select min(price) from books);

38.5 count()統計記錄數:

統計價格大於40的書籍數量

mysql> select count(*) from books where price>40;

Count()中還能夠增長你須要的內容,好比增長distinct來配合使用

38.6 字符串函數 substr(string ,start,len)

截取:從start開始,截取len長.

# start 從1開始算起.

mysql> select substr(bTypeName,1,6)from category where bTypeId=10;

例如: 截取漢字

mysql> select substr(bTypeName,8,10)from category where bTypeId=1;

+------------------------+

| substr(bTypeName,8,10) |

+------------------------+

| 應用                   |  windows應用

+------------------------+

38.7 大小寫轉換  # 大小寫轉換,不能針對中文,會出現亂碼

大寫: upper()

mysql> select upper(bname) from books where bId=9; # 有中文會出現

小寫: lower()

mysql> select lower(bName) from books where bId=10;

38.8 日期

當前日期: curdate():

當前時間: curtime();

當前日期和時間: now();

39. 算數運算: + - * /  # 注意,mysql中沒有自加自減 ++ +=

給全部價格小於40元的書籍,漲價5元

mysql> update books set price=price+5 where price<40;

給全部價格高於70元的書籍打8折

mysql> update books set price=price*0.8 where price>70;

40. 字段修飾符

[not null|null][primary key][unique][auto_increment][default value]

40.1 null和not null修飾符

40.2 default 設定字段的默認值

總結 :

若是字段沒有設定default ,mysql依據這個字段是null仍是not null,若是爲能夠爲null,則爲null.若是不能夠爲null,報錯..

若是時間字段,默認爲當前時間 ,插入0時,默認爲當前時間.

若是是enum 類型,默認爲第一個元素.

40.3 auto_increment字段約束  自動增加 只能修飾 int字段.

對於主鍵,這是很是 有用的. 能夠爲每條記錄建立一個唯一的標識符

41. 清空表中全部記錄

方法一:delete 不加where條件,清空全部表記錄.

可是delete不會清零auto_increment 值

方法二:truncate

做用: 刪除表的全部記錄,並清零auto_increment 值.新插入的記錄從1開始.

Usage: truncate  table  name;

42. 索引 比如是一本書前面的目錄

42.1 最基本的索引,不具有惟一性,就是加快查詢速度

方法一:建立表時添加索引

create table 表名(

列定義

index 索引名稱 (字段)

index 索引名稱 (字段);

注:可使用key,也可使用index .index 索引名稱 (字段) ,索引名稱,能夠加也能夠不加,不加使用字段名做爲索引名.

方法二: 當表建立完成後,使用alter爲表添加索引:

alter table 表名 add index 索引名稱 (字段1,字段2.....);

42.2 查看索引 desc

desc demo; # 查看錶的描述信息,在Key那一列能夠看到

42.3 刪除索引

alter table demo drop key pwd; 注意此處的pwd指的是索引的名稱,而不是表中pwd的那個字段

42.4 添加索引

mysql> alter table demo add key(pwd);

42.5 惟一索引 索引列的全部值都只能出現一次,即必須惟一

惟一性容許有NULL值<容許爲空>

建立惟一索引:

方法一:建立表時加惟一索引

create table 表名(

列定義:

unique key 索引名 (字段);

);

方法二:修改表時加惟一索引

alter table 表名 add unique 索引名 (字段);

42.6 主鍵索引 按主鍵查詢是最快的,每一個表只能有一個主鍵列

方法一:建立表建立主鍵索引

create table demo4 (

        id int(4) not null auto_increment primary key,

name varchar(4) not null );

create table demo5(

        id int(4) not null auto_increment,

name varchar(20) default null,

primary key(id));

show index from demo5 \G --查看錶中索引

方法二:建立表後添加<不推薦>

mysql> alter table demo5 change id id int(4) not null primary key auto_increment;

42.7 刪除主鍵索引測試 auto_increment

刪除遇到這種狀況是auto_increment的緣由

mysql> alter table demo5 change id id int(4) not null;

mysql> alter table demo5 drop primary key;

總結:主鍵索引,惟一性索引區別:主鍵索引不能有NULL,惟一性索引能夠有空值

複合索引

索引能夠包含一個、兩個或更多個列.兩個或更多個列上的索引被稱做複合索引

43. 聯合主鍵 建立舉例

create table firewall (

host varchar(15) not null ,

port smallint(4) not null ,

access enum('deny','allow') not null,

primary key (host,port)); # 聯合主鍵只能在最後面弄

44. 總結:建表的時候若是加各類索引,順序以下:

create table 表名(

字段定義,

PRIMARYKEY  (`bId`),

UNIQUE KEY `bi` (`bImg`),

KEY `bn` (`bName`),

KEY `ba` (`author`));

45. 全文索引只能用在 varchar text

建立全文索引:

方法一:建立表時建立

create table 表名(

列定義,

fulltext key 索引名 (字段));

方法二:修改表時添加

alter table 表名 add fulltext 索引名 (字段);

強烈注意:MySQL自帶的全文索引只能用於數據庫引擎爲MyISAM的數據表,若是是其餘數據引擎,則全文索引不會生效

MySQL自帶的全文索引只能對英文進行全文檢索,目前沒法對中文進行全文檢索.

通常交給第三方軟件進行全文索引

http://sphinxsearch.com/

46. 外鍵約束 foreign key

建立外鍵約束:

方法一:經過create table建立外鍵

Usage:

create table 數據表名稱(

...,

[CONSTRAINT [約束名稱]]

FOREIGN KEY [外鍵字段] REFERENCES

[外鍵表名](外鍵字段,外鍵字段2…..)

[ON DELETE [ CASCADE | RESTRICT] ]

[ON UPDATE [ CASCADE | RESTRICT] ]);

Usage:(精簡版)

foreign key 當前表的字段  references

外部表名 (關聯的字段)

type=innodb

注:建立成功,必須知足如下4個條件:

一、確保參照的表和字段存在.

二、組成外鍵的字段被索引.

三、必須使用type指定存儲引擎爲:innodb.

四、外鍵字段和關聯字段,數據類型必須一致.

#建立時,若是表名是sql關鍵字,使用時,須要使用反引號``

方法二:經過alter table 建立外鍵和級聯更新,級聯刪除

Usage:

alter table 數據表名稱 add

[constraint [約束名稱] ]  foreign key (外鍵字段,..) references

數據表(參照字段,...)

[on update cascade|set null|no action]

[on delete cascade|set null|no action]) type=innodb;

46.1 查看外鍵信息

mysql> show create table order1;

46.2 刪除外鍵:

Usage:

alter table 數據表名稱 drop foreign key 約束(外鍵)名稱

47. 視圖

47.1 建立視圖

Usage:

create view視圖名稱(即虛擬的表名) as select 語句

47.2 查看建立視圖的語句

show create view bc \G

47.3 更新或修改視圖

Usage:

alter view視圖名稱(即虛擬的表名) as select 語句.

update view視圖名稱(即虛擬的表名)set 

# 通常數據庫中視圖是不支持更新和修改的

update bc set bName='HA' where price=34;

47.4 刪除視圖

drop view 視圖名;

48. 修改sql執行符號

# 注意,在定義存儲過程前,最好使用 delimiter 來修改執行符號

# 否則在寫存儲過程的時候,會提早終止

Usage:

delimiter 新執行符號

49. 定義存儲過程

Usage:

create procedure 過程名(參數1,參數2....)

begin

sql語句;

end

*). 查看存儲過程

A). 查看存儲過程內容:

show create procedure [存儲過程名稱] \G

B). 查看存儲過程狀態:

show procedure status \G  查看全部存儲過程

*). 修改存儲過程:

使用alter語句修改

ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]

characteristic:

{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

| SQL SECURITY { DEFINER | INVOKER }

| COMMENT 'string'

sp_name參數表示存儲過程或函數的名稱

characteristic參數指定存儲函數的特性

CONTAINS SQL表示子程序包含SQL語句,但不包含讀或寫數據的語句;

NO SQL表示子程序中不包含SQL語句

READS SQL DATA表示子程序中包含讀數據的語句

MODIFIES SQL DATA表示子程序中包含寫數據的語句

SQL SECURITY { DEFINER | INVOKER }指明誰有權限來執行

DEFINER表示只有定義者本身才可以執行

INVOKER表示調用者能夠執行

COMMENT 'string'是註釋信息.

--

/**/

*). 刪除存儲過程

Usage:

方法一:DROP  PROCEDURE  過程名

mysql> drop procedure p_inout;

方法二:DROP PROCEDURE  IF  EXISTS存儲過程名

這個語句被用來移除一個存儲程序.不能在一個存儲過程當中刪除另外一個存儲過程,只能調用另外一個存儲過程

49.1 調用存儲過程

Usage:

call 過程名(參數1,參數2);

49.2 存儲過程參數類型

In參數  特色:讀取外部變量值,且有效範圍僅限存儲過程內部

Out參數  特色:不讀取外部變量值,在存儲過程執行完畢後保留新值

set @p_out=1; # 定義變量時建議加個@ 編譯辨認,一眼就看出來了

Inout參數  特色:讀取外部變量,在存儲過程執行完後保留新值<相似銀行存款>

49.3 存儲過程變量的使用

變量定義:

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];

datatype爲MySQL的數據類型,如:int, float, date, varchar(length)

變量賦值: SET 變量名 = 表達式值 [,variable_name = expression ...]

變量賦值能夠在不一樣的存儲過程當中繼承

49.4 存儲過程語句的註釋

「--「:單行註釋

「/*…..*/」:通常用於多行註釋

50. 變量做用域 參考編程語言中的做用域

51. 存儲過程流程控制語句

51.1 條件語句

Usage:

*1). 單分支:

if [判斷條件] then

...

end if

*2). 雙分支:

if [判斷條件] then

...

else

...

end if

51.2 case分支語句:

Usage:

case [變量名]

when [變量值] then

...

when [變量值] then

...

else

...

end case;

51.3 循環控制語句

*1). while循環

whlie [判斷條件] do

...

end while;

*2). repeat循環

set v=0; --設置循環變量

repeat --標記循環開始

...  -- 循環語句

set v=v+1; --循環值改變

until v>=5  --循環判斷條件

end repeat;  --循環結束標記

*3). loop循環

# loop循環不須要初始條件,

# leave 的意思是結束循環

LOOP_LABLE: loop

...

set v=v+1;

if v>=5 then

leave LOOP_LABLE;

end if;

end loop;

*4). LABLES 標號

標號能夠用在 begin repeat while loop 語句前

只能在合法的語句前使用 (不推薦,容易亂)

*5). ITERATE 迭代

經過引用複合語句的標號,來重新開始複合語句

52. 觸發器:

52.1 建立觸發器:

Usage:

create  trigger 觸發器名稱 

觸發的時機 觸發的動做  on 表名 for each row

觸發器狀態.

參數說明:

觸發器名稱:本身定義

觸發的時機:before /after  在執行動做以前仍是以後

觸發的動做:指的激發觸發程序的語句類型<insert ,update,delete>

觸發器建立語法四要素:

1.監視地點(table)

2.監視事件(insert/update/delete)

3.觸發時間(after/before)

4.觸發事件(insert/update/delete)

例如:

mysql> delimiter //

mysql> create trigger delCategory after delete on category for each row

    -> delete from books where bTypeId=3;

    -> //

52.2 查看觸發器:

1). 查看建立過程

mysql> show create trigger delCategory\G

2). 查看觸發器詳細信息

mysql> show triggers\G   這個查看全部的

52.3 刪除觸發器:

Usage:

   drop trigger  觸發器名稱;

mysql> drop trigger delCategory;

觸發器是否是永久保留?

53. 事務

MySQL事務處理的方法:

一、用BEGIN,ROLLBACK,COMMIT來實現

START TRANSACTION | BEGIN [WORK]  開啓事務

COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 提交當前事務,執行永久操做.

ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 回滾當前事務到開始點,取消上一次開始點後的全部操做.

SAVEPOINT 名稱   折返點

二、直接用set來改變mysql的自動提交模式

   MYSQL默認是自動提交的,也就是你提交一個QUERY,它就直接執行!

SET AUTOCOMMIT = {0 | 1}

# 設置事務是否自動提交,默認是自動提交的.

0:禁止自動提交

1:開啓自動提交.

※ MYSQL中只有INNODB和BDB類型的數據表才能支持事務處理!其餘的類型是不支持!

事務只要沒有提交,就能回滾,提交了的事務,是回滾不回來的!

相關文章
相關標籤/搜索