綜合使用 查詢 目錄:
#----綜合使用 書寫順序 select distinct * from '表名' where '限制條件' group by '分組依據' having '過濾條件' order by limit '展示條數' 執行順序 from -- 查詢 where -- 限制條件 group by -- 分組 having -- 過濾條件 order by -- 排序 limit -- 展示條數 distinct -- 去重 select -- 查詢的結果 正則:select * from emp where name regexp '^j.*(n|y)$'; 集合查詢:max 、min 、avg 、sum 、count 、group_concat 。 內連接:inner join 左連接:left join 右連接:right join 全連接: 左連接 union 右連接 replace 替換 拼接:concat、concat_ws、group_concat
常規設置操作
1.服務器設置遠程訪問
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;2.Linux中數據庫的基本操作命令
1.使用service 啟動:service mysql start 停止:service mysql stop 重啟:service mysql restart 2.清屏:clear,reset3.備份數據庫
#mysqldump -uroot -p密碼 數據庫名 > D:/備份文件名.sql4.恢復備份的數據庫
#首先在mysql里建好數據庫名 #mysql -uroot -p密碼 數據庫名 < D:/備份文件名.sql5.查詢binlog日志是否開啟
show variables like 'log_%';
基本操作:
1.單表約束
#主鍵約束:PRIMARY KEY 要求被裝飾的字段:唯一和非空 #唯一約束:UNIQUE 要求被裝飾的字段:唯一, # .聯合唯一:在結尾:unique(字段1,字段2) #非空約束:NOT NULL 要求被裝飾的字段:非空 #外鍵約束:FOREIGN KEY 某主表的外鍵 #自動增加:AUTO_INCREMENT 自動增加(需要和主鍵 PRIMARY KEY 同時用) #設置默認值:DEFAULT 為該屬性設置默認值 # 在int、char中:zerofill 不足位數默認填充0 # #2.常用數據類型
int #整型,4個字節 一般不需要指定寬度,(8):只是顯示為8位,默認有負號設置無負號: unsigned double #浮點型,例如double(5,2),標識最多5位,其中2位為小數,即最大為999.99 varchar #可變長度字符串類型。例如:varchar(10) 'aaa' 占3位 char #固定長度字符串類型。例如:char(10) 'aaa' 占10位 text #大文本字符串類型。 blob #字節類型。例如: datetime #日期時間類型。例如:datetime(yyyy-MM-dd hh:mm:ss) date #日期類型。例如:date(yyyy:MM:dd) time #時間類型。例如:time(hh:mm:ss) timestamp #時間戳類型。例如:timestamp(yyyy-MM-dd hh:mm:ss) 會自動賦值 enum #枚舉 多選一 enum('male','female'),default為默認值 例如:sex enum('male','female') not null default 'male' set #集合 多選多,可以選一個 set('read','DJ','DBJ','run') 注:字符串類型和時間類型都要用單引號括起來,空值為null3.查看數據列表
show databases; -- 查看所有數據庫 show create table 表名; -- 查看表的創建細節 desc 表名; -- 查看表結構4.進入數據庫
#use 數據名 use Python_75.創建數據庫
#CREATE DATABASE 數據庫名 CREATE DATABASE Python_7; CREATE DATABASE pyrhon_7 charset utf8 # 修改數據庫編碼 alter database db1 charset gbk;6.刪除數據庫
#drop database 需要刪除的數據庫名 drop database Python_7;7.查看表
select database(); # 查看當前所在的庫 show tables; -- 查看數據庫中所有表 desc 表名; -- 查看表結構 show create table 表名; -- 查看表的創建細節8.創建表
# 創建新表 # create table 新建數據表名( # 字段名 類型(長度) [約束(具體見1)], # 字段名 類型(長度) [約束(具體見1)] # ); create table class( id INT AUTO_INCREMENT, name varchar(32) UNIQUE, age varchar(32) NOT NULL ); #需要注意 #根據已有的表創建新表 create table 新表 like 舊表 -- 使用舊表創建新表 create table 新表 as select 字段1 字段2... from definition only -- 使用自定義值去新建表9.刪除表
#drop table 數據庫表名 drop table Python10.修改表
alter table 表名 add 字段名 類型(長度) [約束]; -- 添加列 alter table 表名 modify 字段名 類型(長度) [約束]; -- 修改列的類型長度及約束 alter table 表名 change 舊字段名 新字段名 類型(長度) [約束]; -- 修改列表名 alter table 表名 drop 字段名; -- 刪除列 alter table 表名 character set 字符集; -- 修改表的字符集 rename table 表名 to 新表名; -- 修改表名11.增加數據
insert into 表(字段名1,字段名2..) values(值1,值2..);-- 向表中插入某些列 insert into 表 values(值1,值2,值3..); -- 向表中插入所有列12.修改數據
update 表名 set 字段名=值,字段名=值...; -- 這個會修改所有的數據,把一列的值都變了 update 表名 set 字段名=值,字段名=值... where 條件; -- 只改符合where條件的行13.刪除數據
delete from 表名 -- 刪除表中所有記錄 delete from 表名 where 條件 -- 刪除符合 where條件的數據 truncate table 表名; -- 把表直接drop掉,重新建表,auto_increment將置為零。刪除的數據不能找回。執行速度比delete快14.數據的簡單查詢
select * from 表名; -- 查詢所有列 select 字段名1,字段名2,字段名3.. from 表名; -- 查詢指定列15.幾個簡單的基本的sql語句
select * from 表名 where 范圍 -- 選擇查詢 insert into 表名(field1,field2) values(value1,value2) -- 插入 delete from 表名 where 范圍 -- 刪除 update 表名 set field1=value1 where 范圍 -- 更新 select * from 表名 where field1 like ’%value1%’ -- 查找 select * from 表名 order by field1,field2 [desc] -- 排序: select count as 需要統計總數的字段名 from 表名 -- 總數 select sum(field1) as sumvalue from 表名 -- 求和 select avg(field1) as avgvalue from 表名 -- 平均 select max(field1) as maxvalue from 表名 -- 最大 select min(field1) as minvalue from 表名 -- 最小16.存儲引擎
# 查看所有的存儲引擎 show engines; # 查看不同存儲引擎存儲表結構文件特點 create table t1(id int)engine=innodb; -- MySQL默認的存儲引擎,支持事務,支持行鎖,支持外鍵。有且只有一個主鍵,用來組織數據的依據 create table t2(id int)engine=myisam; -- 不支持事務,不支持外鍵,支持全文索引,處理速度快。 create table t3(id int)engine=blackhole; -- 黑洞,寫入它的任何內容都會消失 create table t4(id int)engine=memory;-- 將表中的數據存儲在內存中。表結構以文件存儲於磁盤。 insert into t1 values(1); insert into t2 values(1); insert into t3 values(1); insert into t4 values(1);17.設置嚴格模式
# 查詢 show variables like '%mode%'; # 設置 set session -- 設置當前窗口下有效 set global -- 全局有效,終身受用 set global sql_mode = "STRICT_TRANS_TABLES"; # 設置完成后需要退出客戶端,重新登錄客戶端即可,不需要重啟服務端 group by分組涉及到的模式: 設置sql_mode為only_full_group_by,意味着以后但凡分組,只能取到分組的依據, 不應該在去取組里面的單個元素的值,那樣的話分組就沒有意義了,因為不分組就是對單個元素信息的隨意獲取 """ set global sql_mode="strict_trans_tables,only_full_group_by"; # 重新鏈接客戶端18.like 的用法
A:% 包含零個或多個字符的任意字符串: 1、like'Mc%' 將搜索以字母 Mc 開頭的所有字符串(如 McBadden)。 2、like'%inger' 將搜索以字母 inger 結尾的所有字符串(如 Ringer、Stringer)。 3、like'%en%' 將搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。 B:_(下划線) 任何單個字符: like'_heryl' 將搜索以字母 heryl 結尾的所有六個字母的名稱(如 Cheryl、Sheryl)。 C:[ ] 指定范圍 ([a-f]) 或集合 ([abcdef]) 中的任何單個字符: 1,like'[CK]ars[eo]n' 將搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。 2、like'[M-Z]inger' 將搜索以字符串 inger 結尾、以從 M 到 Z 的任何單個字母開頭的所有名稱(如 Ringer)。 D:[^] 不屬於指定范圍 ([a-f]) 或集合 ([abcdef]) 的任何單個字符: like'M[^c]%' 將搜索以字母 M 開頭,並且第二個字母不是 c 的所有名稱(如MacFeather)。 E:* 它同於DOS命令中的通配符,代表多個字符: c*c代表cc,cBc,cbc,cabdfec等多個字符。 F:?同於DOS命令中的?通配符,代表單個字符 : b?b代表brb,bFb等 G:# 大致同上,不同的是代只能代表單個數字。k#k代表k1k,k8k,k0k 。 下面我們來舉例說明一下: 例1,查詢name字段中包含有“明”字的。 select * from table1 where name like '%明%' 例2,查詢name字段中以“李”字開頭。 select * from table1 where name like '李*' 例3,查詢name字段中含有數字的。 select * from table1 where name like '%[0-9]%' 例4,查詢name字段中含有小寫字母的。 select * from table1 where name like '%[a-z]%' 例5,查詢name字段中不含有數字的。 select * from table1 where name like '%[!0-9]%' 以上例子能列出什么值來顯而易見。但在這里,我們着重要說明的是通配符“*”與“%”的區別。 很多朋友會問,為什么我在以上查詢時有個別的表示所有字符的時候用"%"而不用“*”?先看看下面的例子能分別出現什么結果: select * from table1 where name like '*明*' select * from table1 where name like '%明%' 大家會看到,前一條語句列出來的是所有的記錄,而后一條記錄列出來的是name字段中含有“明”的記錄,所以說,當我們作字符型字段包含一個子串的查詢時最好采用“%”而不用“*”,用“*”的時候只在開頭或者只在結尾時,而不能兩端全由“*”代替任意字符的情況下。
高級查詢操作
1、外鍵表創建
一對多(Foreign Key) # foreign key(需要關聯的本字段) references 需要關聯對表的表(需要關聯對表的字段) 例如: 創建dep foreign key(dep_id) references dep(id) # 同步更新,同步刪除 on update cascade #同步更新 on delete cascade #同步刪除2、表復制
復制表 create table t1 select * from test; 只復制表結構 create table t1 select * from test where 1=2;3、單表查詢查詢
0.綜合使用
#----綜合使用 書寫順序 select distinct * from '表名' where '限制條件' group by '分組依據' having '過濾條件' order by limit '展示條數' 執行順序 from -- 查詢 where -- 限制條件 group by -- 分組 having -- 過濾條件 order by -- 排序 limit -- 展示條數 distinct -- 去重 select -- 查詢的結果 正則:select * from emp where name regexp '^j.*(n|y)$'; 集合查詢:max 、min 、avg 、sum 、count 、group_concat 。 拼接:concat、concat_ws、group_concat 內連接:inner join 左連接:left join 右連接:right join 全連接: 左連接 union 右連接1.where 查詢
# between 在...之間 select id,name from emp where id >= 3 and id <= 6; 相當於: select * from emp where id between 3 and 6; # or 或者 select * from emp where id >= 3 or id <= 6; # in,后面可以跟多個值 select * from 表名 where 字段名 in (條件1,條件2,條件三); # like (見上18) # char——length() 取字符長度 select * from 表名 where char_length(需要獲取長度的字段名) = 4; not 配合使用 注意:判斷空不能用 = ,只能用 is2.group by 分組
select 查詢字段1,查詢字段2,... from 表名 where 過濾條件 group by分組依據 # 分組后取出的是每個組的第一條數據3.聚合查詢 :以組為單位統計組內數據>>>聚合查詢(聚集到一起合成為一個結果)
# max 最大值 # 每個部門的最高工資 select post,max(salary) from emp group by post; # min 最小值 # 每個部門的最低工資 select post,min(salary) from emp group by post; # avg 平均值 # 每個部門的平均工資 select post,avg(salary) from emp group by post; # 每個部門的工資總和 # sum 求和 select post,sum(salary) from emp group by post; # count(需要計數字段) 計數 # 每個部門的人數 select post,count(id) from emp group by post; # group_concat(需要分組后的字段) # 不僅可以用來顯示除分組外字段還有拼接字符串的作用 select post,group_concat(name) from emp group by post; -- post:分組字段,name 需要分組后顯示的字段 拼接: concat(不分組時用)拼接字符串達到更好的顯示效果 as語法使用 舉例: select concat("NAME: ",name) as 姓名 from emp; concat_ws: 如果拼接的符號是統一的可以用 舉例: select concat_ws(':',name,age,sex) as info from emp; group_concat: 舉例: select post,group_concat(name,'DSB') from emp group by post; 補充:as語法 起別名 select name as 姓名,salary as 薪資 from emp;4.having 過濾查詢
# having的語法格式與where一致,只不過having是在分組之后進行的過濾,即where雖然不能用聚合函數,但是having可以! # 用法 select 查詢字段1,查詢字段2,... from 表名 where 過濾條件1 group by分組依據 having avg(過濾條件2) > 10000;5.distinct 去重
# 對有重復的展示數據進行去重操作 select distinct 需取重字段 from 表名;6.order by 排序
select * from emp order by salary asc; #默認升序排 select * from emp order by salary desc; #降序排 # 多條件排序 #先按照age降序排,在年輕相同的情況下再按照薪資升序排 select * from emp order by age desc,salary asc;7.limit 限制展示條數
# 限制展示條數 select * from emp limit 3; # 查詢工資最高的人的詳細信息 select * from emp order by salary desc limit 1; # 分頁顯示 select * from emp limit 0,5; # 第一個參數表示起始位置,第二個參數表示的是條數,不是索引位置 select * from emp limit 5,5;8.正則
select * from emp where name regexp '^j.*(n|y)$';9.replace 替換
replace(str1,old,new) -- str1:需要替換的字段名 update gd_km set mc=replace(mc,'土地','房子') 說明:new替換str1中出現的所有old,返回新的字符串,如果有某個參數為NULL,此函數返回NULL 該函數可以多次替換,只要str1中還有old存在,最后都被替換成new 若new為空,則刪除old四、多表查詢
1.內連接、左連接、右連接、全連接
1、內連接:只取兩張表有對應關系的記錄(只拼兩個表共有的) 左表 inner join 右表 on 條件 select * from emp inner join dep on emp.dep_id = dep.id where dep.name = "技術"; 2、左連接:在內連接的基礎上,保留左邊的數據,右邊沒有就為空 左表 inner left 右表 on 條件 3、右連接:在內連接的基礎上,保留右邊的數據,左邊沒有就為空 左表 inner right 右表 on 條件 4、全連接:左右連接都有,用union連接 左表 inner left 右表 on 條件 union 左表 inner right 右表 on 條件 select * from emp left join dep on emp.dep_id = dep.id union select * from emp right join dep on emp.dep_id = dep.id;2.子查詢
# 就是將一個查詢語句的結果用括號括起來當作另外一個查詢語句的條件去用select name from where id in(select dep_id from emp where age>25);
