Mysql的操作应用
生活随笔
收集整理的這篇文章主要介紹了
Mysql的操作应用
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.創(chuàng)建數(shù)據(jù)庫(kù)格式:create database if not exists 數(shù)據(jù)庫(kù)名 default charset utf8;注意:1、數(shù)據(jù)庫(kù)是唯一的2、if not exists先判斷是否存在這個(gè)數(shù)據(jù)庫(kù),存在不創(chuàng)建,不存在就創(chuàng)建。3、創(chuàng)建數(shù)據(jù)庫(kù),并設(shè)定編碼集為utf82.顯示當(dāng)前數(shù)據(jù)庫(kù)服務(wù)器下所有的數(shù)據(jù)庫(kù)名show databases;use 數(shù)據(jù)庫(kù)名 選擇數(shù)據(jù)庫(kù)注意:windows下面數(shù)據(jù)庫(kù)名是不區(qū)分大小寫(xiě)的,在Linux下面嚴(yán)格區(qū)分。3.刪除數(shù)據(jù)庫(kù) drop database 數(shù)據(jù)庫(kù)名查看已經(jīng)選擇的數(shù)據(jù)庫(kù)select database(); 查看當(dāng)前的數(shù)據(jù)庫(kù)的版本號(hào)select version();4.數(shù)據(jù)表的操作show tables 查看數(shù)據(jù)庫(kù)中的數(shù)據(jù)表。創(chuàng)建數(shù)據(jù)表格式:create table 表名(列的一些信息);例子:create table t1(id int(12), name varchar(100));create table `test t1`(id int(10), name varchar(50));desc 表名 查看表的結(jié)構(gòu).show create table 表名 查看建表的語(yǔ)句\G 格式化輸出(文本式,豎立顯示)drop table 數(shù)據(jù)表名drop table [if exists] 數(shù)據(jù)表名 嘗試性的刪除表。5.記錄操作 增、刪、改、查(1)插入數(shù)據(jù)格式: insert into 表名(字段1,字段2,字段3) values(值1,值2,值3);insert into 表名(字段1,字段2,字段3) values(a值1,a值2,a值3);(2)查詢(xún)表數(shù)據(jù)格式: select * from 表名;select 字段1,字段2,字段3 from 表名;select * from 表名 where 字段=某個(gè)值;(3)修改表數(shù)據(jù) 格式:update 表名 set 字段=某個(gè)值 where 條件;update 表名 set 字段1=值1,字段2=值2 where 條件;update 表名 set 字段=字段+值 where 條件;(4)刪除數(shù)據(jù)格式: delete from 表名 where 字段=某個(gè)值;delete from 表名; (慎重使用)delete from 表名 where 字段 = 值;清空表數(shù)據(jù)truncate table 表名;6.修改用戶(hù)密碼在退出mysql服務(wù)的情況下 輸入1、mysqladmin -u 用戶(hù)名 -p password 新密碼輸入舊密碼:2、登錄到mysql的時(shí)候使用set password for '用戶(hù)名'@'登錄主機(jī)'=password('新密碼');7.修改表的字段信息修改表的字符集alter table 表名 charset utf8修改字段的類(lèi)型alter table 表名 modify 字段名 字段類(lèi)型修改字段的名字并同時(shí)修改字段類(lèi)型alter table 表名 change 舊字段名 新字段名 字段類(lèi)型修改字段的字符集alter table 表名 modify 字段名 類(lèi)型 charset utf8添加新字段alter table 表名 add 字段名 類(lèi)型刪除字段alter table 表名 drop 字段名修改表名 alter table 舊表名 rename as 新表名8.刪除默認(rèn)匿名的賬戶(hù)為什么我直接輸入mysql也能進(jìn)入數(shù)據(jù)庫(kù)中。是匿名用戶(hù),MySQL默認(rèn)創(chuàng)建的。他有test和information_schema這兩個(gè)庫(kù)的權(quán)限。我們可以把他刪掉刪除匿名用戶(hù):drop user ''@'localhost';9.MySQL數(shù)據(jù)庫(kù)的數(shù)據(jù)類(lèi)型:MySQL的數(shù)據(jù)類(lèi)型分為四大類(lèi):數(shù)值類(lèi)型、字串類(lèi)型、日期類(lèi)型、NULL。1 數(shù)值類(lèi)型:*tinyint(1字節(jié)) 0~255 -128~127smallint(2字節(jié))mediumint(3字節(jié))*int(4字節(jié))bigint(8字節(jié))*float(4字節(jié)) float(6,2) float(m,d)*double(8字節(jié)) double (m,d)decimal(自定義)字串形數(shù)值 decimal(m,d) m精度 d標(biāo)度2 字串類(lèi)型普通字串*char 定長(zhǎng)字串 char(8):長(zhǎng)度為8位 *varchar 可變字串 varchar(8):最長(zhǎng)為8位二進(jìn)制類(lèi)型tinyblobblobmediumbloblongblob文本類(lèi)型tinytext*text 常用于<textarea></textarea>mediumtextlongtext*enum枚舉set集合3 時(shí)間和日期類(lèi)型:date 年月日time 時(shí)分秒datetime 年月日時(shí)分秒timestamp 時(shí)間戳year 年4 NULL值NULL意味著“沒(méi)有值”或“未知值”可以測(cè)試某個(gè)值是否為NULL不能對(duì)NULL值進(jìn)行算術(shù)計(jì)算對(duì)NULL值進(jìn)行算術(shù)運(yùn)算,其結(jié)果還是NULL0或NULL都意味著假,其余值都意味著真MySQL的運(yùn)算符:算術(shù)運(yùn)算符:+ - * / % 比較運(yùn)算符:= > < >= <= <> != 數(shù)據(jù)庫(kù)特有的比較:in,not in, is null,is not null,like, between and 邏輯運(yùn)算符:and or notlike: 支持特殊符號(hào)%和_ ; 其中 %表示任意數(shù)量的任意字符,_表示任意一位字符。表的字段約束:unsigned 無(wú)符號(hào)(正數(shù))zerofill 前導(dǎo)零填充default 默認(rèn)值not null 非空auto_increment 自增 在產(chǎn)生一個(gè)唯一的標(biāo)識(shí)或順序值的時(shí)候,可以利用這個(gè)約束條件。這個(gè)約束條件只能用于整數(shù)類(lèi)型,值一般從1開(kāi)始。每行加1,插入一個(gè)null到一個(gè)auto_increment列時(shí),MySQL將插入一個(gè)比出現(xiàn)過(guò)的最大值+1的值。一個(gè)表中只能有一個(gè)auto_increment列,并且必須定義為primary key或unique才能夠使用primary key 主鍵索引 (非null并不重復(fù))unique 唯一索引 (可以為null但不重復(fù))index 常規(guī)索引9.建表語(yǔ)句格式:create table 表名(字段名 類(lèi)型 [字段約束],字段名 類(lèi)型 [字段約束],字段名 類(lèi)型 [字段約束]...);實(shí)例:create table stu(id int unsigned not null auto_increment primary key,name varchar(8) not null unique,age tinyint unsigned,sex enum('m','w') not null default 'm',classid char(6));10.插入數(shù)據(jù)1 插入指定字段insert into t1(字段1,字段2,字段3...) values ('值1','值2','值3',....);2 插入所有的字段insert into t1 values ('值1','值2','值3',....);3 插入多條數(shù)據(jù)insert into t1(字段1,字段2,字段3...) values ('值1','值2'),('值1','值2')....;4 插入結(jié)果insert into t1(字段1,字段2,字段3...) select 字段1,字段2,字段3... from t1;insert into t1() select * from t1;5 插入單條數(shù)據(jù)insert into t1 set 字段1=值1,字段2=值2....;11.查詢(xún)數(shù)據(jù)格式:select [字段列表]|* from 表名[where 搜索條件][group by 分組字段 [having 子條件]][order by 排序 asc|desc][limit 分頁(yè)參數(shù)]查看stu表中的信息: select * from stu;where條件查詢(xún)1. 查詢(xún)班級(jí)為lamp138期的學(xué)生信息select * from stu where classid='lamp138';2. 查詢(xún)lamp138期的男生信息(sex為m)select * from stu where classid='lamp138' and sex='m';3. 查詢(xún)id號(hào)值在10以上的學(xué)生信息select * from stu where id>10;4. 查詢(xún)年齡在20至25歲的學(xué)生信息select * from stu where age>=20 and age<=25;select * from stu where age between 20 and 25;5. 查詢(xún)年齡不在20至25歲的學(xué)生信息select * from stu where age not between 20 and 25;select * from stu where age<20 or age>25;6. 查詢(xún)id值為1,8,4,10,14的學(xué)生信息select * from stu where id in(1,8,4,10,14);select * from stu where id=1 or id=8 or id=4 or id=10 or id=14;7. 查詢(xún)lamp138和lamp94期的女生信息select * from stu where classid in('lamp138','lamp94') and sex='w';select * from stu where (classid='lamp138' or classid='lamp94') and sex='wLIKE 子句這時(shí)我們就需要在 WHERE 子句中使用 SQL LIKE 子句。LIKE 子句中使用百分號(hào)%字符來(lái)表示任意字符,類(lèi)似于UNIX或正則表達(dá)式中的星號(hào)*。如果沒(méi)有使用百分號(hào)%, LIKE 子句與等號(hào)=的效果是一樣的。LIKE 通常與 % 一同使用,類(lèi)似于一個(gè)元字符的搜索。你可以使用 AND 或者 OR 指定一個(gè)或多個(gè)條件。你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句來(lái)指定條件。可以使用regexp正則來(lái)代替 like1.查詢(xún)name字段值是以zh開(kāi)頭的所有信息select * from stu where name like "zh%";select * from stu where name regexp "^zh"; --正則寫(xiě)法2.查詢(xún)姓名name中含有ang子串的所有信息select * from stu where name like "%ang%";select * from stu where name regexp "ang";3.查詢(xún)姓名是任意四位字符構(gòu)成的信息。select * from stu where name like "____";select * from stu where name regexp "^[a-z0-9]{4}$";創(chuàng)建一個(gè)表結(jié)構(gòu)和另一個(gè)表一樣的結(jié)構(gòu):create table t3 like t1;那么現(xiàn)在t3表的結(jié)構(gòu)和t1表的結(jié)構(gòu)是一樣的,但是要注意數(shù)據(jù)是沒(méi)有的MySQL的統(tǒng)計(jì)函數(shù)(聚合函數(shù)):max() min() count() sum() avg()1.獲取學(xué)生表中最大、最小以及平均年齡是多少?select max(age),min(age),avg(age) from stu;2.獲取學(xué)生表中男生m的數(shù)量select count(*) from stu where sex='m';GROUP BY 語(yǔ)句 分組GROUP BY 語(yǔ)句根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。統(tǒng)計(jì)班級(jí)信息,按性別分組,并統(tǒng)計(jì)每組人數(shù);select sex,count(*) from stu group by sex;1.統(tǒng)計(jì)每個(gè)班級(jí)的人數(shù)select classid,count(*) from stu group by classid;2.統(tǒng)計(jì)每個(gè)班級(jí)的,男生和女生各多少人數(shù)。select classid,sex,count(*) from stu group by classid,sex;ORDER BY 排序 -- asc 默認(rèn)升序 desc 降序我們知道從 MySQL 表中使用 SQL SELECT 語(yǔ)句來(lái)讀取數(shù)據(jù)。如果我們需要對(duì)讀取的數(shù)據(jù)進(jìn)行排序,我們就可以使用 MySQL 的ORDER BY子句來(lái) 設(shè)定你想按哪個(gè)字段哪種方式來(lái)進(jìn)行排序,再返回搜索結(jié)果。你可以使用任何字段來(lái)作為排序的條件,從而返回排序后的查詢(xún)結(jié)果。你可以設(shè)定多個(gè)字段來(lái)排序。你可以使用 ASC 或 DESC 關(guān)鍵字來(lái)設(shè)置查詢(xún)結(jié)果是按升序或降序排列。 默認(rèn)情況下,它是按升序排列。你可以添加 WHERE...LIKE 子句來(lái)設(shè)置條件。1.按年齡升序排序查詢(xún)學(xué)生信息select * from stu order by age;select * from stu order by age asc; --默認(rèn)asc升序 可省略2.年齡降序排序select * from stu order by age desc;3.查詢(xún)學(xué)生信息,按班級(jí)做升序排序,相同班級(jí)按年齡降序排序select * from stu order by classid asc,age desc;LIMIT 關(guān)鍵字 查詢(xún)部分?jǐn)?shù)據(jù)-- 例如: .... limit m; 查詢(xún)數(shù)據(jù)只顯示前m條-- 例如: .... limit m,n; 排除前m條,然后再查詢(xún)出前n條1.查詢(xún)前5條信息select * from stu limit 5;2.排除前2條后再獲取4條信息select * from stu limit 2,4;12.修改數(shù)據(jù)格式:update 表名 set 字段1=值1,字段2=值2,字段n=值n... where 條件 -- 將id為11的age改為35,sex改為m值update stu set age=35,sex='m' where id=11;-- 將id值為12和14的數(shù)據(jù)值sex改為m,classid改為lamp92update stu set sex='m',classid='lamp92' where id=12 or id=14 --等價(jià)于下面update stu set sex='m',classid='lamp92' where id in(12,14);13.刪除操作格式:delete from 表名 [where 條件]-- 刪除stu表中id值為100的數(shù)據(jù)delete from stu where id=100;-- 刪除stu表中id值為20到30的數(shù)據(jù)delete from stu where id>=20 and id<=30;-- 刪除stu表中id值為20到30的數(shù)據(jù)(等級(jí)于上面寫(xiě)法)delete from stu where id between 20 and 30;-- 刪除stu表中id值大于200的數(shù)據(jù)delete from stu where id>200;14.導(dǎo)入和導(dǎo)出注意: 在操作導(dǎo)入和導(dǎo)出數(shù)據(jù)的時(shí)候 不要登錄到mysql服務(wù)中,要退出mysql服務(wù)進(jìn)行操作-- 將lamp138數(shù)據(jù)庫(kù)里面的所有的表導(dǎo)出C:\>mysqldump -u root -p lamp138 > C:\lamp138.sqlEnter password:---- 將lamp138數(shù)據(jù)庫(kù)中的stu表導(dǎo)出C:\>mysqldump -u root -p lamp138 stu > C:\lamp138_stu.sqlEnter password:-- 將lamp138庫(kù)中的所有表導(dǎo)入C:\>mysql -u root -p lamp138 < C:\lamp138.sqlEnter password:-- 將lamp138庫(kù)中stu表導(dǎo)入C:\>mysql -u root -p lamp138 < C:\lamp138_stu.sqlEnter password:*********************-- 將所有的數(shù)據(jù)庫(kù)進(jìn)行導(dǎo)出mysqldump -uroot -p密碼 --all-databases --events > /tmp/bak.sql 所有數(shù)據(jù)庫(kù)備份15.MySQL的權(quán)限管理格式:grant 權(quán)限 on 數(shù)據(jù)庫(kù).數(shù)據(jù)表 to '用戶(hù)名'@'登錄主機(jī)' identified by '密碼'刷新權(quán)限flush privileges;舉例:grant select,insert,update,delete on *.* to 'wjs'@'%' identified by '12345'; 安全的做法grant select,insert,update,delete on pass.* to 'root'@'localhost' identified by '12345'; 只針對(duì)localhost主機(jī)里面的 pass數(shù)據(jù)庫(kù)里面的數(shù)據(jù)表進(jìn)行增刪該查 刪除用戶(hù)drop user 'xxoo'@'%' 16.索引的作用:索引是數(shù)據(jù)庫(kù)中用來(lái)提高搜索性能的。我們通常在做數(shù)據(jù)庫(kù)優(yōu)化的時(shí)候通常先做索引的優(yōu)化,數(shù)據(jù)量少的時(shí)候沒(méi)效果,數(shù)據(jù)越多效果越明顯。查看表中都有哪些索引show index from 表名\G索引的分類(lèi):常規(guī)索引(index)最基本的索引,沒(méi)有任何限制添加表字段的常規(guī)索引create index 索引名 on 表名(字段名)alter table 表名 add index 索引名(字段名) 在創(chuàng)建表的時(shí)候也可以進(jìn)行添加create table t2(id int(10) unsigned auto_increment primary key,name varchar(255), index 索引名(字段名));刪除表字段常規(guī)索引**drop index 索引名 on 表名alter table 表名 drop index 索引名唯一索引(unique)唯一索引是可以給每個(gè)字段進(jìn)行添加的,添加完了之后字段里面的值就不可以重復(fù)了,主鍵索引和唯一索引類(lèi)似,但是數(shù)據(jù)表里的主鍵索引只能加在一個(gè)字段里(一般都加在id上),id是自增的,索引不會(huì)有重復(fù)的時(shí)候出現(xiàn)添加表字段的唯一索引create unique index 索引名 on 表名(字段名)alter table 表名 add unique 索引名(字段名)在創(chuàng)建表的時(shí)候也可以進(jìn)行添加create table t2(id int(10) unsigned auto_increment primary key,name varchar(255), unique 索引名(字段名));刪除唯一索引drop index 索引名 on 表名主鍵索引(primary key)主鍵索引是關(guān)系數(shù)據(jù)庫(kù)中最常見(jiàn)的索引類(lèi)型,主要作用是確定數(shù)據(jù)表里一條特定的數(shù)據(jù)記錄的位置。我們可以在字段后添加PRIMARY KEY來(lái)對(duì)字段設(shè)置為主鍵索引。注意:1.最好為每張表指定一個(gè)主鍵,但不是必須指定。2.一個(gè)表只能指定一個(gè)主鍵,而且主鍵的值不能為空3.主鍵可以有多個(gè)候選索引(例如NOT NULL,AUTO_INCREMENT)添加表字段的主鍵索引alter table 表名 add primary key (字段名)添加自增alter table 表名 modify id int(4) auto_increment刪除主鍵索引如果字段有了auto_increment 和 primary key的時(shí)候,需要?jiǎng)h除主鍵的話(huà),先刪除自增,然后再刪除主鍵 刪除自增alter table 表名 change 字段名 字段名 類(lèi)名刪除主鍵alter table 表名 drop primary key 全文索引(fulltext)全文索引在MySQL中是一個(gè)FULLTEXT類(lèi)型索引,但FULLTEXT索引只能用于MyISAM表,并且只可以在CHAR、VARCHAR或TEXT類(lèi)型的列上創(chuàng)建,也允許創(chuàng)建在一個(gè)或多個(gè)數(shù)據(jù)列上。添加表字段的全文索引alter table 表名 add fulltext 索引名(字段名)刪除全文索引drop index (索引名) on 表名alter table 表名 drop index 索引名注意:如果在創(chuàng)建索引的時(shí)候,不添加索引名的話(huà) 默認(rèn)會(huì)把字段名當(dāng)做索引名17.表的存儲(chǔ)引擎存儲(chǔ)引擎: 是MySQL的一個(gè)特性之一,用戶(hù)可以根據(jù)應(yīng)用的需要選擇如何存儲(chǔ)MySQL支持MyISAM、InnoDB、HEAP、BOB、ARCHIVE、CSV、MEMORY等多種數(shù)據(jù)表引擎,在創(chuàng)建一個(gè)新MySQL數(shù)據(jù)表時(shí),可以為它設(shè)置一個(gè)引擎類(lèi)型。MyISAM和InnoDB兩種表類(lèi)型最為重要:1.MyISAM數(shù)據(jù)表類(lèi)型的特點(diǎn)是成熟、穩(wěn)定和易于管理。2.MyISAM表類(lèi)型會(huì)產(chǎn)生碎片空間,要經(jīng)常使用OPTIMIZE TABLE命令去清理表空間3.MyISAM不支持事務(wù)處理,InnoDB支持4.MyISAM不支持外鍵,InnoDB支持5.MyISAM表類(lèi)型的數(shù)據(jù)表效率更高6.MyISAM表類(lèi)型的數(shù)據(jù)表會(huì)產(chǎn)生三個(gè)文件---.frm (表結(jié)構(gòu))---.myd (表數(shù)據(jù))---.myi (表索引)InnoDB表類(lèi)型表默認(rèn)只會(huì)產(chǎn)生兩個(gè)文件---.frm (表結(jié)構(gòu))---.ibd (表數(shù)據(jù)+表索引)7.MyISAM表,其優(yōu)勢(shì)就是訪問(wèn)的速度快。對(duì)事務(wù)沒(méi)有完整性的要求或以select、insert為主的通常使用MyISAM表8.InnoDB表:會(huì)占用更多的磁盤(pán)空間鎖機(jī)制:MyISAM 表鎖:開(kāi)銷(xiāo)小,加鎖快,發(fā)生沖突的概率高。InnoDB 行鎖:開(kāi)銷(xiāo)大,加鎖慢,發(fā)生沖突的概率低。9.默認(rèn)是InnoDB引擎 數(shù)據(jù)存儲(chǔ)在 innodb_data_home_dir選項(xiàng)所選的文件名的目錄里查看默認(rèn)的引擎show variables like 'default_storage_engine';查看支持的引擎show engines查看當(dāng)前庫(kù)里面所有的表引擎show table status from 庫(kù)名修改表引擎alter table 表名 engine = 新的表引擎ubuntu下//mysql配置文件sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf//重啟sudo /etc/init.d/mysqld restart18.表的結(jié)構(gòu)要滿(mǎn)足三范式1NF 原子性 字段不可再分,否則就不是關(guān)系數(shù)據(jù)庫(kù); 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只要數(shù)據(jù)庫(kù)是關(guān)系型數(shù)據(jù)庫(kù)(mysql/oracle/db2/informix/sysbase/sql server),就自動(dòng)的滿(mǎn)足1NF。數(shù)據(jù)庫(kù)表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng),而不能是集合,數(shù)組,記錄等非原子數(shù)據(jù)項(xiàng)。如果實(shí)體中的某個(gè)屬性有多個(gè)值時(shí),必須拆分為不同的屬性 。通俗理解即一個(gè)字段只存儲(chǔ)一項(xiàng)信息。2NF 唯一性 要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)例或行必須可以被惟一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要我們?cè)O(shè)計(jì)一個(gè)主鍵來(lái)實(shí)現(xiàn)(這里的主鍵不包含業(yè)務(wù)邏輯)。3NF 無(wú)冗余性 要求一個(gè)數(shù)據(jù)庫(kù)表中不包含已在其它表中已包含的非主鍵字段。就是說(shuō),表的信息,如果能夠被推導(dǎo)出來(lái),就不應(yīng)該單獨(dú)的設(shè)計(jì)一個(gè)字段來(lái)存放(能盡量外鍵join就用外鍵join)。很多時(shí)候,我們?yōu)榱藵M(mǎn)足第三范式往往會(huì)把一張表分成多張表。29.left join、right join、inner join的區(qū)別left join(左聯(lián)接) 返回包括左表中的所有記錄和右表中聯(lián)結(jié)字段相等的記錄right join(右聯(lián)接) 返回包括右表中的所有記錄和左表中聯(lián)結(jié)字段相等的記錄inner join(等值連接) 只返回兩個(gè)表中聯(lián)結(jié)字段相等的行舉例:left joinselect * from p1 left join p2 on p1.id = p2.id;right joinselect * from p1 right join p2 on p1.id = p2.id;inner joinselect * from p1 inner join p2 on p1.id = p2.id;20.子查詢(xún)1、單行子查詢(xún)select name,age,scorefrom userwhere age=(select age from stu where id = 1);2、多行子查詢(xún)select name,age,class from user where age in (select age from stu where id < 10);select name,age.class from user where age in (select age from stu where name like '王%');21.分組 group by1 查詢(xún)各個(gè)班級(jí)中年齡大于20,性別為男的人數(shù)、姓名和班級(jí) (數(shù)據(jù)表: stu) 為了防止班級(jí)里面有重名的現(xiàn)象發(fā)生(例如 兩個(gè)男生都是20歲 以上的) 所以會(huì)有count(*)select count(*),classid,name from t1 where sex='男' group by classid,age having age > 20; 2 學(xué)校評(píng)選先進(jìn)學(xué)生,要求平均成績(jī)大于等于90分的學(xué)生,并且語(yǔ)文課必須在95分以上,請(qǐng)列出有資格的學(xué)生 (數(shù)據(jù)表: score)select classid,name from sc where (yw+sx+en)/3 >= 90 and yw>=95 group by classid,name;select classid,group_concat(name) from sc where (yw+sx+en)/3>=90 and yw>=95 group by classid;3 用一條sql語(yǔ)句查詢(xún)出每門(mén)課都大于80分的學(xué)生姓名 (數(shù)據(jù)表: courseinfo)select name from courseinfo group by name having min(score) > 80;select DISTINCT name from courseinfo where name not in (select distinct name from courseinfo where score < 80);22.創(chuàng)建視圖視圖是一個(gè)虛擬表,其內(nèi)容由查詢(xún)定義。同真實(shí)的表一樣,視圖包含一系列帶有名稱(chēng)的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫(kù)中以存儲(chǔ)的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來(lái)自由定義視圖的查詢(xún)所引用的表,并且在引用視圖時(shí)動(dòng)態(tài)生成。如果你想創(chuàng)建視圖的話(huà) 首先你的數(shù)據(jù)庫(kù)要有創(chuàng)建視圖的權(quán)限,不然的話(huà)是創(chuàng)建不成功的create view v1 as select * from t1 where id > 1;創(chuàng)建v1的視圖 把查詢(xún)t1表里面的符合條件的數(shù)據(jù)放到v1里面注意:如果主表不存在 那么視圖表失效刪除視圖表drop view v1;23.mysql內(nèi)置函數(shù)字符串鏈接 concat('name','id');最大值 max('price')最小值 min('price')平均值 avg('price')定義變量 set @a = 10獲取變量的值 select @a計(jì)算 select @a + @b; select 10 + 20字符串轉(zhuǎn)換成大寫(xiě)和小寫(xiě) select ucase('name') select lcase('NAME')計(jì)算字符串的長(zhǎng)度 select length('namesss') as len;select * from user where length(name) > 5; 名字大于5的長(zhǎng)度找出來(lái)去除兩側(cè)的空白 select trim(' pass ');select length(trim(' over '));隨機(jī)數(shù) 從0-1之間的隨機(jī)數(shù) select rand();獲取0-10之間的隨機(jī)整數(shù)向上取整 select ceil(rand()*10)獲取時(shí)間戳 select unix_timestamp();24.mysql預(yù)處理**設(shè)置一個(gè)占位符prepare 名字 from "select * from t2 where id > ?";設(shè)置變量set @id = 2;執(zhí)行execute 名字 using @id;**設(shè)置多個(gè)占位符prepare 名字 from "select * from t2 where id > ? and id < ?";設(shè)置變量set @id = 2;set @id1 = 5;執(zhí)行execute 名字 using @id,$id1;25.mysql存儲(chǔ)過(guò)程簡(jiǎn)單的說(shuō),就是一組SQL語(yǔ)句集,功能強(qiáng)大,可以實(shí)現(xiàn)一些比較復(fù)雜的邏輯功能MySQL存儲(chǔ)過(guò)程的創(chuàng)建創(chuàng)建的格式:CREATE PROCEDURE 過(guò)程名 ([過(guò)程參數(shù)[,...]])[特性 ...]過(guò)程體舉個(gè)例子:**修改結(jié)束符mysql-> delimiter //**創(chuàng)建mysql-> create procedure proc() -> begin-> select * from user; ->end// **使用mysql-> call proc()//**修改結(jié)束符 mysql-> delimiter ;注意:(1)這里需要注意的是DELIMITER //和DELIMITER ;兩句,DELIMITER是分割符的意思,因?yàn)镸ySQL默認(rèn)以";"為分隔符,如果我們沒(méi)有聲明分割符,那么編譯器會(huì)把存儲(chǔ)過(guò)程當(dāng)成SQL語(yǔ)句進(jìn)行處理,則存儲(chǔ)過(guò)程的編譯過(guò)程會(huì)報(bào)錯(cuò),所以要事先用DELIMITER關(guān)鍵字申明當(dāng)前段分隔符,這樣MySQL才會(huì)將";"當(dāng)做存儲(chǔ)過(guò)程中的代碼,不會(huì)執(zhí)行這些代碼,用完了之后要把分隔符還原。格式:\d // 把結(jié)束符的分號(hào)改成 //結(jié)束本條sql語(yǔ)句\d 和 delimiter 是一樣的 都可以修改mysql的結(jié)束符(2)過(guò)程體的開(kāi)始與結(jié)束使用BEGIN與END進(jìn)行標(biāo)識(shí)(3)存儲(chǔ)過(guò)程根據(jù)需要可能會(huì)有輸入輸出參數(shù),輸入?yún)?shù)x 類(lèi)型int型 ,輸出參數(shù)num 類(lèi)型是int型,如果有多個(gè)參數(shù)用","分割開(kāi)。create procedure lamp172(in x int,out num int)-> begin-> set num = x + 20;-> end//調(diào)用 call lamp172(10,@s)//select @s as num//使用循環(huán)插入數(shù)據(jù)create procedure total(num int(10))->begin->set @i = 0;->while @i<num do->insesrt into t1 values (null,'www',20);->set @i = @i+1;->end while;->end//注意 : 寫(xiě)存儲(chǔ)過(guò)程名字的時(shí)候 不要使用關(guān)鍵字 和 數(shù)字例如:create procedure 111() 數(shù)字錯(cuò)誤create procedure add() 關(guān)鍵字錯(cuò)誤刪除存儲(chǔ)名drop procedure if exists 存儲(chǔ)名;26.mysql觸發(fā)器 trigger
在t2表插入數(shù)據(jù)的同時(shí)使用trigger 修改其他表的信息格式: create trigger 名字 after/before insert/update/delete on 表名 for each row begin語(yǔ)句end例如:create trigger tg_1 before insert on t2 for each rowbegininsert into t3(name) values (new.name);end//插入數(shù)據(jù)insert into t3(name) values ('wwww')//create trigger tg_2 after update on t1 for each rowbeginupdate t2 set t2.name= new.name where t2.id = old.id;end//update t1 set name = 'xxoo' where id = 2//create trigger tg_3 after delete on t1 for each rowbegindelete from t2 where id = old.gid; // old.gid 這里面的gid是t1表與t2表相關(guān)的id號(hào)end//delete from t1 where gid = 2// gid=2 ====> old.gid//查看觸發(fā)器show triggers;//刪除觸發(fā)器drop trigger 名字;27.mysql 讀寫(xiě)鎖
讀鎖: 所有的終端都可以讀取數(shù)據(jù) 但是不能操作數(shù)據(jù)(增 刪 改)lock table t2 read解鎖unlock tables;寫(xiě)鎖: 當(dāng)前的終端對(duì)表進(jìn)行寫(xiě)鎖之后,代表本終端可以進(jìn)行讀寫(xiě)操作,但別的終端不可以進(jìn)行讀寫(xiě)操作lock table t2 write;
解鎖unlock tables;28.mysql表數(shù)據(jù)的備份與恢復(fù)操作
使用SQL語(yǔ)句備份和恢復(fù)你可以使用SELECT INTO OUTFILE語(yǔ)句備份數(shù)據(jù),并用LOAD DATA INFILE語(yǔ)句恢復(fù)數(shù)據(jù)。
這種方法只能導(dǎo)出數(shù)據(jù)的內(nèi)容,不包括表的結(jié)構(gòu),如果表的結(jié)構(gòu)文件損壞,你必須要先恢復(fù)原來(lái)的表的結(jié)構(gòu)。格式:備份操作SELECT * INTO {OUTFILE | DUMPFILE} 'file_name' FROM tbl_name恢復(fù)操作LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name舉例:導(dǎo)出select * from t2 into outfile '../lamp185.txt'; //相對(duì)于mysql.exe文件的路徑 清空truncate table t2;導(dǎo)入load data infile '../lamp185.txt' into table t2; 29.增量備份一種mysql操作記錄的備份(1)操作修改配置文件my.ini[mysqld]log-bin=c:/mysql/mysql-log #(這里是備份文件存放的位置) 文件夾要存在才行expire_logs_days=7 # binlog過(guò)期清理時(shí)間 單位為天binlog_format = MIXED #binlog日志格式(2)查看可以使用mysql的命令進(jìn)行查看增量備份中的內(nèi)容mysqlbinlog c:/mysql/mysql-log.000001(3)數(shù)據(jù)恢復(fù)通過(guò)時(shí)間: mysqlbinlog --stop-datetime="2016-10-10 10:20:30" c:/mysql/mysql-log.000001 | mysql -uroot -p通過(guò)位置: mysqlbinlog --stop-position="150" c:/mysql/mysql-log.000001 | mysql -uroot -p#171208 15:50:06 server id 1 end_log_pos 2227 CRC32 0x7ff79ffa這里面的171208 15:50:06 時(shí)間是上面的datetime的時(shí)間這里面的end_log_pos 2227 是上面 position="150"(4)重新記錄增量備份reset master 在mysql命令行中進(jìn)行輸入30.查詢(xún)處理語(yǔ)句分析 explain指令格式:explain select * from usertype 類(lèi)型快慢順序system> const >eq_ref > ref > fulltext >ref_or_null >index_merge > unique_subquery > index_subquery > range>index > allconst:表中滿(mǎn)足條件的記錄最多一條,通常會(huì)出現(xiàn)在主鍵和unique索引中explain select * from test where id=1explain select * from test_2 where name = 'zhangsan'eq_ref:對(duì)于每個(gè)來(lái)自于前面的表的行組合,從該表中讀取一行。這可能是最好的聯(lián)接類(lèi)型,除了const類(lèi)型。它用在一個(gè)索引的所有部分被聯(lián)接使用并且索引是unique或primary keyexplain select type.name,typechild.childname from type,typechild where type.id = typechild.pid;ref:使用普通索引進(jìn)行查詢(xún)explain select * from test where name = 'abc';ref_or_null:通過(guò)普通索引檢索,并且會(huì)檢索null值explain select * from test_2 where nickname = 'zhangsan' or nickname = null;range :當(dāng)查詢(xún)范圍的時(shí)候explain select * from test where id < 3;或explain select * from test where id in (1,2,3);或explain select * from test where id between 1 and 3;index:跟all一樣,不過(guò)只會(huì)掃描索引explain select id from test;all:全表掃描explain select * from test注意:查詢(xún)一定或者盡量不要出現(xiàn)all類(lèi)型(全表掃描,速度是最慢的)key(代表的是搜索時(shí)使用到的索引名)31.開(kāi)啟慢查詢(xún)記錄需要進(jìn)行配置 在mysql中的my.ini中進(jìn)行設(shè)置slow-query-log = 1 # 開(kāi)啟慢查詢(xún)操作slow-query-log-file = slow.log # 文件默認(rèn)存放在mysql的data目錄下 (文件名自定義)long-query-time = 1 # 超時(shí)時(shí)間定為1秒 如果執(zhí)行的sql語(yǔ)句超過(guò)1秒鐘就把語(yǔ)句存放到slow.log文件中 (不能使用小數(shù))# 菜鳥(niǎo)教程.鏈接python的一個(gè)網(wǎng)站: www.runoob.com
轉(zhuǎn)載于:https://www.cnblogs.com/w-zc/p/8029115.html
總結(jié)
以上是生活随笔為你收集整理的Mysql的操作应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: setTimeout 定时器的使用
- 下一篇: 怎样在Web开发中完美控制IE标题栏