1. 程式人生 > 實用技巧 >mysql語句的使用細節詳情

mysql語句的使用細節詳情

#登入資料庫
mysql -hlocalhost -uroot -p;
#修改密碼
mysqladmin -uroot -pold password new;


#顯示資料庫
show databases;
#顯示資料表
show tables;
#選擇資料庫
use examples;
#建立資料庫並設定編碼utf-8 多語言
create database `examples` default character set utf8 collate utf8_general_ci;
#刪除資料庫
drop database examples;
#建立表
create table test(
id int(10) unsigned zerofill not null auto_increment,
email varchar(40) not null,
ip varchar(15) not null,
state int(10) not null default '-1',
primary key (id)
)engine=InnoDB;
#顯示錶結構
describe
#刪除表
drop table test;
#重命名錶
alter table test_old rename test_new;
#新增列
alter table test add cn int(4) not null;
#修改列
alter table test change id id1 varchar(10) not null;
#刪除列
alter table test drop cn;
#建立索引
alter table test add index (cn,id);
#刪除索引
alter table test drop index cn
#插入資料
insert into test (id,email,ip,state) values(2,'[email protected]','127.0.0.1','0');
#刪除資料
delete from test where id = 1;
#修改資料
update test set id='1',email='[email protected]' where id=1;
#查資料
select * from test; #取所有資料
select * from test limit 0,2; #取前兩條資料
select * from test email like '%qq%' #查含有qq字元 _表示一個 %表示多個
select * from test order by id asc;#降序desc
select * from test id not in('2','3');#id不含2,3或者去掉not表示含有
select * from test timer between 1 and 10;#資料在1,10之間

#---------------------------表連線知識------------------------------
#等值連線又叫內連結 inner join 只返回兩個表中連線欄位相等的行
select * from A inner join B on A.id = B.id; #寫法1
select * from A,B where A.id = B.id; #寫法2
select a.id,a.title from A a inner join B b on a.id=b.id and a.id=1;#寫法3 表的臨時名稱
select a.id as ID,a.title as 標題 from A inner join B on A.id=B.id;#新增as字句

#左連線又叫外連線 left join 返回左表中所有記錄和右表中連線欄位相等的記錄
select * from A left join B on A.id = B.id;

select * from A left join (B,C,D) on (B.i1=A.i1 and C.i2=A.i2 and D.i3 = A.i3);#複雜連線

#右連線又叫外連線 right join 返回右表中所有記錄和左表中連線欄位相等的記錄
select * from A right join B on A.id = B.id;

#完整外部連結 full join 返回左右表中所有資料
select * from A full join B on A.id = B.id;

#交叉連線 沒有where字句 返回卡迪爾積
select * from A cross join B;
-------------------------表連線結束------------------------------------------------------------
-----------------索引建立------------------------------------------------
show index from A #檢視索引
alter table A add primary key(id) #主鍵索引
alter table A add unique(name) #唯一索引
alter table A add index name(name) #普通索引
alter table A add fulltext(name) #全文索引
alter table A add index name(id,name) #多列索引

#常用函式
abs(-1)#絕對值
pi()#pi值
sqrt(2)#平方根
mod(-5,3)#取餘-2
ceil(10.6)#進位+1 結果11 ceil(10.0)結果10
floor(10.6)#取整 10
round(2.5)#四捨五入到整數 結果3
round(2.5,2)#保留兩位小數 結果2.50
truncate(2.5234,3)#取小數後3位不四捨五入 2.523
sign(-2);#符號函式 返回-1 0還是0 正數返回1
pow(2,3),exp(2);#2的3次冪 或e的2次冪
log(2),log10(2);#求對數
radians(180),degrees(0.618);#角度弧度轉換
sin(0.5),asin(0.5)#正弦和反正弦 類似cos acos tan atan
length('hi')#計算字元長度
concat('1',1,'hi')#合併字串
insert('12345',1,0,'7890');#從開頭第1個字元開始到0個結束,替換成後邊字串,0表示在最前邊插入
ucase('a'),lcase('A')#轉成大寫和小寫
left('abcd',2),right('abcd',2);#返回前兩個字元和後兩個字元
ltrim(' 0 '),rtrim(' 0 '),trim(' 0 ')#刪除空格
replace('1234567890','345678','0');#替換輸出12090
substring('12345',1,2)#取字元 輸出12 1是位置 2是長度
instr('1234','234');#取得234位置是2
reverse('1234');#反序輸出4321
current()#返回日期
curtime()#返回時間
now()#返回日期時間
month(now())#當前月份 monthname 英文月份
dayname(now())#星期英文 dayofweek()1是星期天 weekday()1是星期二
week(now())#本年第多少周
dayofyear(now()),dayofmonth(now())#今天是本年第多少天 今天是本月第多少天
year(now()),month(now()),day(now()),hour(now()),minute(now()),second(now())#返回年月日 時分秒
time_to_sec(now()),sec_to_time(3600*8);#轉換時間為秒和還原
version()#mysql版本
database()#當前連線的資料庫 沒有為null
user()#獲取使用者名稱
md5('a')#加密字串
ascii('a')#ascii值97
bin(100),hex(100),oct(100)#返回二進位制 十六進位制 八進位制
conv(10001,2,8);#各種進位制相互轉換
rand()#生成0到1之間隨機數
sleep(0.02)#暫停秒數
---------------------------------

1. MySQL 為日期增加一個時間間隔:date_add()

set @dt = now();

select date_add(@dt, interval 1 day); - 加1天

select date_add(@dt, interval 1 hour); -加1小時

select date_add(@dt, interval 1 minute); - 加1分鐘

select date_add(@dt, interval 1 second); -加1秒

select date_add(@dt, interval 1 microsecond);-加1毫秒

select date_add(@dt, interval 1 week);-加1周

select date_add(@dt, interval 1 month);-加1月

select date_add(@dt, interval 1 quarter);-加1季

select date_add(@dt, interval 1 year);-加1年

MySQL adddate(), addtime()函式,可以用date_add() 來替代。下面是date_add() 實現addtime() 功能示例:

mysql> set @dt = '2009-09-09 12:12:33';

mysql>

mysql> select date_add(@dt, interval '01:15:30' hour_second);-加上1小時15分30秒

date_add(@dt, interval '01:15:30' hour_second)

結果:2009-09-09 13:28:03

mysql> select date_add(@dt, interval '1 01:15:30' day_second);-加1天1小時15分30秒

date_add(@dt, interval '1 01:15:30' day_second)

2008-08-10 13:28:03

date_add() 函式,分別為@dt 增加了“1小時15分30秒” 和 “1天1小時15分30秒”

2. MySQL 為日期減去一個時間間隔:date_sub()

mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second)

www.2cto.com

MySQL date_sub() 日期時間函式 和date_add() 用法一致,不再贅述。另外,MySQL 中還有兩個函式subdate(), subtime(),建議,用date_sub() 來替代。

3. MySQL 另類日期函式:period_add(P,N), period_diff(P1,P2)

函式引數“P” 的格式為“YYYYMM” 或者 “YYMM”,第二個引數“N” 表示增加或減去N month(月)。

MySQL period_add(P,N):日期加/減去N月。

mysql> select period_add(200808,2), period_add(20080808,-2)

| period_add(200808,2) | period_add(20080808,-2) |

結果| 200810 | 20080806 |

MySQL period_diff(P1,P2):日期P1-P2,返回N 個月。

mysql> select period_diff(200808, 200801);

period_diff(200808, 200801)

結果:7

MySQL 中,這兩個日期函式,一般情況下很少用到。

4. MySQL 日期、時間相減函式:datediff(date1,date2), timediff(time1,time2)

MySQL datediff(date1,date2):兩個日期相減date1 date2,返回天數。網站製作學習網整理

select datediff('2008-08-08', '2008-08-01'); - 7

select datediff('2008-08-01', '2008-08-08'); -7

MySQL timediff(time1,time2):兩個日期相減time1 time2,返回time 差值。

select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00');- 08:08:08

select timediff('08:08:08', '00:00:00'); - 08:08:08

注意:timediff(time1,time2) 函式的兩個引數型別必須相同。

---------------------------------

MySQL DATE_FORMAT() 函式

MySQL Date 函式

定義和用法

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 位

例項

下面的指令碼使用 DATE_FORMAT() 函式來顯示不同的格式。我們使用 NOW() 來獲得當前的日期/時間:

DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p')
DATE_FORMAT(NOW(),'%m-%d-%Y')
DATE_FORMAT(NOW(),'%d %b %y')
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')

結果類似:

Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635

--------------------

資料庫優化
1.開啟快取,儘量使用php函式而不是mysql
2. explain select 語句可以知道效能
3.一行資料使用 limit 1;
4.為搜尋欄位重建索引 比如關鍵字 標籤
5.表連線join保證欄位型別相同並且有其索引
6.隨機查詢使用php $r = mysql_query("SELECT count(*) FROM user");
$d = mysql_fetch_row($r);
$rand = mt_rand(0,$d[0] - 1);
$r = mysql_query("SELECT username FROM user LIMIT $rand, 1");
7.避免使用select * 應該使用具體欄位
8.每張表都是用id主鍵,並且是unsigned int
9.對於取值有限而固定使用enum型別,如性別 國家 名族 部門 狀態
10.儘可能使用not null ip儲存使用int(4),使用ip 轉化函式ip2long()相互long2ip()
11.delete和insert語句會鎖表,所以可以採用分拆語句操作
while(1){操作語句;usleep(2000);}
12.選擇正確的儲存引擎;MyISAM適合大量查詢 寫操作多用InnoDB支援事務

#儲存過程
#儲存程式
delimiter #定義儲存程式
create procedure getversion(out params varchar(20)) #params是傳出引數 in傳進 out傳出 inout傳回
begin
select version() into params; #版本資訊賦值params
end
call getversion(@a); #呼叫儲存過程
select @a;
delimiter #定義儲存函式
create function display(w varchar(20)) returns varchar(20)
begin
return concat('hello',w);
end
select display('world');

drop procedure if exists spName; #刪除一個儲存過程
alter function spName [];#修改一個儲存過程
show create procedure spName;#顯示儲存過程資訊
declare varName type default value;#宣告區域性變數
#if語句
if 條件 then 語句
elseif 條件 then 語句
else 語句
end if
#case語句
case 條件
when 條件 then 語句
when 條件 then 語句
else 語句
end case
#loop語句
fn:loop
語句
end loop fn;
leave fn #退出迴圈
#while語句
fn:while 條件 do
語句
end while fn


#mysql使用幫助資料
? contents; #列出幫助型別
? data types;#列出資料型別
? int;#列出具體型別
? show;#show語句
? create table;#
#常見表的比較
Myisam BDB Memory InnoDB Archive
儲存限制 no no yes 64T no
事物安全 支援 支援
鎖機制 表鎖 頁鎖 表鎖 行鎖 行鎖
全文索引 支援
外來鍵支援 支援
myisam frm儲存表定義 MYD儲存資料 MYI儲存索引
InnoDB 用於事務處理
char 和 varchar儲存和索引都不相同
浮點數float(10,2) 定點數decimal(10,2)
長度一定下,浮點數表示更大資料範圍,缺點是引起精度丟失,貨幣等使用定點數儲存
索引適合於where字句或者連線字句列
對於唯一值使用唯一索引

新增新使用者 grant select,insert,update,delete on *.* to Yoby@localhost identified by 'mysql';
# *.* 資料庫名.表名,限制登入某一個數據庫 test.* localhost是本地主機 網路可以使用 '%'代替所有主機 'mysql'是密碼 Yoby是使用者名稱 所有許可權可以用 all代替
檢視使用者許可權 show grants for 'root'@'localhost';
移除許可權 revoke all on *.* from root@localhost;
group by id 分組
having 限制字句
select1 union select2 聯合查詢有重複去掉保留一行
select2 union all select2 所有行合併到結果集中去
--------------------------------------------------------------------
修改MYSQL引數
show variables like '%Func%';
set global log_bin_trust_function_creators=1;
show variables like '%Func%';
實用的insert select語句INSERT INTO KM_MEMBER_RELA_FULLCUT (
	SELECT
		a.MB_ID,
		b.MPFC_ID,
		1
	FROM
		KM_MEMBER a,
		KM_MEMBER_PREF_FULLCUT b
	WHERE
		b.MPFC_STATUS = 0
	AND NOT EXISTS (
		SELECT
			1
		FROM
			KM_MEMBER_RELA_FULLCUT
		WHERE
			MB_ID = a.MB_ID
		AND MPFC_ID = b.MPFC_ID

)
參考:https://blog.csdn.net/a454832841/article/details/52814812