數據庫函數 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不會改變表的結構