MySQL的相關應用

来源:http://www.cnblogs.com/1693977889zz/archive/2017/07/24/7230082.html
-Advertisement-
Play Games

本文主要介紹資料庫中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)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 恢復內容開始 純html5+css+js實現噠 運行效果: 實現功能: 按鍵W,S,A,D,J分別控制坦克上下左右移動和發射子彈,由於水平有限,還在努力中~目前只實現了對自己坦克行為的控制,只畫了一顆子彈,記錄這顆子彈的坐標軌跡 源碼: 源碼在這裡啦~,只用了兩個文件,眾多不足,還望指出謝謝~~~~ ...
  • 1.首先確定發佈app的所必要選中或者切換的弄好 比如切換環境到 由測試環境切換到正式環境。 2.打發佈包 首先選中Product 然後選中Archive。 3.等待編譯。 4.打包成功 會進入到下麵這個界面。 5.我一般都是選中export 打一個發佈包 然後用application loader ...
  • 第一步:安裝Java 1.下載JDK,選擇適應自己的機型;官網地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.配置環境,問度娘:http://jingyan.baidu. ...
  • Android安裝過程出現問題 一、Eclipse 中 Emulator Control 不能用問題 在官方文檔中發現問題所在(官方文檔說明),在最後一行“The Emulator Control tab, shown in Figure 1, is no longer supported. Use ...
  • 出處:kelvin19840813 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是對博主最大的鼓勵,感謝您的認真閱讀。本文版權歸作者所有,歡迎轉載,但請保留該聲明。 發現decode行轉列之後 , 小數, 負數都會自動抹去 , 需要to_char加工 ...
  • MySQL對於web架構性能的影響最大,也是關鍵的核心部分。MySQL的設置是否合理優化,直接影響到web的速度和承載量!同時,MySQL也是優化難度最大的一個部分,不但需要理解一些MySQL專業知識,同時還需要長時間的觀察統計並且根據經驗進行判斷,然後設置合理的參數。 ...
  • 零、用戶管理: 1、新建用戶: >CREATE USER name IDENTIFIED BY 'ssapdrow'; 2、更改密碼: >SET PASSWORD FOR name=PASSWORD('fdddfd'); 3、許可權管理 >SHOW GRANTS FOR name; //查看name用 ...
  • 1. 特點 1. Redis支持數據的持久化,重啟時可以再次載入使用。 2. Redis除了支持key value類型的數據,還提供了list,set,zset,hash等數據結構的存儲。 3. Redis支持數據備份,master slave模式的數據備份。 2. 優勢 1. 性能極高 讀取速度1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...