DATE_ADD(date,INTERVAL expr type)
date 參數是合法的日期表達式。expr 參數是您希望添加的時間間隔。多查官方手冊!!
命令行啟動和停止sql服務
net start ?數據庫名; ? ? ?這是啟動服務命令; 例如:net ?start ?Mysql56
net ?stop 數據庫名; ? ? ? 這是關閉服務命令; 例如:net stop ?Mysql56
修改root密碼
方法1: 用SET PASSWORD命令
打開命令行cmd,輸入mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
方法2:用mysqladmin
打開命令行cmd
mysqladmin -u root password "newpass"
如果root已經設置過密碼,采用如下方法
mysqladmin -u root password oldpass "newpass"
導入.sql文件命令:
mysql> SOURCE sql絕對路徑;
導入txt數據
LOAD DATA INFILE 'xxx.txt' into table 表名
字段分隔符:
FIELDS TERMINATED BY '/t' ENCLOSED BY '' ESCAPED BY '//'
行終止符:
LINES TERMINATED BY '/n' STARTING BY ''
1. mysql默認使用tab來分割每行的字段。
2.windows下換行符為"\r\n",而mysql在load data時默認使用"\n"來切割每行記錄
3.linux下換行符為"\n"
示例:
LOAD DATA INFILE?
'text.txt'?
into table text
FIELDS TERMINATED BY ',' ?# 字符之間的分隔符為‘,’
lines terminated by '\r\n' STARTING BY ''; # 每行之間的的分隔為換行符
創建一個數據庫
使用 create database 語句可完成對數據庫的創建, 創建命令的格式如下:
create database 數據庫名 [其他選項];
例如我們需要創建一個名為 samp_db 的數據庫, 在命令行下執行以下命令:
create database samp_db character set gbk;
為了便于在命令提示符下顯示中文, 在創建時通過 character set gbk 將數據庫字符編碼指定為 gbk。創建成功時會得到 Query OK, 1 row affected(0.02 sec) 的響應。
新建的數據庫保存在:C:\ProgramData\MySQL\MySQL Server 5.6\data
創建數據庫表
使用 create table 語句可完成對表的創建, create table 的常見形式:
create table 表名稱(列聲明);
以創建 students 表為例, 表中將存放 學號(id)、姓名(name)、性別(sex)、年齡(age)、聯系電話(tel) 這些內容:
create table students
(
id int unsigned not null auto_increment primary key,
name char(8) not null,
sex char(4) not null,
age tinyint unsigned not null,
tel char(13) null default "-"
);
對于一些較長的語句在命令提示符下可能容易輸錯, 因此我們可以通過任何文本編輯器將語句輸入好后保存為 createtable.sql 的文件中, 通過命令提示符下的文件重定向執行執行該腳本。
打開命令提示符, 輸入: mysql -D samp_db -u root -p < createtable.sql
(提示: 1.如果連接遠程主機請加上 -h 指令; 2. createtable.sql 文件若不在當前工作目錄下需指定文件的完整路徑。)
查看已創建數據庫
使用 show databases; 命令查看已經創建了哪些數據庫。
查看表
1. 使用 show tables; 命令可查看已創建了表的名稱; 2. 使用 describe 表名; 命令可查看已創建的表的詳細信息。
數據操作:
其實我們可以對數據進行的操作也就無非四種,即 CRUD。其中 C 代表添加(Create) ,R 代表查詢(Retrieve) ,U 代表更新(Update) ,D 代表刪除(Delete) 。
添加數據時用 insert,查詢數據時用 select,更新數據時用 update,刪除數據時用 delete。
將查詢結果插入新表
如果表存在:
INSERT INTO TableA(c1,c2,c3)
SELECT TableB.c1,TableB.c2,TableB.c3
FROM TableB;
或者insert into tab1 select * from tab2;?
如果表不存在:?
create table tab1 as select * from tab2;
向表中插入數據
insert 語句可以用來將一行或多行數據插到數據庫表中, 使用的一般形式如下:
insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);
其中 [] 內的內容是可選的
查詢表中的數據
select 語句常用來根據一定的查詢規則到數據庫中獲取數據, 其基本的用法為:
select 列名稱 from 表名稱 [查詢條件];
例如要查詢 students 表中所有學生的名字和年齡, 輸入語句 select name, age from students; 執行結果如下:
mysql> select name, age from students;
也可以使用通配符 * 查詢表中所有的內容, 語句: select * from students;
檢索不同的值:
使用DISTINCT關鍵字,只是數據庫只返回不用的值。如:
SELECT DISTINCT vend_id From Products;
DISTINCT關鍵字作用于所有的列,不僅僅是跟在其后的那一列。
限制結果:
LIMIT指定返回行數,OFFSET指定從第幾行開始(第一個被檢索的行是第0行)。如:
select prod_name from products limit 5 offset 3;
排序檢索數據:
使用ORDER BY [列]子句,以字母順序排序(默認為A~Z升序)數據,。注:ORDER BY 字句應是SELECT語句中最后一條子句。
select prod_name,prod_price,prod_id from products order by prod_price;
ORDER BY [列1],[列2]...當指定列明有多個時,將按多個列排序,排序按列的先后順序為主。如:
select prod_name,prod_price,prod_id from products order by prod_price,prod_name;
也可以按列的位置進行排序,如:
select prod_name,prod_price,prod_id from products order by 2,3;
選擇降序排列:
ORDER BY [列]+ DESC 如:
select prod_id,prod_name,prod_price from products order by prod_price DESC;
DESC關鍵字值應用到直接位于其前面的列名。
注:DESC是DESCENDING的縮寫,相對應的是ASC(ASCENDING),即升序排序,升序是默認的)
過濾數據
使用WHERE語句,如:
select vend_id, prod_name from products where vend_id <> 'DLL01';
注:!= 和 <> 通常可以互換;如果將值與字符串類型的列進行比較,就需要限定引號。
非空: XX is not null
范圍值檢查
使用BETWEEN操作符,連個值之間必須用AND關鍵字分隔,如:
select * from products where prod_price between 3 and 5;
空值檢查
用WHERE子句IS NULL,如:
select cust_name from customers where cust_email is null;
高級數據過濾
AND操作符,如:
select prod_id,prod_name,prod_price,vend_id from products where vend_id = 'DLL01' and prod_price<=4;
OR操作符,如:
select prod_name,prod_price from products where vend_id = 'DLL01' or vend_id = 'BRS01';
注:SQL在處理OR操作符前,優先處理AND操作符。為防止錯誤組合,應使用圓括號對操作符進行明確分組。
IN操作符,用來指定條件范圍,范圍中的每個條件都可以進行匹配。如:
select prod_name,prod_price from products where prod_price in (3.49,4.99,5.99);
IN最大的優點是可以包含其他SELECT語句,能夠更動態地建立WHERE子句。
NOT操作符,用于否定其后所跟的任何條件,如:
select prod_name,prod_price,vend_id from products where not vend_id in ('dll01','brs01');
用通配符進行過濾
LIKE操作符,為在搜索子句中使用通配符,必須使用LIKE操作符。
利用通配符,可以創建比較特定數據的搜索模式,通配符搜索只能用于文本字段(串),非文本數據類型字段不能使用通配符
%通配符,在搜索串中,%表示任何字符出現任意次數,%代表搜索模式中給定位置的0個、1個或者多個字符。如:
select prod_name,prod_price from products where prod_name like '%doll%';
如上,通配符可在任意位置使用,且可以使用多個通配符。
注:1、%不能匹配NULL。2、注意文本字段后面所跟的空格。
_通配符,用途與%一樣,但它只匹配單個字符,而不是多個
非空
is not null?
按特定條件查詢:
where 關鍵詞用于指定查詢條件, 用法形式為: select 列名稱 from 表名稱 where 條件;
mysql> select name, age from students;
更新表中的數據
update 語句可用來修改表中的數據, 基本的使用形式為:
update 表名稱 set 列名稱=新值 where 更新條件;
刪除表中的數據
delete 語句用于刪除表中的數據, 基本用法為:
delete from 表名稱 where 刪除條件;
alter table 語句
用于創建后對表的修改, 基礎用法如下:
添加列
基本形式: alter table 表名 add 列名 列數據類型 [after 插入位置];
示例:
在表的最后追加列 address: alter table students add address char(60);
在名為 age 的列后插入列 birthday: alter table students add birthday date after age;
修改列
基本形式: alter table 表名 change 列名稱 列新名稱 新數據類型;
示例:
將表 tel 列改名為 telphone: alter table students change tel telphone char(13) default "-";
將 name 列的數據類型改為 char(16): alter table students change name name char(16) not null;
刪除列
基本形式: alter table 表名 drop 列名稱;
示例:
刪除 birthday 列: alter table students drop birthday;
重命名表
基本形式: alter table 表名 rename 新表名;
示例:
重命名 students 表為 workmates: alter table students rename workmates;
刪除整張表
基本形式: drop table 表名;
示例: 刪除 workmates 表: drop table workmates;
刪除整個數據庫
基本形式: drop database 數據庫名;
示例: 刪除 samp_db 數據庫: drop database samp_db;
清空整張表
基本形式: TRUNCATE TABLE?表名;
示例: 清空 workmates 表: truncate table workmates;
獲取表信息的方法:
SHOW COLUMNS FROM XXX;
DESCRIBE XXX;
其中,SHOW COLUMNS可以添加where語句。
返回表中的列名:
select column_name from information_schema.columns where table_name='XXX';
統計數據
統計個數:select count(*) from 表名
統計某項個數:
四舍五入:
round()
某列求和:
sum()
字符串
字符串連接:
CONCAT函數,CONCAT函數支持一個或者多個參數,參數類型可以為字符串類型也可以是非字符串類型,對于非字符串類型的參數MYSQL將嘗試將其轉化為字符串類型,CONCAT函數會將所有參數按照參數的順序拼接成一個字符串做為返回值。
例:select CONCAT('123','456')
輸出123456
注:在Mysql中,使用“+”進行字符連接時,mysql會嘗試將字段值轉換為數字類型(如果轉換失敗,就當做數字0處理)。如’1abc’+’22′,mysql將“1abc”轉成數字1在進行運算;將“abc”當做0處理。?
分割:
SUBSTRING_INDEX(str,delim,count)
返回的子字符串str計數前出現的分隔符DELIM。如果計數是正的,左側的最后一個分隔符(從左邊算起)的一切被返回。如果計數為負,一切向右側的最后一個分隔符(計數從右側)將被返回。
例:SELECT SUBSTRING_INDEX('abc.efg', '.', 1);?
輸出abc
時間
MySQL 使用下列數據類型在數據庫中存儲日期或日期/時間值:
DATE - 格式 YYYY-MM-DD
DATETIME - 格式: YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
YEAR - 格式 YYYY 或 YY
當前時間:
NOW() 返回當前的日期和時間
CURDATE() 返回當前的日期
CURTIME() 返回當前的時間
例:SELECT NOW(),CURDATE(),CURTIME() ?#分別顯示當前完整時間,當前日期,具體時間
DATE() 提取日期或日期/時間表達式的日期部分
EXTRACT() 返回日期/時間按的單獨部分
DATE_ADD() 給日期添加指定的時間間隔
DATE_SUB() 從日期減去指定的時間間隔
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)
date 參數是合法的日期表達式。expr 參數是您希望添加的時間間隔。
type 參數可以是下列值:
Type 值 |
---|
MICROSECOND |
SECOND |
MINUTE |
HOUR |
DAY |
WEEK |
MONTH |
QUARTER |
YEAR |
SECOND_MICROSECOND |
MINUTE_MICROSECOND |
MINUTE_SECOND |
HOUR_MICROSECOND |
HOUR_SECOND |
HOUR_MINUTE |
DAY_MICROSECOND |
DAY_SECOND |
DAY_MINUTE |
DAY_HOUR |
YEAR_MONTH |
DATEDIFF() 返回兩個日期之間的天數
DATEDIFF(date1,date2)
date1?和?date2?參數是合法的日期或日期/時間表達式。
DATE_FORMAT() 用不同的格式顯示日期/時間
DATE_FORMAT(date,format)
date 參數是合法的日期。format 規定日期/時間的輸出格式。
可以使用的格式有:
格式 | 描述 |
---|---|
%a | 縮寫星期名 |
%b | 縮寫月名 |
%c | 月,數值 |
%D | 帶有英文前綴的月中的天 |
%d | 月的天,數值(00-31) |
%e | 月的天,數值(0-31) |
%f | 微秒 |
%H | 小時 (00-23) |
%h | 小時 (01-12) |
%I | 小時 (01-12) |
%i | 分鐘,數值(00-59) |
%j | 年的天 (001-366) |
%k | 小時 (0-23) |
%l | 小時 (1-12) |
%M | 月名 |
%m | 月,數值(00-12) |
%p | AM 或 PM |
%r | 時間,12-小時(hh:mm:ss AM 或 PM) |
%S | 秒(00-59) |
%s | 秒(00-59) |
%T | 時間, 24-小時 (hh:mm:ss) |
%U | 周 (00-53) 星期日是一周的第一天 |
%u | 周 (00-53) 星期一是一周的第一天 |
%V | 周 (01-53) 星期日是一周的第一天,與 %X 使用 |
%v | 周 (01-53) 星期一是一周的第一天,與 %x 使用 |
%W | 星期名 |
%w | 周的天 (0=星期日, 6=星期六) |
%X | 年,其中的星期日是周的第一天,4 位,與 %V 使用 |
%x | 年,其中的星期一是周的第一天,4 位,與 %v 使用 |
%Y | 年,4 位 |
%y | 年,2 位 |
WEEKDAY(date)?
返回date的星期索引(0=星期一,1=星期二, ……6= 星期天):
select WEEKDAY('1997-10-04 22:23:00');
-> 5
聯結
SQL最強大的功能之一就是能在數據檢索查詢的執行中聯結表。而聯結表是基于關系表。為什么要用聯結表呢,將數據分解為多個表能夠更有效的存儲,更方便的處理,并且具有更大的可伸縮性。
連接類型
分為三種:交叉連接、內連接、外連接。
交叉連接 cross join
沒有where子句的交叉連接將產生連接表的笛卡爾積。
select * from R cross join S;
結果:和笛卡爾積一樣,如上圖。
select * from R cross join S where R.C = S.C;
內連接 ?
內連接分為三種:自然連接、等值連接、非等值連接。 ??
自然連接 natural join:在連接條件中使用等于=運算符比較被連接列的列值,但刪除連接表中重復列。 ? select * from R natural join S;
等值連接 :使用等于=比較連接列的列值,在查詢結果中列出接連表中的所有列,包括其中的重復列。
select * from R join S where R.C = S.C;或select * from R inner join S where R.C = S.C;
非等值連接 :在連接條件中,可以使用其他比較運算符,比較被連接列的列值,如:<、>、!=等。
外連接?
外連接分為三類:全外連接、左外連接、右外連接。 ??
左外連接 left join / left outer join ? select * from R left join S on R.C = S.C;
左外連接要遍歷左表的所有記錄,右表沒有的用null表示。
右外連接 right join / right outer join
select * from R right join S on R.C = S.C;
右外連接要遍歷右表所有的記錄,左表沒有的用null表示。
全外連接 full join / full outer join
select * from R full join S on R.C = S.C;
存儲過程(相當于函數)
我們常用的操作數據庫語言SQL語句在執行的時候需要要先編譯,然后執行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給定參數(如果該存儲過程帶有參數)來調用執行它。
MySQL存儲過程的調用
用call和你過程名以及一個括號,括號里面根據需要,加入參數,參數包括輸入參數、輸出參數、輸入輸出參數。具體的調用方法可以參看上面的例子。
事務處理
一個事務是一個連續的一組數據庫操作,就好像它是一個單一的工作單元進行。換言之,永遠不會是完整的事務,除非該組內的每個單獨的操作是成功的。如果在事務的任何操作失敗,則整個事務將失敗。
幾個術語:
事務(transaction)指一組sql語句;
start transaction;
回退(rollback)指撤銷指定SQL語句的過程;
rollback to 保留點;
提交(commit)指將未存儲的SQL語句結果寫入數據庫表;在進行顯示提交時,使用commit語句。
保留點(savepoint)指事務處理中設置的臨時占位符,可以對它發布回退;
例:
start transaction;
savepoint delete1;
delete from custcopy where cust_id = '1000000006';
commit;
rollback to delete1;
直接用set來改變mysql的自動提交模式
MYSQL默認是自動提交的,也就是你提交一個QUERY,它就直接執行!我們可以通過
set autocommit=0 ? 禁止自動提交
set autocommit=1 開啟自動提交
來實現事務的處理。
但注意當你用 set autocommit=0 的時候,你以后所有的SQL都將做為事務處理,直到你用commit確認或rollback結束,注意當你結束這個事務的同時也開啟了個新的事務!按第一種方法只將當前的作為一個事務!
個人推薦使用第一種方法!
MYSQL中只有INNODB和BDB類型的數據表才能支持事務處理!其他的類型是不支持的!(切記!)
游標
(一),認識游標(cursor)
就是一個可讀的標識,用來標識數據取到什么地方了。select 語句也許一次性會取出來n條語句,那么游標便可以一次取出來select中的一條記錄。每取出來一條,便向下移動一次!可以實現很復雜邏輯!
注:只能在存儲過程里面定義游標,否則將出現ERROR CODE1064錯誤。
(二),游標特性:1,只讀;2,不滾動;3,不敏感的
(三),使用游標
需要強調的是,游標必須在定義處理程序之前被定義,但變量必須在定義游標之前被定義,順序就是變量定義-游標定義-處理程序。
1.定義游標
DECLARE cursor_name CURSOR FOR select_statement
這個語句聲明一個游標。也可以在子程序中定義多個游標,一個塊中的每一個游標必須命名唯一。聲明游標后也是單條操作的。
2. 游標OPEN
OPEN cursor_name
這個語句打開先前聲明的游標。
3. 游標FETCH
FETCH cursor_name INTO var_name [, var_name] ...
這個語句用指定的打開游標讀取下一行(如果有下一行的話),并且前進游標指針至該行。
4. 游標CLOSE
CLOSE cursor_name
這個語句關閉先前打開的游標,注意,用完后必須關閉。
例-將用戶名全部輸出,中間用分隔符隔開:
drop procedure if exists curdemo;
delimiter //
create procedure curdemo()
beginDECLARE done INT DEFAULT FALSE;declare tmpName varchar(20) default '' ; declare allName varchar(255) default '' ; declare custCursor cursor for select cust_name from customers where cust_email is null;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 設置游標的countinue handleropen custCursor; -- 打開游標fetch custCursor into tmpName;while (done = false) doset tmpName = concat(tmpName,";");set allName = concat(allName,tmpName);fetch custCursor into tmpName;end while;close custCursor;select allName;
end;//
delimiter ;
call curdemo();
DELIMITER 分隔符
DELIMITER是分割符的意思。一般用于存儲過程前聲明分隔符。
因為MySQL默認以";"為分隔符,如果我們沒有聲明分割符,那么編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼,不會執行這些代碼,用完了之后要把分隔符還原。
使用多重語句需要客戶端能發送包含語句定界符;的查詢字符串。這個符號在命令行客戶端被用delimiter命令來處理。改變查詢結尾定界符;(比如改變為//)使得; 可被用在子程序體中。?
總結起來就是因為存儲過程里包含很多含缺省界定符號“;”的語句,如果不重新定義界定符的話,就只能以“;”為界定符一句一句的發給Mysql服務端解析。
例:delimiter // -- 指定分隔符為//
查看當前數據庫的編碼格式:
?mysql>status;或者show variables like 'character%' ;
? 上面顯示server characterset : 數據庫服務器編碼格式
Db characterset : 數據庫編碼格式
Client characterset : 數據庫客戶端編碼格式
Conn. characterset : 數據庫連接編碼格式
設置編碼格式:
set names 'gb2312'
通過set命令只能夠設置Db、Client、Conn的編碼格式,在設置編碼格式過程中,如果不知道當前安裝的數據庫到底有多少種編碼格式那么可以通過show character set;命令顯示當前數據庫的所有編碼格式集合。如果想要修改server的編碼格式在我看來只能夠重裝數據庫了(目前還不了解如何去設置), 因為有些時候迫使你不得不去重新安裝數據庫。