MySQL(1): 基本操做

MySQL 是流行的關係型數據庫管理系統之一,特別是在WEB應用方面。推薦用5.6版本。html

 My Sql客戶端有不少web

 還有PHP MyAdmin, 是以web形式控制和操做MySQL數據庫的管理工具。是WAMP軟件包集成的工具軟件。正則表達式

Navicat premium 破解版安裝鏈接http://www.downcc.com/soft/322714.html 數據庫

補充MYSQL服務器

(1)limit 兩個數字session

select * from student limit 2,4 函數

2 第一位表示從下標爲幾的數據開始;4第二位表示當前分頁顯示多少數據。工具

limit 2,4表示從第三條開始,顯示4條數據。oop

(2)limit 兩個數字性能

select * from student limit 4. 顯示4條數據。

(3)分組函數通常與聚合函數一塊兒!!

select sdept, count(*) from student group by sdept;

(4)having 用於分組函數的條件!!

select sdept,count(*) from student group by sdept having count(*)>5

(5)show tables 顯示當下數據庫的全部表和視圖

視圖的主要功能是簡化查詢語句,不少嵌套的複雜查詢

 (6)存儲過程

示例1:

CREATE DEFINER=`root`@`localhost` PROCEDURE `pro1`(OUT `cnt` integer)
BEGIN
    #Routine body goes here...
select count(*) into cnt from student where sdept='PC';
END

在查詢語句中進行調用

set @shu=0;
call pro1(@shu); 
select @shu;

shu是會話變量,以@開頭。

示例2:

在查詢腳本中寫

CREATE PROCEDURE pro3(IN sig integer,OUT cnt integer)
BEGIN
    IF sig = 1 THEN
        SELECT count(*) INTO cnt FROM student WHERE sclass = '01';
    ELSE 
        SELECT count(*) INTO cnt FROM student WHERE sclass <>'01'; #<>
    end if;
END;

調用,在左側列表中沒有出現pro3 須要刷新一下

call pro3(1,@cnt);
select @cnt;

---

(7)索引

能夠提升查詢數據,在數據裏很大的狀況下能夠用,通常查詢中經常使用的字段加索引。

增長一個索引,會把表「備份」一份,按照索引排序一下,會消耗內存!

chapter1 數據庫操做

1. 系統數據庫: 是安裝完MySQL服務器後,附帶的一些數據庫。例如information_schema,主要存儲數據庫對象的信息(用戶名信息、列信息、權限信息等)。performance_schema主要用於存儲數據庫服務器性能參數。

建立數據庫  create database xy;或者create schema xy;

不容許兩個同名的數據庫,能夠 create database if not exists xy;

2. 查看、選擇、刪除數據庫

show databases|schemas like|where

show databases like 'db_%'  ;找到db開頭的數據庫。

選擇數據庫。create database 語句以後,該數據庫不會成爲當前數據庫,須要 寫 use database;

刪除數據庫 drop database|schema, 好比drop database if exists xy;

chapter2 數據類型

1.數字類型

tyniint(若是值不超過127,用tyniint 比int 好);

還有int , float ,double等。

2.字符串類型

(1)普通:char, varchar(變長)

(2)可變:text適合長文本;bolb適合二進制數據,支持任何數據包括文本、聲音、圖像等。

(3)特殊:enum('value1','value2',……),把列中的內容限制在一種選擇上,只能所列舉的值之一或者null;

set('value1','value2',……),能夠容納一組值或者null.

3. 日期與時間類型

datetime\date\timestamp\time\year

date格式爲 yyyy-mm-dd

time 格式爲 hh:mm:ss

datetime 格式爲yyyy-mm-dd hh:mm:ss

chapter3 數據表操做

1.表的建立

 create table if not exists 表名(列1 屬性1,列2 屬性2,……);

if not exists 避免了建表時報告錯誤。

對於成功建立的表,能夠show columns 或者 describe 查看錶結構

show columns from 表名 from 數據庫名  ; 或者  show columns from 數據庫名.表名

describe 表名 或者簡寫爲 desc 表名;

或者只看某個字段  desc 表名 列名;

2. 修改表結構

增長新字段  alter table 表名 add sno varchar not null;

修改字段名 alter table 表名 change column 老的字段 新的字段;

刪除字段 alter table 表名 drop 字段名;

修改表名 alter table 表名 rename as 新表名 ; 或者 rename table 老的表 to  新的表名;

複製表 create table (if not exists)新的表名 like 源表名 ; 這個語句沒有複製表中的數據。

 create table (if not exists)新的表名 as select * from 源表名; 這個複製了數據。

刪除表 drop  table (if exists) 表名;

 

chapter 4 MYSQL 基礎

1. 算術運算符 + - * / 

求餘% 或 mod 

select score,score+score from student;

2. 比較運算符 不等於<> 或者!= 

is null ; is not null; between.. and ...; in ;not in;

like; not like ; regexp(正則表達式)

regexp 能夠來匹配某個字段的值是否以指定字符開頭、結尾,或者包含某個字符串。

返回值是1或者0.

3. 邏輯運算符

and  && ; || or ;  ! not ; xor 異或

1 xor 1=0; 0 xor 0 =0;

4. 流程控制

(1)if then.. elseif then... else... end if;

(2)case

case value

   when .. then...

   when..then...

   else...

end case

(3)while

while condition DO

...

end while

建立一個procedure

create procedure pro4(out sum int)
begin 
declare i int default 1;
declare s int default 0;
while i<10 DO 
set s =s+i;
set i=i+1;
end while;
set sum=s;
end

調用

call pro4(@s);
select @s

獲得45  : 從1+,,,9=45;

(4)loop 

loop

...

end loop

(5)repeat 先執行一次循環體,以後判斷condition,爲真則退出循環。

repeat 

...

until conditon 

end repeat

create procedure pro5(out sum int)
begin 
declare i int default 1;
declare s int default 0;
repeat 
set s =s+i;
set i=i+1;
until i>10 
end REPEAT;
set sum=s;
end


call pro5(@s);
select @s

獲得55, 從1+,,,10=55

 

chapter5 表數據的增刪改、經常使用函數

1. 增長數據

(1)insert into 表名 values('','','') ,('','',''); 能夠插入多條數據。

(2)insert into 表名 set sname='mike',sno='001';  指定字段的值。

(3)insert  into 表名 select子句。

insert into 表名 (sno,sname) select sno,sname from student;

2. 修改數據

update  表名  set sname='mike' where sno='001';

3. 刪除數據

delete from  表名 where sno='001';  刪除一行數據

truncate table  表名 ;刪除表中全部的行。

4. group by

select sname,sdept from student group by sdept;

不用函數, group by 一組只顯示一條數據

      

select sdept,count(*)from student group by sdept;

GROUP_CONCAT能夠把一個組下面的字段值都顯示出來。

select sdept,GROUP_CONCAT(sname) from student group by sdept;

 

 5. exists 查詢

exists 使用時,內層查詢語句不返回查詢的記錄,而是返回一個真假值。返回true 時,外層查詢進行查詢。

若是sc表中存在001的學生序號,那麼查找student的表數據。 

select * from student where exists(select * from sc where sno='001');
select * from student where sclass='01' and exists (select * from sno='001');

not exists : 若是內層返回false, 外層纔開始查詢。

6. any 與 all

<any(select score from...) 表示小於全部值。

>all 大於最大值。

7.正則表達式

^x  以x開頭

x$  以x結尾

.  匹配任何一個字符

[字符集合]  

[^字符集合]  [^abc] 除了abc之外的任意一個字符

a|b|c

*  匹配多個該符號以前的字符,包括0個或者1個;

+  匹配多個該符號以前的字符,1個以上;

{n}  匹配字符串出現n 次;

{m,n} 出現m-n次;

select sname from student where sname regexp'm$' ;  以 m 結尾。

regexp ‘a{3}’ a 出現3次;

‘J+A’ 至少出現一次J; 

8. 數學函數

abs(x); ceil(x); floor(x); rand() 0-1之間的隨機數; sign(x); PI();

truncate(x,y) x 保留小數點到y位的值; round(x); pow(x,y) 或者power(x,y);

sqrt,exp,mod(x,y); log(x),基數爲2; log10(x); sin(); asin(); cos();  acos();

select abs(-5),sqrt(5);

9.字符串函數

char_length(s) s 的字符數;

length(s)  s 的長度(字節);

concat(s1,s2,...) 

cncat_ws(x,s1,s2,...) ;每一個字符串直接要加上x

select CONCAT_WS('*','aaa','bbb')  ; 獲得aaa*bbb

upper(s); lower(s);

left(s,n) 左邊n 個字符; right(s,n);

Ltrim(s); Rtrim(s);

insert(s1, x,len,s2): s1 從x 位開始的len 長度由s2 代替。select insert('mikj',3,2,'book')  獲得mibook

repeat(s,n);s 重複n次;

substring(s,n,len), 獲取s 從n位置開始的len長度字符串。

reverse(s), 順序反過來;

field(s,s1,s2...) 返回第一個與s 匹配的字符串的位置。select field('aa','bfa','faae','aa')獲得3.

locate(s1,s) s1在s 中的開始位置;相似的還有 position(s1 in s) 或者 instr(s,s1)

10. 日期函數

curdate(); current_date(); 同樣的,獲取當前日期。

curtime(); current_time(); 獲取當前時間。

獲取當下日期和時間:now(), current_timestamp(), localtime(), sysdate();

datediff(d1, d2) 相隔的天數。SELECT datediff('2014-2-4','2015-4-9')  -429

adddate(d,n);  相反的是subdate(d,n);

11. 條件判斷函數!!! 很重要

if(expr,v1, v2) , expr成立就執行v1; 

ifnull(v1,v2) , v1不空則返回v1, 不然返回v2;

case when expr1 then v1 when expr2 then v2 else v0 end 

case expr when e1 then v1 when e2 then v2 else v0 end 

12.系統信息函數

 version() 數據庫版本號

connection_ID() 獲取服務器的鏈接數

database(), schema() 獲取當前數據庫名

user(),system_user(), session_user() 獲取當前用戶

 

 

mysq函數大全 補充

數學函數:

#ABS 絕對值函數
select abs(-5) ;
#BIN 返回二進制,OCT()八進制,hex十六進制
select bin(2);
#ceiling  天花板整數,也就是大於x的整數
select CEILING(-13.5);
#EXP(X)天然對數e爲底的x次方
select EXP(2);
#FLOOR(X)小於x的最大整數
select FLOOR(3.5);
#返回集合中最大的值,least返回最小的,注意跟max,min不同,max裏面跟的是col,返回這個列的最大值最小值
select GREATEST(1,2,3,4);
#ln(x)返回對數
select LN(10);
#log(x,y),以y爲底x的對數
select log(4,2);
#mod(x,y)返回x/y的餘數
select mod(5,2);
#pi() 返回pi
select pi();
#RAND()返回0,1之間隨機數
select rand();
#round(x,y)返回x四捨五入有y位小數的值
select round(pi(),3);
#sign(x) 返回x符號
select sign(-5);
#sqrt(x)返回x的平方根
select sqrt(9);
#truncate(x,y) 返回數字x截斷爲y位小數的結果,就是不考慮四捨五入,直接砍掉
select TRUNCATE(pi(),4),ROUND(pi(),4),pi();

 聚合函數(經常使用語group by從句select語句中)

#avg(col)返回指定列平均值
select AVG( quantity) from orderitems;
#count(col)返回指定列中非null數量
select count(quantity) from orderitems;
#min(col)max(col)返回指定列最大最小值
select max(quantity),min(quantity) from orderitems;
#sum(col)返回制定列求和值
select sum(quantity) from orderitems;
#group_concat(col)返回這個列鏈接組合的結果,中間有逗號隔開
select group_concat(prod_id) from orderitems

 字符串函數

#ASCII(str)返回字符串的ascii碼值
select ASCII('12');
#bit_length(str)返回字符串的比特長度
select bit_length('123');
#concat()鏈接字符串
select concat('1','我','2');
#concat_ws(sep,s1,s2,s3)鏈接字符串用sep隔開
select concat_ws('|','1','我','2');
#INSERT(str,pos,len,newstr),將字符串str從pos位置開始的len長度替換爲newstr
select 'hello world',INSERT('hello world',2,3,'傑哥哥');
#FIND_IN_SET(str,strlist)分析逗號分隔的list,若是發現str返回list中的位置
select find_in_set('abc','aabc,sdf,det,abc') #返回4
#LCASE(str),LOWER(str)都是返回小寫的結果,UPPER(),UCASE()    返回的都是大寫結果
select LCASE('UUSU');
#`LEFT`(str,len)從左到右從str中選擇長度爲len的字符串,`RIGHT`(str,len)相反
select left('hello world',4);
#length(str)返回str字符串長度
select length('hello world');
#trim(),ltrim()rtrim()分別去掉兩頭的空格,左邊的空格,右邊的空格
select trim('   hello   ');
#POSITION(substr IN str),返回substr首次在str中長線的位置
select POSITION('llo' IN 'hello world');
#QUOTE(str)用反斜槓轉義str中的單引號
select QUOTE("hello ' world")
#`REPLACE`(str,from_str,to_str)在str中,把from str 轉成to_str
select replace('hello world','hello','hi');
#repeat(str,count)重複str count次
select repeat('hello world',3);
#reverse(str)顛倒str
select reverse('hello world');
#STRCMP(expr1,expr2)比較兩個字符串,如出一轍返回0,不同返回1
select STRCMP('hello','world')

日期和時間函數

#curdate()或者current_date() NOW()是返回日期+時間
select current_date();
#curtime()當前時間,或者current_time()
select curtime();
#DATE_ADD(date,INTERVAL expr unit)返回date加上int日期後的日期,date_sub()也是同樣的
select date_add(curdate(),interval 5 day);
select date_add(curtime(),interval 5 hour);
#DATE_FORMAT(date,format)按照格式轉化日期,具體的format格式能夠查查
select date_format(CURDATE(),'%m-%d-%Y');
#dayofweek()DAYOFMONTH(date)DAYOFYEAR(date)返回日期中是一週中第幾天,一個月中第幾天,一年中第幾天
select DAYOFMONTH(CURDATE());
#dayname返回日期星期名
select dayname(CURDATE());
#hour(time),minute(time),month(date)
select curtime(),hour(CURTIME()),minute(curtime());
select curdate(),month(curdate()),year(curdate()),day(curdate());
#MONTHNAME(date) 返回月份名稱
select monthname(curdate());
#quarter(date)返回日期的第幾季度
select quarter(curdate());
#week(date)
select week(curdate());
#TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)計算兩個時間差,還有datediff()
select TIMESTAMPDIFF(year,19920202,CURDATE())

 

chapter 6 索引

索引能夠提升查詢速度,不須要遍歷數據表中的全部數據,只須要查詢索引列。

索引就像一本書的目錄。可是建立索引和後期維護須要花費不少時間,索引也會佔用物理內存。

有索引也會影響表的插入操做,由於新插入數據會按照索引進行排序。(能夠先刪除索引再插入數據,再重建索引。。)

索引類型:

(1)普通索引normal:

(2)惟一索引:unique , 索引的值惟一。主鍵就是一種特殊的索引

(3)全文索引fulltext:只能創建在char varchar text類型的字段是。

建立普通索引 

create table score(id int(11), auto_increment primary key not null), 
name varchar(20) not null, grade int(5) not null, index(id))

建立惟一性索引

create table score(id int(11), auto_increment primary key not null), name varchar(20) not null, grade int(5) not null, unique index(id))

建立全文索引,索引名稱是beizhu1

create table score(id int(11), auto_increment primary key not null), 
name varchar(20) not null,
grade int(5) not null, beizhu varchar(100),FULLTEXT KEY beizhu1(id))

在已有的表中創立索引

create index 索引名 on 表名(字段)

create index stu_info on student(info)
create unique index stu_info on student(info)
create fulltext index stu_info on student(info)

修改、刪除索引

alter table student add index idx1(sno);
drop index idx1 on student; # 刪除索引

chapter7 視圖

create or replace view view1(sno, cno) as select 。。with check option. 

with check option 表示更新視圖時要保證在該視圖的權限範圍以內。

查看視圖 desc view名

看視圖

 看錶

 這就是表與視圖的差異

show create view pc 能夠查看視圖pc的詳細定義。

修改視圖,能夠更改其中的列

alter  view view1(sno) as  select sno from student with check option;

更新視圖:update view1  set grade=100 where sno=‘001’;

對視圖的更新就是對基本表的更新。

並非全部的視圖均可以更新,如下狀況不能更新:

(1) 用了函數sum等;

(2) 包含union, distinct,group by, having;

(3) 視圖中的select 包含子查詢。

最好不要經過視圖進行更新。刪除視圖 drop view if exists view1;

 

chapter8 數據完整性約束

1.實體完整性

(1)主鍵約束, 一個表只能有一個主鍵,主鍵可以惟一標識一行記錄,且不爲null. 能夠是一列或者多列。primary key.

(2)候選鍵約束,能夠是一列或多列。值惟一且不爲空。unique

2. 參照完整性

foreign key(sno) references sc(sno) on delete restrict on update restrict;

reference 後面跟的表是被參照表(父表)。

restrict:禁止對被參照表的刪除或者更新;

cascade: 被參照表刪除或更新時,參照表的數據也被更新或刪除;

set null :被參照表刪除或更新時,設置參照表中對應的外鍵爲null;

3.用戶定義完整性

check(expr) : 

對列:age int not null check(age>0 and age<100)

對錶:check sno in (select sno from student)

相關文章
相關標籤/搜索