mysql sql语句 入门_mysql(3)mysql的sql语句入门
1.登錄mysql與退出mysql
登錄:mysql? -u賬號 -p密碼 -h主機地址 -P端口號? -e 執(zhí)行的sql語句; //密碼一般不直接寫出,回車后隱藏寫入 ,-h可以不寫默認是localhost
退出:quit,exit? ,ctrl+c
備注:參數可分為全局和會話,可修改與不可修改,全局需要加上global,例如 set?? global 參數 =值,會話級別只對當前會話有效, 例如set? 【session】? autocommit=1;中間可以省略session,例如需要全局的話需要 set? global autocommit=1;不能持久化,重啟后是默認值,全局設置對已經開啟了會話的不起作用,只會對以后連接的會話有效,查看可以使用show? 【global/session】 【variables 】 【like pattern】 變量名 來查看。
備注:dbms數據庫管理系統(tǒng) ,dba數據庫管理員, sql(ddl 表結構,dml增刪改 ,dql 查詢,dcl數據庫控制,tcl事物控制)
2.數據的導入與導出
1)數據的導入:source (運行在mysql下的命令)
select version();//查看當前數據庫版本;
create? database 數據庫名稱;//創(chuàng)建數據庫
show databases ; //顯示所有的數據庫,產看數據庫是否已經導入,也可以使用 show? databases like ‘’pattern’? 的形式,_代表一個字符,%匹配多個字符
use?? 剛剛創(chuàng)建的數據庫;
source? 需要導入的表(文件名);//導入表,假如是表,那么需要在使用use 后導入相應的庫。
show tables ;//顯示該庫下的表
desc?? 原表名(不是文件名);//顯示表的結構
select? *? from? 表名;? //查看表內容
load?? data? infile ‘~/data.txt’?? into table persons?? fields?enclosed? by? ‘”’??erminated? by ‘|’ ? lines???staring? by? ‘ ’? ? terminated? by ‘’?? ;//導入; fields字段處理可選項? enclosed? by :? 表鎖字內容包裹符,默認是‘’ ,空字符串;? terminated? by:? 表鎖字段的結束符 默認是‘\t’ ;escape? by:特殊符號處理 方式 ,默認是“\\” 反斜杠; lines處理? staring? by? 開始符,默認空字符串? terminated? by:結束字符,默認空字符串
2)數據庫的導出
mysqldump(mysql? bin中的命令)
mysqldump? 數據庫 ?? > 地址? -uroot?? -p ;//默認-h本機
3)導出表
mysqldump? 數據庫名? 表名1 ? 表名2 ? > ~/person.sql?? -uroot?? -p ;//參數: -d只導出數據表結構不導出數據,導出默認字符采用,latin1,按原文件導出,不會亂碼。
select? * into file? ‘~/data.txt’? fields?enclosed? by? ‘”’??erminated? by ‘|’ ? lines???staring? by? ‘ ’? ? terminated? by ‘’?? from? persons;//導出,需要保證該文件不存在;? select? */字段列表? into file? 文件路徑 from 數據源 ;fields字段處理可選項? enclosed? by :? 表鎖字內容包裹符,默認是‘’ ,空字符串;? terminated? by:? 表鎖字段的結束符 默認是‘\t’ ;escape? by:特殊符號處理 方式 ,默認是“\\” 反斜杠; lines處理? staring? by? 開始符,默認空字符串? terminated? by:結束字符,默認空字符串
3.數據庫及表的創(chuàng)建以及刪除及修改及表的復制及視圖
1)數據庫的創(chuàng)建
Create? database 數據庫名稱;//創(chuàng)建數據庫
create? database? 數據庫名稱? charset? utf8;//指定字符集
備注:
關鍵字需要使用'',例如create database? 'database'? charset utf8? ,表也遵循該規(guī)則;
使用中文數據庫名,在沒有設置字符集時,可能會亂碼,那么需要使用set names 設置字符集,設置后保存在數據庫中的名字可能看起來實際亂碼,但是那不叫亂碼,是以另外一種形式表示。
數據庫不可以更改名稱,只可以更改字符集和 校對集//alter? database? 數據庫? charset =utf8? collate? utf8_bin;
2)數據庫的刪除
drop ?database? 數據庫名;
備注:刪除不可逆
3)表的創(chuàng)建
int,bigint(長整型),varchar(動態(tài)分配空間,效率換取空間,適合用于不固定長度的地方), char(固定長度,空間換取效率),date(默認的格式%Y-%m-%d),datetime,time,timestamp(帶時區(qū)的概念),double(m,n)(有效長度m,小數點后n位),float(用法同double),decimal(精度較高,用于錢有關的事物),blob(存放二進制文件,很少使用,16k),mediumblob(16m),
longblob(最大4g ,數據庫能存儲的單元最大也是4g),clob(存放文本文件),text等。
unique(可以為空,可以修飾一個或者多個字段,不可重復,但是null可以存在一個或者多個,存在聯合,unique(a,b),兩個都相同則不同,在建立unique會先建立索引),primary? key(主鍵,每個表必須有且只有一個主鍵,無主鍵可以認為是無效的表,主鍵附帶索引,且不能為null,不可以重復,存在聯合主鍵,但是不建議使用,因為存在部分依賴的問題不滿足第二范式),not? null(不為空),foreign? key (外鍵,可以為null,可以修飾一個或者多個字段,可以是單一外鍵或者是聯合外鍵,會先建立索引,且外鍵對應字段的修飾類型需要一致,包括級聯模式(on? cascade),置空模式(set? null),嚴格模式,在導入數據的時候可以設置set?? foreign_key_checks=0來關閉外鍵約束,增加速率,導入后設置為1開啟,一般不建議使用外鍵,外鍵不好控制),constraint 約束名(給約束取名字,便于刪除等操作),on delete cascade (級聯刪除),on update cascade(級聯更新),auto_increment(當插入0或者null時,默認會自增,假如設置的值大于當前自增后的值,那么自增值會設置為當前值,在小于且不發(fā)生沖突的前提下能插入,自增值保持原來的值,在其他情況下次可能會發(fā)生主鍵沖突,解決主鍵沖突的辦法下面有,假如想為0,那么可以用update,一張表只能有一個增長在innodb中必須位于索引之上;自增多少有初始默認值,可以通過設置來解決,(show?? variables? like ‘auto_increment%’)? set auto_increment_increment=5;設置自增為5,但是第一次還是自增原來的值,假如是復合索引,那么也是聯合索引的第一列發(fā)生自增,且是先排序后自增,只有存在兩個復合索引都相同時才自增,必須是整型)。
備注:
默認的排序規(guī)則是字符編碼集_ci,這個編碼集表示不區(qū)分大小寫,倘若需要區(qū)分大小寫,show? collation會顯示所有的排序規(guī)則,通過collate設置,create?? table? a(name? varchar?? not? null?? unique?? charset?? utf8? collate? utf8_bin),cs ,bin結尾的是區(qū)分大小寫的;// show? collation;//查看所有的校對字符集;//查看當前數據庫的校對集:show? variables? like? ‘collation_database’
主鍵必須先刪除后才能添加;alter table 表名 drop? primary? key;//不需要寫名稱,因為一張表只能有一個主鍵
charset可以設置字符編碼集? (create?? table? a(name? varchar?? not? null?? unique?? charset?? utf8))//show variables? like? ‘字符集’ ;查看相應的設置;當前數據庫的字符集show? variables? like? ‘character_set_database’;
設置局部變量@xxx? (set? @age=1;?? select @age;)
int? bigint等占用字節(jié)是定的,int 4個字節(jié) ,bigint8個字節(jié),tinyint 1個字節(jié),smallint 2個字節(jié) ,mediumint? 3個字節(jié),例如int(3),3對設置的值在沒有超過相應的int.max都可以插入
--表示注釋
客戶端和服務端相關的3個字符集;‘character_set_client ;‘character_set_results,‘character_set_collection;可以通過set? names? 字符集來一起設置;三個需要保持一致,當然也可以在my.cnf文件中配置,default_character_set=字符集;
varchar和char在嚴格模式下不允許插入比當前數字長度長的字符,char會刪除尾部的空格,varchar不會刪除前后的空格,但是varchar字符長度去除尾部空格后剛剛好等于varchar定義的長度,那么會去除空格后插入,不會報錯,varchar 單行長度65535 個字節(jié),0用來代表false和true的,null 占用一個存儲長度,varchar的變長也會占用1-2個字節(jié)長度(長度小于或等于255是一個字節(jié),否則是2個字節(jié))來確定占用的存儲的實際長度,,text占用10個字節(jié)
外鍵產生對子表的約束作用,如果外鍵值在父表中找不到對應的項,那么就會失敗(在可以為null的情況下,可以為null),一般不建議使用外鍵,不好控制,外鍵存在首先要是innodb引擎,其他引擎無效,外鍵的字段類型需要完全與主鍵的類型一致,一張表中外鍵的取名不能重復,存在三種模式district嚴格模式, cascade級聯模式,set null 置空模式,假如not null,那么置空失敗,district(默認的,要保證相應的順序)// constraint? 外鍵名? foreign key (字段名) references? 父表(字段名) on delete? 模式 on update 模式;
對于text 與blob存在空洞的問題,也就是刪除,還是占用空間,一般需要使用optimize? table 來整理磁盤碎片,使用散列碼(例如md5)可以優(yōu)化該效率,保存的時候是散列碼,尋找的時候也轉換成散列碼(例如 where? text1=md5(repeat'xxxx')),這個很少用;
例如電話號碼使用bigint,ip使用inet_aton裝換為整數使用bigint保存,取出后轉換。
例如
create? table? if not? exists? emp? charset? utf8;
create? table? if not? exists? db.emp? charset? utf8;//在db數據庫創(chuàng)建? emp表
create table 表名(字段1? 修飾(寬度)...)
create? table? students (
sno? int? primary? key? auto_increment,
sname? varchar(10) not null,
sgander? char(1) defalut '男'? charset utf8,
sgrade int ? not null? comment? '分數', //comment?? 描述,在desc 中不會顯示 ,但是在show? create? table? name 中會顯示;
tno int? not null,
tbirth?? date not null,
constraint? students_tno_fk? foreign key(tno)? references?? teachers(tno) on? delete? cascade
)engine =innodb? default charset=utf8;
備注:int,bigint? 定義的寬度沒有實際的意義
create? table? teachers(
tno? int? primary? key? auto_increment,
tname? varchar(10) not null,
)engine =innodb? default charset=utf8;
create? table? employees(
eno? int? primary? key? auto_increment,
ename? varchar(10) not null,
)engine =innodb? default charset=utf8;
4)表的修改:
rename? table? 表名? to? 新表名;//更改表名
alter? table? 表名? ? auto_increment=值;//off 或者true? 0或者1
alter? table? 表名?? modify 字段名;//去掉自增修飾即可,
alter? table 表名?? drop? index? 索引名稱 ;//刪除唯一鍵 ? ,唯一鍵默認使用字段的名稱作為索引名
alter? table? 表名? add??? 字段名? 數據類型?? first /? after? 字段名? //first 在第一個? after 字段名 位于某字段名之后,默認加在末端
alter? table? employees add? age int ;//添加字段
alter table? employees? modify? age int ;//修改字段
alter? table employees drop? age;//刪除字段
alter? table? students? drop? foreign key?? students_tno_fk;//刪除外鍵
alter? table? 表名 change? 舊字段名? 新字段名 數據類型 位置(first /after 字段名);
alter? table? students? add? constraint? students_tno_fk? foreign key(tno)? references?? teachers(tno)on update? cascade? ? ? on? delete? cascade//添加級聯刪除與更新;
alter? table? 表名? character set? 字符集;//對以前插入的數據無效,只對之后插入的數據有效
alter? database? character set? 字符集;//對以前插入的數據無效,只對之后插入的數據有效
5)刪除表
drop? table?? if exists ?? 表名;//如果存在就刪除 ,假如沒有if exists 不存在就會報錯;
drop? table? 表名1,表名2.//多表刪除
6)視圖的創(chuàng)建和刪除
視圖的創(chuàng)建
備注:可以使用join創(chuàng)建多表視圖,多表視圖不可以增刪,但是可以改,還需要有對應的字段,沒有的不能使用,例如視圖的id是不存在的,
create? view? students_view? as? select? *? from? studens;//對視圖中的數據更改會對students的表的元數據更改;
視圖的刪除
drop? view?? if? exists? students_view;//如果視圖存在就刪除
視圖的修改
alter?? view? 視圖名 as? select ...;
備注:視圖的作用保證數據的安全,隱藏無關數據,刪除視圖不會對原視圖造成影響,在單表中的增刪改,都有影響,多表中的改有影響;
備注:如果在select語句中包含count ,max, avg ,min,sum時,且順序要比外表的查詢語句靠右需要使用 temptable? ,其他情況下默認即可 //? create? algorithm=指定算法? view 視圖 as select..;
7)表的復制
create? table? students_copy as select? *? from? studens;//復制的表和原students沒有任何的關系;
create? table? 表名 like?? 表名 ;//表結構的復制;
8)索引的創(chuàng)建和刪除(主要用于百萬級的數據,或者用在不變化的數據(較多),不然沒有太大的意義)(詳細見優(yōu)化)
創(chuàng)建:
create? index? students_index? on? students(sname);//在students的sname上添加上一個索引;
create? unique? index? students_index? on? students(sname);//不能重復的索引;
刪除
drop? index? students_index? on? students;//刪除索引,在oracle中 on? students可以不寫;
備注:mysql 所使用的是b +tree的數據結構 (平衡樹(左旋,右旋),插入相對較慢一些,查詢很快)
4.數據庫及表的查詢操作及表中的數據
4.1)數據庫的查詢
show databases? ;? 查詢所有的表
show databases like ‘%es%’ ;//模糊查找過濾;
select? database();? 查看當前處于哪個數據庫;
4.2)表
use? test ;//使用庫
show tables ;//顯示該庫下的所有表
show? tables? like? ‘%es%’;//在數據庫test下模糊查找具有es字段的表;
show? create ?table 表名 ;//查看怎么創(chuàng)建的表
4.3)select? 語句
4.3.1)? +,-,*,/,%
select?? sgrade*2? as '2倍分'? ,sname from? students;//as 別名? ,+,-,/,%類似
4.3.2)> ,< ,>= , <=, != ,<>
select?? sgrade>90? as '是否大于90分,0表示false,1表示true'? ,sname from? students?? where sgrade >60;//在大于60分的同總共大于90的同學,< ,>= , <=, != ,<>類似
4.3.3)between 。。。and。。。
select?? count(*),sname from? students? where? sgrade? between? 80 and 100;//80 到100之間的人數
4.3.4)max,min ,sum ,count ,avg,distinct
select?? count(*),sname from? students;//這些函數不能用在where后面,*包括null,用字段不包括null,只能在分組的情況下能和其他非這些的字段匹配使用,否則不能匹配使用;
select??? count( distinct sname ) from students;
select???? distinct? sname ,sgrade? from??students ;//去和sname和sgrade兩個都重復的結果,distinct的位置不能變
4.3.5)str_to_date,date_format ,format,adddate(加日期) ,subdate(減日期),addtime(加時間),subtime(減時間)
Mysql的日期格式 %Y:年,%m:月,%d:日,%H:時,%i:分,%s:秒;備注:區(qū)分大小寫
Mysql的默認格式:%Y- %m-%d?? %H:時,%i:分,%s:秒? ,字符串會相應的轉型
select? name??? from students? where? sbirth>'2018-1-1';//自動轉型,int等寫成'6'也會自動轉型等, 出生晚于2018-1-1的人
select? name??? from students? where? sbirth>str_to_date('1-1-2018','%m-%d-%Y');//糾正字符格式;
select?? date_format(birth,'%m-%d-%Y') where? sbirth>str_to_date('1-1-2018','%m-%d-%Y');//糾正格式,按指定格式輸出; format處理數字的;
4.3.6)trim,upper,lower,substr(被處理字段,下標,長度),length,round,rand, ifnull(字段,如果為空的默認值);
select? upper(name) ?? from students? where? sbirth>'2018-1-1';//小寫變大寫 ,上述其他用法類似
4.3.7)order by 字段名 asc /desc
select?? sgrade,sname from? students? order? by sgrade ;//默認升序asc
select?? sgrade,sname from? students? order? by ?sgrade asc;//升序
select?? sgrade,sname from? students? order? by ?sgrade desc;//降序
select?? sgrade,sname from? students? order? by ?sgrade desc ,sname desc;//不同升序,相同降序
4.3.8)is null , in ,not ,like,regex(類似java),
select?? name? from? students? where? name is? null;//name為空的數據
select?? name? from? students? where? name is not? null ;//name? 不為空的數據
select?? name? from? students? where? name in (‘張三’,‘李四’);//找出是張三或者李四的人
select?? name? from? students? where? name not? in (‘張三’,‘李四’);//找出不是張三或者李四的人
select?? name? from? students? where? name like '%s_s%';//模糊查找,%表示0個或者多個字符,_表示一個字符
4.3.9)group? by?? having
select ? tno,? max(sgrade) from? students??? group? by? tno;//只能加分組字段(tno),其他字段不報錯,但是結果不對,然后還能使用count,max等組函數
select ? tno,? max(sgrade) from? students ?? where? tno !=1 ???? group? by? tno;//期初tno不等于1,后分組;
select? tno,? max(sgrade) from? students??where? tno !=1 ??? group? by? tno? having?? avg(sgrade)>80;//having后面能放 avg等字段;
select? tno,? max(sgrade) from? students??where? tno !=1 ??? group? by? tno? having?? avg(sgrade)>80?? order by desc ? limit1;//group by? having? orderby? limit的順序不能變
備注:? concat? 一個或者多個字符連接函數,with?? rollup;//任何一個小組都會統(tǒng)計,//select? c_id?? count(*)? from mytable? group by? age? with rolllup;
執(zhí)行順序:
from --where? --groupby--select--orderby
from----groupby--select--having--orderby
4.3.10)union(具有去重的作用,獲取的字段數必須一致(默認),假如不想去除重復? 使用union? all? order by 在聯合查詢中需要使用括號闊成一個整體才行,若要orderby 生效還需要使用limit搭配,limit使用最大值)
(select ? tno,? sgrade? from? students )union (select ? tno,? sgander? from? students );//連接顯示,也不會報錯。
4.3.11)password (),MD5(),encode(根據指定的字符串作為密碼加密),decode(根據指定的字符串作為密碼解密)
4.4)連接查詢
4.4.1)內連接//交集,條件都需要滿足才會顯示(一個重組的過程)
select?? s.name ,g.cls? from?? students s join grades g on s.sgrade between? g.gmin and g.gmax;//非等值連接
select?? s.name ,g.cls? from?? students s join grades g on? s.sgrade=g.sgrade;//等值連接
select?? s.name ,s.sname? from?? students s join students t on? s.tno=t.sno;//自連接
select?? s.name ,t.tname? from?? students s ? inner join teachers t on? s.tno=t.tno;//inner 可以省略,主要是便于閱讀,按left? right來判定連接
備注:還有一個交叉連接,沒有實際的意義?? cross? join == from? 表1,表2; 自然連接 natural? join? 根據字段匹配,沒有實際意義
4.4.2)外連接//左連接以左邊的表為基準,假如滿足右邊,則顯示左邊和右邊的重組,假如不滿足右邊,那么右邊為null(任何值與null運算都是null),
select?? s.name ,t.tname? from?? students s ? left? join teachers t on? s.tno=t.tno;//左外連接,左連接 join前面outer省略了
select?? s.name ,t.tname? from?? students s ? right? join teachers t on? s.tno=t.tno;//右外連接,右連接 join前面outer省略了
select?? s.name ,p.pname? from?? students? s? , persons p;//全連接,沒啥意義
4.4.3)多表連接
select?? s.name ,t.tname? from?? students s ? join teachers t on? s.tno=t.tno? join? grades g on?s.sgrade between? g.gmin and g.gmax ;
備注:先創(chuàng)建父表,再創(chuàng)建子表 ,先刪除子表在刪除子表, 插入數據先插父表,再插入子表
4.4.4)子連接
備注:還有 in? any? some? all 字段;? exists? 位于where之后 返回結構是0或者是1
select? 【select】 from? 【select】 where? 【selelct】//select返回的結果作為一個表或者一個值,不能放在limit中
select?? name?? from?? studens?? where? sgrade > select? avg(sgrade) from students;
select? s.sname ,(select? t.name from teachers t where s.tno=t.tno)? as tname from? students s;
4.4.5)limit
select ??sname,sgrade from? students? order by sgrade desc limit (pageNo-1)*pageSize,pageSize;//分頁僅適用于mysql
select?? sname? from? students order? by sgrade? desc limit 0,1;//0 ,可以省略,從1開始長度為1;、
4.4.6)now()//表示當前時刻,可以帶納秒now(6),最大6位,sysdate()//開始執(zhí)行該動作的時間? ,類似于可重復讀與不可重復讀的關系
4.4.7)case when...then..else...end或者case... when...then..else...end
select? sname ,case when sgrade>90 then '優(yōu)' when sgrade>80 then '良' else ‘加油’? end? as ‘段位’ ?from students;
select? sname ,case? tno? when?? 1 then '老師1' when 2 then '老師2' else ‘老師3’? end? as ‘老師’ ?from students;
4.4.8) 變量名
show variables??? like? ‘’//變量名的查看
select? @@變量名// 具體變量名的查看
set?? 變量名=xxx; //變量名的設置,會話級修改
set? global? 變量名=xxx; //全局修改,重新登錄才有效
5.增,刪,改
insert? into students (sname, sgrade...)? values('lili','90'...),...;//增 ,批量增加
insert? into?? stu1 select? * from stu;//將stu的插入stu1;
delete? from? students? where? id=1;//刪除
update?? students? set? sname =‘lili’ where id=2;//修改
update?? students? set? sname =‘lili’?? order? by? sal? limit 10;//修改前幾行,刪除也可以類似
6.數據庫引擎
查看所有的引擎:show engines;顯示yes表示當前支持的引擎,no表示不支持的引擎,需要安裝,默認的引擎回家defalut
innodb:服務器崩潰后自動恢復,acid兼容,支持提交,回滾等事務處理,支持級聯刪除和更新,行級鎖定,日志文件等,行鎖,支持高并發(fā),共享模式也是保存在三張表中,frm,..dir,..path分別是結構,數據,索引,多表空間存儲存在分表,結構frm文件,但是數據和索引保存在單獨的.idb文件中
memory:速度快,但是存于緩存中,不能持久化,表鎖
myisam:格式文件,數據文件,索引文件三張表組成,適用于查詢多,不適用增刪改多,表鎖
7.枚舉和集合
create? table? mytable (gender? enum(‘男’,‘女’));//enum 代表枚舉 ,用數字表示 ,可以使用gender +0 來計算;默認是嚴格模式,也必須是嚴格模式,只能插入枚舉中已經有的數據,最大65535個選項,占用一個字節(jié)來存儲,犧牲效率節(jié)省空間,從0開始;
create? table? mytable (sport? set(‘足球’,‘籃球’));//可以在set中多多選? 例如 insert into mytable values (‘足球,籃球’);也可以插入數組,規(guī)則是十進制轉換成2進制,1表示有,0表示沒有
8.對應關系
一對一:一張表的記錄對應另外一張表的一條記錄進行對象,反之亦然
一對多:一張表的一條記錄對應另一張表的多條記錄
多對多:一張表的一條記錄對應另一張表的多條記錄,反之亦然;
9.主鍵沖突
insert? into?? 表名 (字段名包含主鍵)? values (值列表)? on? duplicate? update 字段=新值;? //沖突更新
replace? into? 表名 (字段名包含主鍵) values (值列表) ;//查看是否存在? 存在就刪除后添加,不存在就添加
10.變量
select @變量名 ;//變量的定義 ,會話級別
set? @ 變量名:=值 ;//這里可以寫=,但是有些場合不能,因為=認為是==判斷
declare? 局部變量名 類型?? defalut? 默認值;//只能使用在 begin ...? end塊 中;
set? 局部變量名;//賦值
11.事務
acid//jdbc
可重復讀:發(fā)出數據后,發(fā)出的那一剎那,直至完成數據依舊保持在哪個時刻,就像now? 與sysdate
start? transaction ;
dml...
commit;(提交)//需要手動
備注:可以設置//set?? autocommit=off/0;設置后需要手動高的commit 和rollback,innodb是行鎖,在事務操作默認會升級為表鎖
start? transaction ;
dml....
rollback; (失敗后回滾)//需要手動
設置事務隔離級別
set?? global? transaction? isolation level read? commited;// read? uncommited? repeatable read? serializable
set autocommit? =off /on;省略了session,所有的ddl語句是不能回滾的,并且部分ddl語句會隱式提交,//oracle也是這樣
不全部回滾
start? transaction
語句..
savepoint? sp1;
語句
rollback to? sp1;回滾
12.數據庫表設計規(guī)范
1)有主鍵且原子不可再分;
2)所有的非主鍵完全依賴主鍵,而不是部分依賴主鍵,所有不能使用聯合主鍵;
3)非主鍵與主鍵不能存在傳遞性依賴;
備注:2),3)不一定要強制性實現,看實際情況。? 范式的作用主要是減少數據的冗余,但是一般來說會降低效率;后一范式必須滿足前一范式
13.觸發(fā)器
創(chuàng)建觸發(fā)器:
delimiter //? :以斜杠結束語句
create? trigger? 觸發(fā)器名稱? before/after(位置) insert(監(jiān)聽的事件) on 表名? for each row begin
insert? into?? test2? set a2=new.a1;//插入的時候執(zhí)行的語句
delete from? test3? where? a3=new.a1;//new 新值 old? 舊值(原來的值)
end//
select? triggers //查看觸發(fā)器;
show? create? trigger 觸發(fā)器名稱;//查看觸發(fā)過程;
select? * from?? information_schema.triggers?? where 條件;//查看觸發(fā)器信息
drop trigger? 觸發(fā)器名稱//刪除觸發(fā)器,觸發(fā)器不能修改,只能刪除后新建
備注:
一張表最多只能有6個觸發(fā)器,且只能有一種觸發(fā)時間的一種類型的觸發(fā)器,觸發(fā)器是總動觸發(fā)的
所有的觸發(fā)器都是在一張表中 information_schema.triggers,觸發(fā)器不能顯示或者映射的開始或者結束事務
14.分支結構
if?? 條件? then? 代碼? else 代碼? endif? //類似 if(條件,x,y)? ;
循環(huán)名稱: while? 判斷條件 do??? 代碼?? leave? /iterate ? 循環(huán)名稱 end while ; //leave 類似break? iterate類似continue
15.函數
create?? function? 函數名(參數) returns 數據類型-- 規(guī)定返回值類型
begin
函數體
返回值
end//作用于外部是一個延遲的過程
show? function status like? ‘’; //查看所有函數
show create? function 函數名;//查看創(chuàng)建語句
drop? function? 函數名; //函數只能先刪除后重建;
15存儲過程//一個沒有返回值的函數
create procedure 過程名稱 (參數)
begin
過程體
end
備注:過程沒有返回值 select不能訪問
show? procedure? status like? ‘’; //查看所有存儲過程
show create??procedure? 存儲過程名;//查看創(chuàng)建語句
drop? ?procedure? 存儲過程名; //只能先刪除后重建;
調用使用call? 存儲過程名;
備注:參數類型有3中 in 可以是值,out必須是變量,inout 必須是變量 //create?? procedure 過程名 (in? 形參名稱 數據類型 ,out?? 形參名稱 數據類型,inout? 形參名稱 數據類型),蒸鍋過程是滯后的,只有在內部完成之后,賦值才給傳入給外部的全局變量。
16.事件調度器
create?? event? 名稱 on? schedule? every? 5? second do?? 語句(insert... );//每個5s調度一次
show events;//查看調度器的狀態(tài)
show variables like ‘scheduler’;//查看調度器的狀態(tài) off 表示關閉;
alter? event 名稱? disable;//禁用調度器
drop event 調度器名稱;//刪除調度器;
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的mysql sql语句 入门_mysql(3)mysql的sql语句入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue prop不同数据类型(数组,对象
- 下一篇: sqlserver 触发器 update