數據庫函數 select 查詢語句的分類 語法結構 多表連接,DISTINCT關鍵字 表 列 的別名和mysql 常用的 字符串 數值 日期 條件判斷 CASE 空值 聚合 關鍵字 列的別名函數和select 內容 from表order by 子句 LIMIT 子句


數據庫函數 select 查詢語句

SQL語句

* DDL create,drop, alter

* DML insert,delete,update,select

* DCL grant,revoke

* TCL commit; rollback;

 

DDL修飾符:

* unsigned  非負數

* zerofill  0填充

* default 默認值

* null    空值

 

約束:

* primary key 主鍵,非空 + 唯一

* unique      唯一鍵, 不能有重值

* not null    非空

 

* auto_increment 自增長 int,必須是primary key主鍵

 

1.SELECT 查詢語句 的分類  語法結構 多表連接 案例

簡單查詢語句從一個表中查詢數據

 

復雜查詢語句多表連接查詢 (將來源於多個表的列橫向疊加)

*內連接 *左連接  *右連接   *全連接   * 自連接    *非等值連接

 

復合查詢(將查詢結果集上下疊加)

*Union*Union All  *Intersect  *Minus

並集 交集差集

 

子查詢

* 非關聯子查詢 *關聯子查詢

 

語法結構

SELECT select_list                  # 1個或多個列名,之間用逗號隔開,列也稱作投影

[ INTO new_table ]                        # 結果集放入指定文件

FROM [table_source]                       #表名

[ WHERE search_condition ]              #表行過濾條件

[ GROUP BY group_by_expression ]  #按照指定的列將表行分組,形成新的行

[ HAVING search_condition ]            #對分組后的新行進行過濾    

[ ORDER BY order_expression [ ASC | DESC ] ]  #按照指定的1個或多個列進行排序,ASC=增序,DESC=降序

 

select  where子句 常用 的算數 邏輯 比較運算符  通配 運算符 和優先級

where子句對行記錄進行過濾

1.算數運算符:

+,-,*, / 對應 加,減,乘,除

 

2.邏輯運算符:

not (非);and (而且);or(或者);

 

3.比較運算符:

= 等於;   !=或<>不等於;  >大於;  <小於;  >=大於等於;   <=小於等於;

is null為空值;    is not null為非空值;

in (值列表) 在值列表中not in (值列表)不在值列表中;

between 低值 and 高值 (包含低值和高值)在低值和高值之間;

not between 低值 and 高值 (包含低值和高值)不在低值和高值范圍內;

like ‘通配符’按照通配符進行匹配;

 

4.常用通配符:

% 匹配0個或任意多個字符_ 匹配任意1個字符

 

5.運算符優先級

各類運算符之間存在優先級,只記住括號( )的優先級最高即可

 

1.查詢學生表中性別為‘女’,體重超過60公斤的學生的所有信息

 

三個表

 

 

 

 

 

 

 

 

 

查詢學生表中性別為‘女’,體重超過60公斤的學生的所有信息

select * from stu where sex='女' and weight>60;

 

 

 

 

 

2.查詢學生表中1班或者2班中,身高超過190的學生

select * from stu where (cno=1 or cno=2) and height>190;

或者  

select * from stu where cno in (1,2) and height>190;

 

 

 

 

3.查詢學生表中3班學生里面考分在400和520之間的女生

select * from stu where cno=3 and sex='女' and score between 400 and 520;

或者

select * from stu where cno=3 and sex='女' and (score>= 400 and score<=520);

 

 

 

 

4.查詢學生表中  沒有分配班級  而且是女生的學生

select * from stu where cno is null and sex='女';

 

 

 

 

 

5.在學生表體重低於40公斤且身高低於1.65米的學生,列出其姓名,身高,體重,總分以及總分占750分滿分的百分比

select sname,height,weight,score,score/750*100 from stu where height/100<1.65 and weight<40;

 

 

 

 

6.在學生表中查找學生姓名,第二個字是‘侯’, 或者 第一個字是‘張’且名字只有兩個字的學生

select * from stu where sname like '_%' or sname like '張_';

 

 

 

 

2mysql 常用的 字符串 數值 日期 條件判斷 CASE 空值 聚合 關鍵字 列的別名函數

函數用來處理SQL語句中的數據,可以嵌入在SQL語句中使用,增加了SQL語句對數據的處理功能

函數可以有0到多個參數,但是總會有一個返回值

函數可以用來計算、修改、格式化輸出二維表中的各類數據

不同數據庫的函數的名稱和用法略有不同,

但都會提供如:

字符串處理、數值處理、日期處理、統計等分類的函數、方便用戶處理各類數據

 

 

 

 

1.字符串函數  char_length(字符串) 的長度  三個字  姓名的學生

char_length(str)字符串長度

計算參數str中有多少個字符,str可以是具體的一個字符串,也可以是表中的列

 

1.查看字符串“中國人”有幾個字(后面為常量from可省略

select char_length('中國人');

 

 

 

 

 

2.學生表中姓名為 三個字 的學生有哪些?

select * from stu where char_length(sname)=3;

 

 

 

 

select * from stu where sname like '___';

 

 

 

 

有些需求僅靠SQL語句提供的功能無法實現,必須依靠數據庫提供的函數

2.concat(str1,str2,……)拼接  把參數str1和str2拼接成一個字符串 班級+姓名

把參數str1和str2拼接成一個字符串

1.把‘我是’和‘中國人’拼接成一句話

select concat('我是','中國人');

 

 

 

 

 

2.學生表打印已分班的學生姓名和班級,以xxx是x班 的形式打印結果

select concat(sname,'是',cno,'班') 名稱表from stu where cno is not null;

 

 

 

 

 

 

 

3.substr(str,pos,len)截取 把參數str字符串從第pos位起,截取len位

把參數str字符串從第pos位起,截取len位 字符串 姓氏

 

1.把‘我是中國人’字符串從第3位起截取3位字符

select substr('我是中國人',3,3);

 

 

 

 

 

二班的同學 都有什么姓氏? (截取第一個字段)  二班同學的姓氏

select substr(sname,1,1) from stu where cno=2;

 

 

 

 

4.)MySQL 數值 四舍五入 函數round(num,n),數字 和 身高體重bmi值

 

四舍五入不要小數缺省為正數  0

對數字num進行四舍五入運算,從第n位小數算起(保留幾位)

 

1.)15.5469,保留2位小數,從第2位小數進行四舍五入運算

select round(15.5469,2);

 

 

 

 

 

 

 

 

2.)計算肥胖學生 許褚 的BMI值,四舍五入保留2位小數,體重/身高^2

 

select round(weight/(height/100*height/100),2) from stu where sname='許褚';

 

 

 

 

5.)MySQL 日期 函數year(date1)  month(date1)

year(date1)

獲取日期date1的年份

select year(2019-11-27 09:00:00);

 

month(date1)

獲取日期date1的月份

 

1.學生表中哪些同學是1990年出生的?

select * from stu where year(birth)=1990;

 

 

 

 

 

2.學生表中哪些同學是8月出生的?

select * from stu where month(birth)=8;

 

 

 

 

 

6.)計算  時間curdate datediff(date1,date2)  計算年齡 生日 小於23歲

curdate()獲取當前日期

curtime()獲取當前時間

now()獲取當前的日期和時間

datediff(date1,date2)返回date1和date2兩個日期間  隔的天數

 

1.計算2018年6月1日和2018年元旦之間間隔的天數

select datediff('2018-6-1','2018-1-1');

 

 

 

 

select datediff('2019-11-29','2015-10-20');   和靜差1501天

 

 

 

 

 

2計算學生表中學生的年齡,顯示姓名,生日,年齡(保留2位小數),只顯示小於23歲的同學

select sname,birth,round(datediff(now(),birth)/365,2) from stu where round(datediff(now(),birth)/365,2)<23;

 

 

 

 

7.MySQL  條件判斷函數 if(expr,v1,v2)  分數  姓名復姓

if(expr,v1,v2)如果表達式expr成立,返回v1值  否則,返回v2值

 

1..如果學生高考分大於等於520,其為統招生,否則其為委培生,從學生表中查找,顯示姓名,考分,類型(統招或委培

 

select sname,score,if(score>=520,'統招','委培') 類型 from stu;

 

 

 

 

 

 

 

 

 

2.新來的學生都姓什么,需要考慮復姓(諸葛、太史、夏侯)和外號(大喬、小喬)?

select sname,substr(sname,if(sname in ('大喬','小喬'),2,1),if(substr(sname,1,2) in ('諸葛','太史','夏侯'),2,1)) 姓 from stu;

先從外號中篩選出大喬小喬,選出喬姓,然后截取兩位名字,如果是諸葛,夏侯,太史截取兩位,其他的就截取一位。

 

 

 

 

8.)MySQL CASE運算符 多重條件判斷 考分是700優秀 600良好

CASE運算符為SQL語句增加了多重條件判斷比if函數更加靈活

case when expr1 then v1 [when expr2  v2 then] …… else vn end

 

1.如果考分700以上,優秀,600以上,良好,520以上,中等,否則,較差,按照這個原則列出學生表中的學生,顯示姓名,考分,和評判等級

select sname,score,(case when score>=700 then '優秀' when score>=600 then '良好' when score>=520 then '中等' else '較差' end) 等級 from stu;

 

 

 

 

9.)MySQL 空值處理函數 ifnull  isnull 顯示未分班的同學

空值問題:

使用in時,值列表中有null值,不會返回null相關結果

select * from stu where cno in (2,null);

 

 

 

 

 

 

 

 

使用not in列表中有空值時,無查詢結果返回

select * from stu where cno not in (2,null);  

 

 

 

 

有時空值會造成意想不到的問題,需要用空值函數先對空值進行處理

常用空值處理函數

ifnull(v1,v2) 如果v1為空返回v2,否則返回v1

isnull(expr) 如果表達式為null空值,返回1,表達式非空則返回0

 

1.僅顯示2班和沒有分班的同學

select * from stu where cno=2 or cno is null;

 

 

 

 

select * from stu where cno=2 or ifnull(cno,0)=0;

 

 

 

 

select * from stu where ifnull(cno,0) in (2,0);

 

 

 

 

select * from stu where isnull(cno)=1 or cno=2;

 

 

 

 

10.)MySQL 聚合函數 max最大 min最小 sun求和 avg平均 coun行的數量t

聚合函數

max(列名)

統計出列中所有中的最大值,列的數據類型可以是數值、字符、日期型

min(列名)

統計出列中所有中的最小值,列的數據類型可以是數值、字符、日期型

sum(列名)

統計出列中所有行中數值總和列的數據類型不能是字符型

avg(列名)

統計出列中所有行中數值的平均值,列的數據類型不能是字符型

count(列名)

統計出列中所有行的數量列中的如果有空值不會被統計計數

 

 

1.找出學生中最高的身高、最輕的體重、平均高考分數、學生的總數

select max(height),min(weight),sum(score)/count(*),avg(score),count(*),count(sno),count(cno) from stu;

 

 

 

 

 

 

注意:列中有空值時不會被count函數統計計數  只有一行數據結果

 

2.用一個查詢語句找出學生中  最低的身高、再顯示所有人的姓名

select min(height),sname from stu;

 

 

 

 

查詢語句報錯了:min(height)只有1個值1行,sname有20行,1行對接20行是個矛盾的事情,因此不能這么寫

select min(height),group_concat(sname) from stu;

 

 

 

 

注意:group_concat也屬於一種聚合函數,此列中把20個人的名字(20行),用逗號分隔連成一個字符串(1行),這樣就不會報錯了。

3.)SELECT語句  DISTINCT關鍵字  表 列 的別名

1.)ditinct查詢出指定的1個或多個字段的不重復記錄  班級號 性別

1.查詢出學生表中都有哪些班號,要求去除重復班號

select distinct cno from stu;

 

 

 

 

 

2.列出學生表中 不重復的 班號和性別

select distinct cno,sex from stu;

 

 

 

 

注意:distinct關鍵字必須放在第一列,后續的1個或多個列作為去重列

 

select distinct sname,cno,sex,weight from stu;

 

 

 

 

2.)MySQL 列 表 的別名  表頭用對應的中文顯示 姓名 生日

列別名:給列起個額外的名稱用來替代列原來的名稱

select sname [as] 姓名 from stu;“as”可寫可不寫

 

表頭用對應的中文顯示

1.列出2班的學生姓名,性別,生日。

select sname as 學生姓名,sex 性別,birth 生日 from stu where cno=2;

如果別名中有空格,或者別名是SQL保留字(如:select,from,where)別名要用雙引號“”括起來,否則報錯

 

 

 

 

 

表的別名

表別名:給表起個額外的名稱用來替代表原來的名稱

select s.sname,s.sex from stu as s;“as”可寫可不寫

 

 

 

 

 

1.列出2班的學生姓名,性別,生日,查詢語句使用表別名來引用列名

select s.sname,sex,s.birth from stu s where s.cno=2;重點是from后面的內容。

 

 

 

 

注意:多表連接查詢往往經常使用表別名來區分不同表 確名字相同的列;

如果表名很長使用表別名會使查詢語句看起來比較簡潔;

在數據庫圖形管理工具中書寫查詢語句時使用表別名,鍵入“表別名.列名”時,會出現下拉列表選擇框,將大大提高工作效率r

4.select 內容 from表order  by  子句

對查詢結果集按照order by后面指定的1列或多列排序

 

分為增序和降序

增序a's'c,默認可以不寫

降序 de's'c

 

對於數值,增序是從小到大,降序是從大到小

對於日期和時間,增序是從遠到近,降序是從近到遠

對於英文字符,增序是從a到z,降序是從z到a

對於中文字符,增序按照字符集編碼從小到大,降序按照字符集編碼從大到小,如果選擇gbk編碼可以按照拼音來排序

 

對於排序列的名稱,可以用以下方式

列名、列別名、列的序號、函數、表達式等

 

1.按照體重增序列出學生信息

select * from stu order by weight;

 

 

 

 

2.展示已分班學生信息,先按照班號增序,再按照考分降序排列

select * from stu where cno is not null order by cno,score desc;

 

 

 

 

3.按照拼音降序排列所有學生

注意:

由於漢字在utf8編碼中不是按照拼音順序排列的,需要用到convert函數轉換列sname的編碼到GBK(國標庫);如果表列為gbk編碼不需要

 

select * from stu order by convert(sname using gbk) desc;

 

 

 

 

 

4.顯示學生性別,姓名,生日3列信息,先按第1列,再按第3列降序排序

select sex,sname,birth from stu order by 1,3 desc;

 

 

 

 

 

5.按照班號增序排序,沒有分班的同學排在后面

select * from stu order by isnull(cno),cno;

 

 

 

 

所有的不是空值的返回零排在了前面,后面空值返回一排在了后面

 

6按照《關張趙馬黃》的順序排序2班同學

select * from stu where cno=2 order by (case when substr(sname,1,1)='關' then 1 when substr(sname,1,1)='張' then 2 when substr(sname,1,1)='趙' then 3 when substr(sname,1,1)='馬' then 4 when substr(sname,1,1)='黃' then 5 else 6 end);

 

 

 

 

5.SELECT - LIMIT 子句

SELECT語句中的LIMIT子句最后執行

其作用是僅顯示查詢結果集中的部分內容

1.顯示stu表中考分最高的3名學生

select * from stu order by score desc limit 3;

 

 

 

 

select * from stu order by score desc limit 0,3;  

 

 

 

 

#limit 0,3中的0為第1條記錄,如:limit 5,3意思為從結果集的第6條起,顯示3條記錄。簡單理解:第一個參數代表起始行(參數值+1)第二個參數代表行的跨度數

 

比如1,3就不一樣了,1,3代表從第2位開始截取3位,0代表第一位。

 

 

 

 

6.面試題alter 和 delete有什么區別?alter 和 update有什么區別?

alter 和 delete有什么區別?

*alter屬於DDL語句

*alter改變表的結構

 

* delete屬於DML語句

* delete不會改變表的結構

* delete刪除行

 

alter 和 update有什么區別?

*alter屬於DDL語句

*alter改變表的結構

 

* update屬於DML語句

* update修改現存行的信息

* update不會改變表的結構

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM