本文主要介紹資料庫中MySQL的基礎知識,包括數據插入、數據更新、數據刪除、數據查詢、函數、CASE語句、表連接、子查詢。 一、數據插入(insert 語句) 首先我創建一個表,如下: 接著,進行數據插入: 結果(註意:沒有添加的信息預設為Null): insert 用法小總結: 1) 後面的欄位如 ...
本文主要介紹資料庫中MySQL的基礎知識,包括數據插入、數據更新、數據刪除、數據查詢、函數、CASE語句、表連接、子查詢。
一、數據插入(insert 語句)
首先我創建一個表,如下:
接著,進行數據插入:
insert into userInfo(id,name,sex,score)values(8,'司馬懿','男',14);
結果(註意:沒有添加的信息預設為Null):
insert 用法小總結:
1) 後面的欄位如果是字元串,一定要用單引號
2) 可以這樣寫
insert into userInfo(name)values('曹植');
//前提是別的欄位可以為null的情況下
3) 這裡的id,在創建表的時候,用的是自增id,實際上是可以不提供的(正常來說,就不該提供)。如果要手工提供,一定要大於當前數據中的最大ID。
4) 欄位列表可以省略
insert into userInfo values(9,'司空','男',3,'2017-07-24 14:16:02');
(略寫的要求是,不能有空缺項,例如,我下麵的寫法就不能通過)
insert into userInfo values(9,'司空','男',3);
二、數據更新(update 語句)
1.更新一個列
update userInfo set name='司馬光' ---後面沒有條件,表示全部更新
2.更新多個列
update userInfo set name='張春華',sex='女',score=20 where id=2
3.更新一部分數據
update userInfo set name='張春華2',sex='女',score=12 where id>7
小總結:Where中可以使用的其他邏輯運算符:or、and、not、<、>、>=、<=、!=(或<>)等。
【註意:最後一個逗號,不能加】
三、數據刪除(delete 語句)
刪除表中全部數據
delete from userInfo --不能寫成 delete * from userInfo
註意:delete只是刪除數據,表結構還在。這一點和 drop table 不一樣。
delete 也可以和 where 子句一起用
delete from userInfo where name='張春華' select * from userInfo
回憶: truncate table 快速刪除,主鍵重新開始
四、數據查詢(select 語句)
嗯,首先執行代碼,創建測試用的表和添加測試數據,如下:
CREATE TABLE F_Employee (FNumber VARCHAR(20),FName VARCHAR(20),FAge INT,FSalary NUMERIC(10,2),PRIMARY KEY (FNumber)); INSERT INTO F_Employee(FNumber,FName,FAge,FSalary) VALUES('DEV001','Java',25,8300); INSERT INTO F_Employee(FNumber,FName,FAge,FSalary) VALUES('DEV002','php',28,6300.80); INSERT INTO F_Employee(FNumber,FName,FAge,FSalary) VALUES('SALES001','C++',23,5000); INSERT INTO F_Employee(FNumber,FName,FAge,FSalary) VALUES('SALES002','C#',28,6200); INSERT INTO F_Employee(FNumber,FName,FAge,FSalary) VALUES('SALES003','.net',22,5200); select * from F_Employee
(一)簡單的數據檢索
1.簡單的數據檢索 :
SELECT * FROM F_Employee
2.只檢索需要的列 :
SELECT FNumber FROM F_Employee
SELECT FName,FAge FROM F_Employee
3.列別名:
SELECT FNumber AS 編號,FName AS userName,FAge AS Age111 FROM F_Employee
4.使用where檢索符合條件的數據:
SELECT FName FROM F_Employee WHERE FSalary>6000
5.可以檢索和表無關的數據,例如
select 9 ---輸出結果是9 select 9+90 ---輸出結果是99 select 9 as result-----輸出結果是以result為名,9為數據的一列表 select now() ---取當前日期 mysql函數
(二)聚合函數
SQL聚合函數:MAX(最大值)、MIN(最小值)、AVG (平均值)、SUM (和)、COUNT(數量)
大於25歲的員工的最高工資 :
select MAX(FSalary) FROM F_Employee WHERE FAge>23
最低工資和最高工資:
SELECT MIN(FSalary),MAX(FSalary) FROM F_Employee
利用count 查詢條數:
select count(*) from T_Employee --查詢條數 select count(1) from T_Employee --查詢的也是條數,如果不加查詢條件,和數據是不是null無關
(三)數據排序(order by 語句)
它位於SELECT語句的末尾,它允許指定按照一個列或者多個列進行排序,可以指定排序方式 。升ASC( 預設),降 DESC。
比如:按照年齡升序排序所有員工信息的列表:
select * from F_Employee order by FAge ---不寫即預設升序
比如,按照年齡從大到小排序(如果年齡相同則按照工資從大到小排序)
新添加兩行年齡與上面有重疊的數據,如下執行
INSERT INTO F_Employee(FNumber,FName,FAge,FSalary) VALUES('DEV003','Spring',28,8300); INSERT INTO F_Employee(FNumber,FName,FAge,FSalary) VALUES('SALES004','SQL',23,9000); select *from F_Employee SELECT * FROM F_Employee ORDER BY FAge DESC,FSalary DESC
註意:ORDER BY子句要放到WHERE子句之後。
select * From F_Employee where Fage>23 order by Fage DESC ,FSalary desc
(四)通配符過濾
1.like:單字元匹配的通配符為半形下劃線“_”,它匹配單個出現的字元。
例:以任意字元開頭,剩餘部分為“erry” :
SELECT * FROM T_Employee WHERE FName LIKE '_erry'
2.多字元匹配的通配符為半形百分號“%”,它匹配任意次數(零或多個)出現的任意字元。
例:“k%”匹配以“k”開頭、任意長度的字元串。
例: 檢索姓名中包含字母“n”的員工信息 :
SELECT * FROM T_Employee WHERE FName LIKE '%n%'
另外,
[ ]括弧中所指定範圍內的一個字元
C Like '9W0[1-2]'
[^]不在括弧中所指定範圍內的一個字元
D Like '%[A-D][^1-2]'
(五)空值處理
資料庫中,一個列如果沒有指定值,那麼值就為null,這個null和JAVA中的null不同,資料庫中的null表示“不知道”,而不是表示沒有。因此select null+1結果是null,因為“不知道”加1的結果還是“不知道”。
select count(*) from F_Employee where FName = null ---0 千萬註意,查詢null值一定不能用 = select count(*) from F_Employee where FName !=null ---0
SQL 中使用 is 來判斷 null
INSERT INTO F_Employee(FNumber,FName,FAge,FSalary) VALUES('DEV004',null,30,4300); INSERT INTO F_Employee(FNumber,FName,FAge,FSalary) VALUES('SALES005',null,32,1200); select * from F_Employee where FName is null
select * from F_Employee where FName is not null
(六)多值匹配
select * from F_Employee where fage in (23,25,27) --上面的等效於 select * from F_Employee where fage= 23 or fage=25 or fage=27
另外,
---範圍值: SELECT * FROM F_Employee WHERE FAGE>=23 AND FAGE <=27
(七)數據分組(group by)
select fage,count(*) from F_Employee group by fage
註意:
1.count(*) 是個聚合函數,它是指對分組後的每一組都要進行這樣的操作。
2.GROUP BY子句必須放到WHERE語句的之。
3.沒有出現在GROUP BY子句中的列是不能放到SELECT語句後的列名列表中的 (聚合函數中除外)。
錯誤:SELECT FAge,FSalary FROM T_Employee GROUP BY FAge 正確:SELECT FAge,AVG(FSalary) FROM T_Employee GROUP BY FAge select Age Max(工資),count(*) from 員工表 group by age //這樣可以,取一組的最大工資 select age ,name ,count(*) from 員工表 group by age //這樣不可以,name不應該在這裡出現
(八)Having語句
對分組後的數據進行過濾,不能用where 必須用 having,它必須用在group by 之後。
SELECT FAge,COUNT(*) as 人數 FROM F_Employee GROUP BY FAge HAVING COUNT(*)>1
註意:Having中不能使用未參與分組的列,Having不能替代where。作用不一樣,Having是對組進行過濾。
實際會遇到的代碼,可以練習一下思維:
select 身份證號,count(*) from F_Employee group by 身份證號 having count(*) >1
(九)限制結果集行數(limit 語句)
原數據(select * from F_Employee)
limit
select * from F_employee limit 2 --只查前兩條
下麵的輸出結果要註意一下:
select * from F_employee limit 2,4 --可以理解為從0開始的座標,是第三條,4代表4條
臨時有時,晚上繼續。。。。16:48:01
=============================================繼續================================================
(十)去掉重覆數據(distinct 語句)
首先,創建了一個有重覆數據的表,
去掉重覆數據如下指令:
select distinct Fage from F_Employee
(十一)聯合結果集(Union 語句)
執行下列語句,形成一些測試數據:
CREATE TABLE T_TempEmployee (FIdCardNumber VARCHAR(20),FName VARCHAR(20),FAge INT, PRIMARY KEY (FIdCardNumber)); INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES('7897845874','Sarani',33); INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES('7896547841','Tom',26); INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES('7841254963','Yala',38); INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES('7854851258','Tina',26); INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES('9658748574','Konkaya',29); INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES('4158525874','Fotifa',46);
基本的原則:
每個結果集必須有相同的列數;每個結果集的列必須類型相容。
代碼形式如下顯示:(列數相同,類型一致)
SELECT FNumber,FName,FAge FROM T_Employee union SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee
註意:
Union //去重
Union all //不去重,效率高
(Union 因為要進行重覆值掃描,所以效率低,因此如果不是確定要合併重覆行,那麼就用UNION ALL)
例子:(和上面的不同,輸出結構的第一列會出現你定義的名稱,比如“正式員工最高年齡”、“正式員工最低年齡”等)
要求查詢員工的最低年齡和最高年齡,臨時工和正式員工要分別查詢
select '正工員工最高年齡', max(Fage) from t_employee union all select '正工員工最低年齡', min(Fage) from t_employee union all select '臨時工最低年齡', max(Fage) from T_TempEmployee union all select '臨時工最低年齡', min(Fage) from T_TempEmployee
例子:(下麵會有一行“合計”哦~~很酷吧)
查詢每位正式員工的信息,包括工號、工資,並且在最後一行加上所有員工工資額合計。
select FNumber ,FSalary from t_employee union ALL select '合計' ,sum(FSalary) from t_employee
(十二)函數(平時最好別用函數,因為它不相容!!!!!!!!)
1.數字函數
select abs(-1) //絕對值 select ceil(3.33) //4 舍入到最大整數 select floor(3.33) //3 舍入到最小整數 select round(3.5) //四捨五入 select round(3.2425926,3) 3.243
2.字元串函數
my-sql: select char_length('12345') //Mysql沒有len函數,SQLServer中有 my-sql: select char_length( stuName) from stuExam my_sql: select char_length(NULL) select 的欄位值為null 則得到的長度也是null //select IdCard, LEN(Idcard) from Student //如果select的欄位值 為null,則len也是null select lower('aaaaAAA') select upper('aaaBBB') select rtrim(ltrim(' aaaaAAA ')) TRIM(str) select substring('0123456',2,3) // 得到234 select CONCAT(s1,s2...,sn)
3.日期函數
select now()
select HOUR(now()) --取當前日期的小時部分
(十三)case 語句
1.單值判斷,相當於switch case
CASE expression --這個單詞是表達示的意思 WHEN value1 THEN returnvalue1 WHEN value2 THEN returnvalue2 WHEN value3 THEN returnvalue3 ELSE defaultreturnvalue END
例子:查詢年齡, 如果22的,顯示小年輕;如果28顯示老家伙;其他的顯示中等家伙。
select Fname, ( case fage when 22 then '小青年' when 28 then '老家伙' else '中等家伙' end ) as 年齡類型 from F_employee
2.區間判斷
select FName, ( case ----註意,這個case 後面沒有直接跟fsalary when fsalary < 5000 then '低收入' when fsalary > 8000 then '高收入' else '普通收入' end ) as 賺錢 from F_employee
(十四)表連接
CREATE TABLE `stuinfo` ( `id` int(11) NOT NULL auto_increment, `name` varchar(20) default NULL, `age` int(11) default NULL, `schoolId` int(11) default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CREATE TABLE `schoolinfo` ( `schoolId` int(11) NOT NULL auto_increment, `schoolName` varchar(50) default NULL, `address` varchar(100) default NULL, PRIMARY KEY (`schoolId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
附:笛卡爾積:
如果沒有對應關係,表1的每一條記錄,和表2里的每一條記錄交叉組合 。
select a.*, b.* from stuInfo a , schoolInfo b ---關聯查詢的時候,沒有加入關聯條件,結果就以乘積的方式呈現 select a.*, b.* from stuInfo a , schoolInfo b where a.schoolid=b.schoolid ---把兩個表的信息全關聯出來了 select a.name,a.age, b.schoolName from stuInfo a , schoolInfo b where a.schoolid=b.schoolid ---只關聯出指定的列 常用
附:用 join on 連接(而今人們更喜歡用這個)
select a.name,a.age, b.schoolName from stuInfo a join schoolInfo b on a.schoolid=b.id----等價於以上表連接
註意:
1) 可以不用別名
select stuInfo.name,stuInfo.age, schoolInfo.schoolName from stuInfo join schoolInfo on stuInfo.schoolid=schoolInfo.id
2) 如果兩個表中沒有同名列,可以不用指定列所屬的表名
select name,age, schoolName from stuInfo a , schoolInfo b where a.schoolid=b.id
附:左聯接
比如,用來解決schoolName為空的學生不顯示
select name ,age , b.schoolId,schoolName,address from stuinfo as a left join schoolinfo as b on a.schoolId=b.schoolId select name ,age , b.schoolId,schoolName,address from stuinfo as a right join schoolinfo as b on a.schoolId=b.schoolId
(十五)子查詢
將一個查詢語句做為一個結果集供其他SQL語句使用,就像使用普通的表一樣,被當作結果集的查詢語句被稱為子查詢。
(通俗解釋就是說,對一個篩選後的查詢結果再進行篩選查詢)
select * from (select * from stuInfo where age<25) as xxxx where name like '劉_%' ---這個別名一定要取
例:查詢年齡最小的人
select * from (select min(age) from stuInfo )---其實,這個表達也沒啥意義,就為了演示子查詢的格式 -----上面的這句也可以用下麵這句來表達 select * from stuInfo where age = ( select min(age) from stuInfo)