MySQL——高阶语句(上)
生活随笔
收集整理的這篇文章主要介紹了
MySQL——高阶语句(上)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MySQL高階語句(上)
- 一、MySQL高級語句
- 1、ORDER BY----按關鍵字排序
- 單字段排序
- 多字段排序
- 2、OR/AND----或/且
- 3、DISTINCT----查詢不重復記錄
- 4、GROUP BY----對結果進行分組
- 5、LIMIT----限制結果條目
- 6、設置別名
- 7、AS連接語句
- 8、通配符
- 9、子查詢
- 子查詢----別名as
- 子查詢----EXISTS
- 二、視圖
- 1、創建視圖
- 三、NULL值
- 1、null值和空值的區別
實驗準備創建一張表
如下: 數據庫有一張test表,記錄了學生的id,姓名,分數,地址和愛好 create table test (id int(10) primary key not null auto_increment,name varchar (20) not null,score decimal (5,2),address char (40),hobby varchar (10)); insert into test values(1,'liuyi',80,'beijing','2'); insert into test values(2,'wangwu',90,'shenzheng','2'); insert into test values (3,'lisi',60,'shanghai','4'); insert into test values(4,'tinqi',99,'nanjing','5'); insert into test values (5,'jiaoshou',100,'laowo','3'); insert into test values (6,'xiaoming',10,'zhenjiang','3'); select * from test;
一、MySQL高級語句
1、ORDER BY----按關鍵字排序
使用SELECT 語句可以將需要的數據從Mysql 數據庫中查詢出來,如果對查詢的結果進行排序,可以使用 ORDER BY 語句來完成排序,并最終將排序后的結果返回給用戶。這個語句的排序不光可以針對某一個字段,也可以會對多個字段#語法: SELECT column1,column2,... FROM table_name ORDER BY column1,column2,... ASC (DESC;ASC |DESC: ASC是按照升序進行排序的,是默認的排序方式,即 ASC可以省略。SELECT語句中如果沒有指定具體的排序方式,則默認按AsC方式進行排序。 DESC是按降序方式進行排列。當然ORDER BY前面也可以使用WHERE子句對查詢結果進一步過濾。單字段排序
按分數排序,默認不指定則為升序排序asc
select name,score from test order by score [asc];按降序排序使用DESC
select name, score from test order by score desc;多字段排序
原則: order by 之后的參數,使用“,”分割,優先級是按先后順序而定,例如: select id,name,hobby from test order by hobby desc,id asc;小結:order by 之后的第一個參數只有在出現相同數值,第二個字段才有意義2、OR/AND----或/且
select * from test where score >70 and score <=90; select * from test where score >70 or score <=90; #嵌套/多條件 select * from test where score >70 or (score >75 and score <90) ;
3、DISTINCT----查詢不重復記錄
select distinct 字段 from 表名; select distinct hobby from test;PS:以下語句是否可以篩重 select name,hobby from test where hobby in (select distinct hobby from test); 1.distinct必須放在最開頭 2.distinct只能使用需要去重的字段進行操作。 ----也就是說我distinct了name,hobby兩個字段,我后面想根據id進行排序,是不可以的,因為只能name,age兩個字段進行操作. 3.distinct去重多個字段時,含義是:幾個字段同時重復時才會被過濾。4、GROUP BY----對結果進行分組
通過 SQL查詢出來的結果,還可以對其進行分組,使用GROUP BY 語句來實現,GROUP BY通常都是結合聚合函數一起使用的,常用的聚合函數包括:計數(COUNT)、求和(SUM)、求平均數(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分組的時候可以按一個或多個字段對結果進行分組處理語法: select hobby,count(id) as sum from test where hobby<=5 group by hobby;selet字段,聚合函數 from 表名,(where 字段名(匹配)數值) group by 字段名;5、LIMIT----限制結果條目
在使用MySQL SELECT 語句進行查詢時,結果集返回的是所有匹配的記錄。有時候僅需要返回第一行或者前幾行,這時候就需要用到LIMIT子句 語法 SELECT column1,column2,... FROM table_name LIMIT[offset, ] numberoffset, number LIMIT的第一個參數是位置偏移量(可選參數),是設置MySO從哪一行開始顯示。 如果不設定第一個參數,將會從表中的第一條記錄開始顯示。需要注意的是,第一條記錄的位置偏移量是0,第二條是1,以此類推。第二個參數是設置返回記錄行的最大數目。 offset:索引下標 number:索引下標之后的幾位 結合order by排序: select * from test order by id desc limit 3,3;6、設置別名
在Mysql查詢時,當表的名字比較長或者表內某些字段比較長時,為了方便書寫或者多次使用相同的表,可以給字段列或表設置別名。使用的時候直接使用別名,簡潔明了,增強可讀性語法: 列的別名 select 字段 as 字段別名 表名 對于表的別名: select 字段 from 表名 as 別名 PS: AS可以省略列別名設置示例: select name as 姓名,hobby as 愛好 from test; 表數據別名設置示例: select i.name as 姓名,i.score as 成績 from test as i;使用場景: 1、對復雜的表進行查詢的時候,別名可以縮短查詢語句 2、多表相連查詢的時候(通俗易懂、減短sql語句)7、AS連接語句
As作為連接語句 create table tmp as select * from test; #此處As起到的作用: 1、創建一個新表tmp定義表結構,插入表數據(與info表相同) 2、但是"約束"沒有被"復制"過術,但定如木外衣人l相似: 克隆、復制表結構8、通配符
通配符主要用于替換字符串中的部分字符,通過部分字符的匹配將相關結果查詢出來通常通配符都是跟LIKE(模糊查詢)一起使用的,并協同WHERE子句共同來完成查詢任務。常用的通配符有兩個,分別是: %:百分號表示零個、一個或多個字符 _:下劃線表示單個字符查詢名字是l開頭的記錄模糊查詢'%,示例: select * from test where name like 'l%'; 模糊查詢、’示例: select * from test where name like 'l_s_'; 結合使用示例: select * from test where name like 'l_%_';9、子查詢
定義、示例 #子查詢也被稱作內查詢或者嵌套查詢,是指在一個查詢語句里面還嵌套著另一個查詢語句 #子查詢語句是先于主查詢語句被執行的,其結果作為外層的條件返回給主查詢進行下一步的查詢過濾。 PS:子語句可以與主語句所查詢的表相同,也可以是不同表相同表: 示例: select name,score from test where id in (select id from test where score>80);以上: 主語句: select name,score from test where id 子語句(結果集): select id from test where score>80 in:將主表和子表關聯/連接起來的語法in 之后的子查詢語句會給他提供的一個范圍(集合),作為'in'之前where 的判斷條件#示例: 需求:查詢test表id為1,3,5的數據(通過子查詢的方式) #單表查詢方式:不同表: select * from test where id in (1,3,5)#子查詢方式 create table num (id int (4)); insert into num values (1),(3),(5); select * from test where id in (select id from num) ; #子查詢不僅可以在SELECT語句中使用,在INERT、UPDATE、DELETE中也同樣適用。 #支持多層嵌套。 #in語句是用來判斷某個值是否在給定的集合內(結果集),in 往往和select 搭配使用 #可以使用not in表示對結果集取反
子查詢----別名as
#先查詢test表id,name字段 select id,name from test; 以上命令可查看到test表的內容(結果集)#將結果集作為一張"表"進行查詢的時候,我們也需要用到別名,示例: mysql>select id from (select id,name from test); #此時會報錯 ERROR 1248 (42000): Every derived table must have its own alias #原因: select * from 表名,此為標準格式,而以上的查詢語句,"表名"的位置其實是一個結果集,mysql并不能識別, 而此時給與結果集設置一個別名,并且以"select a.id,name from a;的方式查詢, 將此結果集"視為"一張表,就可以正常查詢出數據了#所以: select a.id from (select id,name from test) a; 相當于: select test.id,name from test; select 表.字段,字段 from 表;子查詢----EXISTS
select count(*) as number from tmp where exists (select id from test where name='zhangsan') PS: as number將count統計的結果作為number(列名)返回exists :布爾值判斷,后面的內查詢語句(返回的結果集)是否成立where:之后跟條件判斷加exists:只是為了判斷exists之后的條件是否成立,如果成立,則正常執行主語句的匹配,如不成立,則不會執行主語句查詢PS: count為計數,sum為求和,使用sum求和結合exists,如子查詢結果集不成立的話,輸出為null
二、視圖
數據庫中的虛擬表,這張虛擬表中不包含真實數據,只是做了映射鏡花水月/倒影,動態保存結果集(數據)
視圖我們可以定義展示的條件
示例:
需求:滿足80分的學生展示在視圖中
PS:這個結果會動態變化,同時可以給與不同的人群(例如權限范圍)展示不同的視圖
1、創建視圖
create view v_score as select * from info where score>=80; show table status\G查看視圖
select * from v_score;修改原表數據
update test set score='60' where name='wangwu';查看視圖
select * from v_score;
三、NULL值
在SQL語句使用過程中,經常會碰到NULL這幾個字符。通常使用NULL來表示缺失的值,也就是在表中該字段是沒有值的。如果在創建表時,限制某些字段不為空,則可以使用NOT NULL關鍵字,不使用則默認可以為空。在向表內插入記錄或者更新記錄時,如果該字段沒有 NOT NULL并且沒有值,這時候新記錄的該字段將被保存為NULL。 需要注意的是,NOLL值與數字О或者空白(spaces)的字段是不同的,值為NULL的字段是沒有值的。在SQL 語句中,使用IS NULL可以判斷表內的某個字段是不是NULL值,相反的用IS NoT NULL可以判斷不是NULL值。 查詢test表結構,id和name字段是不允許空值的1、null值和空值的區別
空值長度為0,不占空間, NULL值的長度為null,占用空間 is null無法判斷空值 空值使用"-"或者"<>"來處理( != ) count()計算時,NULL.會忽略,空值會加入計算 驗證: alter table test add column addr varchar(50);統計數量:檢測null是否會被加入統計中 select count(addr) from test;將test表中其中一條數據修改為空值'' update test set addr='' where name='wangwu';統計數量:檢測空值是否會被添加到統計中 select count(addr) from test;查詢null值 select * from test where addr is null;查詢不為空的值 select * from test where addr is not null;
總結
以上是生活随笔為你收集整理的MySQL——高阶语句(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL-日志、完全备份恢复和增量备份
- 下一篇: 告别卡顿!华硕tuf十铨16G内存,让你