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類型的數據表才能支持事務處理!其餘的類型是不支持!
事務只要沒有提交,就能回滾,提交了的事務,是回滾不回來的!