2018-08-08(數(shù)據(jù)查詢)

數(shù)據(jù)查詢

  1. 查詢表中的若干列
    SELECT Sno,Sname
    FROM Student;
    #查詢所有列
    SELECT *
    FROM Student;

  2. select 字句

    1. 算術(shù)表達式
      SELECT Sname,2018-Sage /假定當(dāng)年的年份為2018年/
      FROM Student;
    2. 字符串常量
      SELECT Sname,‘我是測試列: ',2004-Sage,LOWER(Sdept)
      FROM Student;
    3. 函數(shù)
    4. 列別名
  3. 消除取值重復(fù)的行
    select DISTINCT(sno) as '學(xué)號' from sc
    ??:查看有哪些學(xué)生參加了考試
    select DISTINCT(sno) from sc;

  4. where字句

    1. 比較運算符:

      =,>,<,>=,<=,!=,<>,!>,!<

    2. 范圍運算符:

      BETWEEN AND,NOT BETWEEN AND

    3. 確定集合:

      IN,NOT IN

    4. 字符匹配:

      like not like

    5. 空值

      is null , is not null

    6. 邏輯

      not and or

    ??:

    1. 查詢計算機科學(xué)系全體學(xué)生的名單
      select * from student where sdept like "計算機科學(xué)%";
    2. 查詢所有年齡在20歲以下的學(xué)生姓名及其年齡
      select sname,sage from student where sage <20;
    3. 查詢年齡在20~23歲之間的學(xué)生的 姓名、系別和年齡(between ..and..)
      select sname,sdept,sage from student where sage BETWEEN 20 and 23;
    4. 查詢信息系(IS)、數(shù)學(xué)系(MA)和計算機科學(xué)系(CS)學(xué)生的姓名和性別。
      SELECT sname,ssex from student where sdept in ("信息系", "數(shù)學(xué)系", "計算機科學(xué)與技術(shù)系");
  1. like
    匹配串為含通配符的字符串:% _
    ??:查詢姓"李"且全名為三個漢字的學(xué)生的姓名
    SELECT sname from student where sname like "李__";

  2. is null is not null
    ??:
    某些學(xué)生選修課程后沒有參加考試,所以有選課記錄,但沒有考試成績。查詢?nèi)鄙俪煽兊膶W(xué)生的學(xué)號和相應(yīng)的課程號。
    SELECT sno,cno from sc where grade is NULL;

  3. not and or
    ??:
    查詢計算機系年齡在20歲以下的學(xué)生姓名。
    SELECT sname from student where sage < 20 and sdept like "計算機%";

  4. 排序
    可以按一個或多個屬性列排序
    升序:ASC;降序:DESC;缺省值為升序
    ??:
    查詢?nèi)w學(xué)生情況,查詢結(jié)果按所在系的系號升序排列,同一系中的學(xué)生按年齡降序排列。
    SELECT * from student ORDER BY sage desc;

    查看全體同學(xué)的數(shù)學(xué)成績,并按降序排列
    SELECT grade from sc where cno = (select cno from course where cname like "數(shù)學(xué)%") ORDER BY grade desc;

  1. 聚合函數(shù)
    count() sum() avg() max() min()
    ??:
    統(tǒng)計有多少學(xué)生參加考試
    select count(DISTINCT(sno)) from sc where grade is not NULL;

    3號課程的總成績和平均分
    select sum(grade), avg(grade) from sc where cno = 3;

    002學(xué)生的總分
    select sum(grade) from sc where sno = "002";

    找出最低分

    select sum(grade) as '總分' from sc where sno=002;
    
    select min(grade),sno,cno from sc;
    
  2. 分組
    HAVING短語與WHERE子句的區(qū)別:

    1. WHERE從中選擇滿足條件的元組

    2. HAVING短語作用于組,從中選擇滿足條件的組
      ??:
      查看每個人的總分和平均分
      select sno,sum(grade), avg(grade) from sc where grade is not null GROUP BY sno;

      select sum(grade),sno from sc GROUP BY sno;

      select avg(grade),sno from sc GROUP BY sno;

    查看平均分最高的信息

     select avg(grade),sno from sc GROUP BY sno ORDER BY avg(grade) desc;
    

    查看平均分不及格信息 where 首次篩選 having 分組后篩選

     select avg(grade),sno from sc GROUP BY sno having avg(grade)<60;
    

    查看平均分大于70,并從高到低排列
    select avg(grade),cno from sc GROUP BY cno having avg(grade)>70 ORDER BY avg(grade) asc;

    找出參加三門考試的同學(xué)

     select count(sno),sno from sc GROUP BY sno HAVING count(*)>=3;
    

    統(tǒng)計每門課程的選修人數(shù)

     SELECT COUNT(sno) as '考試人數(shù)', cno as '課程編號' FROM sc GROUP BY cno 
    

    統(tǒng)計選修人數(shù)少于2人的課程標(biāo)號

     SELECT COUNT(sno) as '考試人數(shù)', cno as '課程編號' FROM sc GROUP BY cno HAVING COUNT(sno)<2
    
  3. limit


    數(shù)據(jù)庫截取.png

    limit start,total;
    start:開始記錄

    total:總共取多少行記錄
    ??: 
    總分前3名的學(xué)生
    select sum(grade), sno from sc where grade is not null GROUP BY sno ORDER BY sum(grade) desc LIMIT 0,3;
    
    select sum(grade), sno from sc where grade is not null GROUP BY sno ORDER BY sum(grade) desc LIMIT 0,3;
    
    select sum(grade),sno from sc GROUP BY sno ORDER BY sum(grade) desc limit 0,3;
    

    總分倒數(shù)第一的學(xué)生
    select sum(grade),sno from sc GROUP BY sno ORDER BY sum(grade) asc limit 0,1;

內(nèi)置函數(shù)

  1. 數(shù)學(xué)函數(shù)

    1. abs(x)
    2. pi()
    3. mod(x,y)
    4. sqrt(x)
    5. ceil(x)或者ceiling(x)
    6. rand(),rand(N):返回0-1間的浮點數(shù),使用不同的seed N可以獲得不同的隨機數(shù)
    7. round(x, D):四舍五入保留D位小數(shù),D默認(rèn)為0, 可以為負(fù)數(shù), 如round(19, -1)返回20
    8. truncate(x, D):截斷至保留D位小數(shù),D可以為負(fù)數(shù), 如trancate(19,-1)返回10
    9. sign(x): 返回x的符號,正負(fù)零分別返回1, -1, 0
    10. pow(x,y)或者power(x,y)
    11. exp(x):e^x
  2. 字符串函數(shù)

    1. char_length(str):返回str所包含的字符數(shù),一個多字節(jié)字符算一個字符
      -- 計算字符串的長度
      select CHAR_LENGTH("大江東去浪淘盡");

    2. length(str): 返回字符串的字節(jié)長度,如utf8中,一個漢字3字節(jié),數(shù)字和字母算一個字節(jié)
      -- 在此方法中計算的時字節(jié)數(shù),一個中文字符有3個字節(jié)
      select LENGTH("大獎東去浪淘盡");

    3. concat(s1, s1, ...): 返回連接參數(shù)產(chǎn)生的字符串
      -- 連接字符串
      select CONCAT(sname,sage) from student;

    4. concat_ws(x, s1, s2, ...): 使用連接符x連接其他參數(shù)產(chǎn)生的字符串
      -- 用制定字符連接字符串,注意指定字符要用引號引起來
      SELECT CONCAT_WS("~",sname,sage) from student;

    5. INSERT(str,pos,len,newstr):返回str,其起始于pos,長度為len的子串被newstr取代。
      -- 將sname 從第一個字符開始的兩個字符替換為ha(起始值為1) 類似于python中的replace()
      select insert(sname,1,2,"ha") from student;

    6. 若pos不在str范圍內(nèi),則返回原字符串str

    7. 若str中從pos開始的子串不足len,則將從pos開始的剩余字符用newstr取代

    8. 計算pos時從1開始,若pos=3,則從第3個字符開始替換

    9. lower(str)或者lcase(str):

    10. upper(str)或者ucase(str):

    11. left(s,n):返回字符串s最左邊n個字符

    12. right(s,n): 返回字符串最右邊n個字符

    13. ltrim(s):刪除s左側(cè)空格字符

    14. rtrim(s):刪除字符串前后的空白字符

    15. TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str)或TRIM([remstr FROM] str):從str中刪除remstr, remstr默認(rèn)為空白字符

    16. REPEAT(str,count):返回str重復(fù)count次得到的新字符串

    17. REPLACE(str,from_str,to_str): 將str中的from_str全部替換成to_str

    18. SPACE(N):返回長度為N的空白字符串

    19. STRCMP(str1,str2):若str1和str2相同,返回0, 若str1小于str2, 返回-1, 否則返回1.
      . SUBSTRING(str,pos), SUBSTRING(str FROM pos), 1. SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len),MID(str,pos,len): 獲取特定位置,特定長度的子字符串

  3. 日期函數(shù)

    1. CURDATE(), CURRENT_DATE, CURRENT_DATE():用于獲取當(dāng)前日期,格式為'YYYY-MM-DD'
      -- 獲取當(dāng)前年月日
      select CURDATE();
      -- 獲取當(dāng)前年月日
      select current_date();

    2. CURTIME([fsp]), CURRENT_TIME, CURRENT_TIME([fsp]): 用于獲取當(dāng)前時間, 格式為'HH:MM:SS'
      -- 獲取當(dāng)前的時間時分秒 current_time, current_time()
      select CURTIME();

    3. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP([fsp]), LOCALTIME, LOCALTIME([fsp]), SYSDATE([fsp]), NOW([fsp]): 用于獲取當(dāng)前的時間日期,格式為'YYYY-MM-DD HH:MM:SS'
      -- 獲取當(dāng)前日期,年月日,時分秒都有 current_timestamp(),localtime()
      select current_timestamp;

    4. UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date):返回一個unix時間戳('1970-01-01 00:00:00' UTC至今或者date的秒數(shù)),這實際上是從字符串到整數(shù)的一個轉(zhuǎn)化過程

    5. FROM_UNIXTIME(UNIX_TIMESTAMP('2010-3-3'))從時間戳返回日期
      -- 返回當(dāng)前時間戳
      SELECT UNIX_TIMESTAMP();

    6. 提取時間
      MONTH(date)
      MONTHNAME(date)
      DAYNAME(date)
      DAY(date),DAYOFMONTH(date):1-31或者0
      DAYOFWEEK(date):1-7==>星期天-星期六
      DAYOFYEAR(date): 1-365(366)
      WEEK(date[,mode]):判斷是一年的第幾周,如果1-1所在周在新的一年多于4天,則將其定為第一周;否則將其定為上一年的最后一周。mode是用來人為定義一周從星期幾開始。
      WEEKOFYEAR(date):類似week(date,3),從周一開始計算一周。
      QUARTER(date):返回1-4
      HOUR(time):返回時間中的小時數(shù),可以大于24
      MINUTE(time):
      SECOND(time):

  4. 系統(tǒng)信息函數(shù)

    1. VERSION():返回mysql服務(wù)器的版本,是utf8編碼的字符串
      -- 查看mysql版本
      select VERSION();
    2. DATABASE(),SCHEMA():顯示當(dāng)前使用的數(shù)據(jù)庫
      -- 顯示當(dāng)前使用的數(shù)據(jù)庫
      select database();
    3. SESSION_USER(), SYSTEM_USER(), USER(), CURRENT_USER, CURRENT_USER():返回當(dāng)前的用戶名@主機,utf8編碼字符串
    4. CHARSET('hello') 字符編碼
    5. COLLATION(str) 字符排序規(guī)則
    6. LAST_INSERT_ID():自動返回最后一個insert或者update查詢, 為auto_increment列設(shè)置的第一個發(fā)生的值
  5. 加密函數(shù)

    1. password()
    2. MD5(str):計算MD5 128位校驗和,返回32位16進制數(shù)構(gòu)成的字符串,當(dāng)str為NULL時返回NULL。可以用作哈希密碼
    3. SHA1(str), SHA(str):計算160位校驗和,返回40位16進制數(shù)構(gòu)成的字符串,當(dāng)str為NULL時返回NULL。
      -- 登陸
      -- 加密
      update student set password = SHA1(password);
      UPDATE student set password = SHA1("666666") where sno = "002";
      select * from student where sno = "002" and password = SHA1("666666");
  1. SHA2(str, hash_length):計算SHA-2系列的哈希方法(SHA-224, SHA-256, SHA-384, and SHA-512). 第一個參數(shù)為待校驗字符串,第二個參數(shù)為結(jié)果的位數(shù)(224, 256, 384, 512)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內(nèi)容