柚子快報激活碼778899分享:SqlServer基礎(chǔ)學習筆記
柚子快報激活碼778899分享:SqlServer基礎(chǔ)學習筆記
目錄
1.SqlServer 簡介1.什么是數(shù)據(jù)庫2.結(jié)構(gòu)化查詢語言 (SQL ) 是什么?1.簡介2.數(shù)據(jù)操作語言(Data Manipulation Language,DML)3.數(shù)據(jù)查詢語言(Data Query Language,DQL)
3.數(shù)據(jù)庫的發(fā)展歷程4. 數(shù)據(jù)庫與Excel等電子表格有何區(qū)別?5.數(shù)據(jù)庫的類型6.數(shù)據(jù)庫軟件是什么?7.數(shù)據(jù)庫管理系統(tǒng) (DBMS) 是什么?8.簡單認識 SQL Server9.為什么要使用SqlServer ?10.SQL Server 基本服務(wù)介紹1.SQL Server 服務(wù)器類型2.系統(tǒng)數(shù)據(jù)庫
2.數(shù)據(jù)庫操作1.數(shù)據(jù)庫文件組成1.主數(shù)據(jù)文件(.mdf)2.次要數(shù)據(jù)文件(*.ndf)3.事務(wù)日志(*.ldf)
2.文件組1.文件和文件組的關(guān)系2.使用文件組的優(yōu)勢
3.數(shù)據(jù)庫操作1.使用SSMS 方式2.T-SQL方式1.創(chuàng)建數(shù)據(jù)庫2.創(chuàng)建次文件3.簡化創(chuàng)建數(shù)據(jù)庫(初學者推薦)4.刪除數(shù)據(jù)庫5.查看數(shù)據(jù)庫信息6.修改數(shù)據(jù)庫名稱7.切換數(shù)據(jù)庫
4.備份與還原1.備份2.還原
5. 附加與分離1.分離2.附加
3.數(shù)據(jù)類型與表操作1.數(shù)據(jù)類型1.Character 字符串2.Unicode 字符串3.Binary 類型4.Number 類型5.Date 類型6.其他數(shù)據(jù)類型1.C# 中的 類型 對應的 Sql 類型2. Binary 類型可以存儲的類型有哪些3.常用的數(shù)據(jù)庫類型有哪些
7.sql 中的Character和Unicode 區(qū)別8.Char 與 varchar 對比
2.數(shù)據(jù)表- table1.SSMS方式2.T-SQL 方式
4.表約束1.表約束分類2.主鍵約束1.簡介2.表級約束,列級約束
3.復合主鍵
5.表數(shù)據(jù)操作1.SSMS 方式2.T-SQL 方式1.添加數(shù)據(jù)2.修改數(shù)據(jù)3.刪除數(shù)據(jù)4.清空數(shù)據(jù)1.用法2.truncate 與 delete 的區(qū)別
5.聯(lián)級刪除,聯(lián)級更新
6.簡單查詢7.條件查詢和分組查詢1.條件查詢1.如何使用排序(升序,降序)2.多字段如何排序3.如何使用關(guān)系表達式查詢(大于,小于,等于)4.如何使用between...and 的語法5.如何統(tǒng)計個數(shù),平均分,最大數(shù),最小數(shù),求和
2.聚合函數(shù)3.exists 查詢4.分組查詢5.作業(yè)
8.嵌套查詢9.連接查詢1.連接查詢的分類2.內(nèi)連接1.簡介2.等值內(nèi)連接3.不等連接
3.自連接4.外連接1.左外連接2.右外連接3.全外連接
5.聯(lián)合查詢6.作業(yè)
目前工作很少接觸數(shù)據(jù)庫,工作之余進行SqlServer基礎(chǔ)學習,完善此薄弱之處。
1.SqlServer 簡介
1.什么是數(shù)據(jù)庫
數(shù)據(jù)庫是結(jié)構(gòu)化信息或數(shù)據(jù)(一般以電子形式存儲在計算機系統(tǒng)中)的有組織的集合,通常由數(shù)據(jù)庫管理系統(tǒng) (DBMS) 來控制。在現(xiàn)實中,數(shù)據(jù)、DBMS 及關(guān)聯(lián)應用一起被稱為數(shù)據(jù)庫系統(tǒng),通常簡稱為數(shù)據(jù)庫。
為了提高數(shù)據(jù)處理和查詢效率,當今最常見的數(shù)據(jù)庫通常以行和列的形式將數(shù)據(jù)存儲在一系列的表中,支持用戶便捷地訪問、管理、修改、更新、控制和組織數(shù)據(jù)。另外,大多數(shù)數(shù)據(jù)庫都使用結(jié)構(gòu)化查詢語言 ( SQL ) 來編寫和查詢數(shù)據(jù)。
2.結(jié)構(gòu)化查詢語言 (SQL ) 是什么?
1.簡介
SQL 是一種數(shù)據(jù)庫查詢和程序設(shè)計語言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng)。與其他程序設(shè)計語言(如 C#語言、Java等)不同的是,SQL 由很少的關(guān)鍵字組成,每個 SQL 語句通過一個或多個關(guān)鍵字構(gòu)成。
一體化:SQL 集數(shù)據(jù)定義、數(shù)據(jù)操作和數(shù)據(jù)控制于一體,可以完成數(shù)據(jù)庫中的全部工作。使用方式靈活:SQL 具有兩種使用方式,可以直接以命令方式交互使用;也可以嵌入使用,嵌入 C、C++、Fortran、COBOL、Java 等語言中使用。非過程化:只提操作要求,不必描述操作步驟,也不需要導航。使用時只需要告訴計算機“做什 么”,而不需要告訴它“怎么做”,存儲路徑的選擇和操作的執(zhí)行由數(shù)據(jù)庫管理系統(tǒng)自動完成。語言簡潔、語法簡單:該語言的語句都是由描述性很強的英語單詞組成,而且這些單詞的數(shù)目不 多。
SQL 包含以下 幾 部分:用來創(chuàng)建或刪除數(shù)據(jù)庫以及表等對象,主要包含以下幾種命令:
DROP:刪除數(shù)據(jù)庫和表等對象。CREATE:創(chuàng)建數(shù)據(jù)庫和表等對象。ALTER:修改數(shù)據(jù)庫和表等對象的結(jié)構(gòu)。
2.數(shù)據(jù)操作語言(Data Manipulation Language,DML)
用來變更表中的記錄,主要包含以下幾種命令:
SELECT:查詢表中的數(shù)據(jù)。INSERT:向表中插入新數(shù)據(jù) 。UPDATE:更新表中的數(shù)據(jù)。DELETE:刪除表中的數(shù)據(jù)。
3.數(shù)據(jù)查詢語言(Data Query Language,DQL)
用來查詢表中的記錄,主要包含 SELECT 命令,來查詢表中的數(shù)據(jù)。 用來確認或者取消對數(shù)據(jù)庫中的數(shù)據(jù)進行的變更。除此之外,還可以對數(shù)據(jù)庫中的用戶設(shè)定權(quán)限。主要包含以下幾種命令:
GRANT:賦予用戶操作權(quán)限。REVOKE:取消用戶的操作權(quán)限。COMMIT:確認對數(shù)據(jù)庫中的數(shù)據(jù)進行的變更。ROLLBACK:取消對數(shù)據(jù)庫中的數(shù)據(jù)進行的變更。
3.數(shù)據(jù)庫的發(fā)展歷程
目前幾乎所有的關(guān)系數(shù)據(jù)庫都使用 SQL 編程語言來查詢、操作和定義數(shù)據(jù),進行數(shù)據(jù)訪問控制。 SQL最初于 20 世紀 70 年代由 IBM 開發(fā),當時 Oracle 是一個主要的貢獻者,這推動了 SQL ANSI 標準的實施,而 SQL 的興起也刺激了 IBM、Oracle 和 Microsoft 等公司開始全面擴張。時至今日,雖然 SQL仍被廣泛使用,但是新的編程語言也已經(jīng)嶄露頭角。
自 20 世紀 60 年代初誕生至今,數(shù)據(jù)庫已經(jīng)發(fā)生了翻天覆地的變化。最初,人們使用分層數(shù)據(jù)庫(樹形模型,僅支持一對多關(guān)系)和網(wǎng)絡(luò)數(shù)據(jù)庫(更加靈活,支持多種關(guān)系)這樣的導航數(shù)據(jù)庫來存儲和操 作數(shù)據(jù)。這些早期系統(tǒng)雖然簡單,但缺乏靈活性。20世紀 80 年代,關(guān)系數(shù)據(jù)庫開始興起;20 世紀 90年代,面向?qū)ο蟮臄?shù)據(jù)庫開始成為主流。最近,隨著互聯(lián)網(wǎng)的快速發(fā)展,為了更快速地處理非結(jié)構(gòu)化數(shù) 據(jù),NoSQL數(shù)據(jù)庫應運而生。現(xiàn)在,云數(shù)據(jù)庫和自治駕駛數(shù)據(jù)庫在數(shù)據(jù)收集、存儲、管理和利用方面 正不斷取得新的突破。
4. 數(shù)據(jù)庫與Excel等電子表格有何區(qū)別?
數(shù)據(jù)庫和電子表格(例如 Microsoft Excel)都可以便捷地存儲信息,兩者的主要區(qū)別包括:
存儲和操作數(shù)據(jù)的方式。誰可以訪問數(shù)據(jù)??梢源鎯Χ嗌贁?shù)據(jù)。
從一開始,電子表格就是專門針對單一用戶而設(shè)計的,其特性也反映了這一點。電子表格非常適合不需要執(zhí)行太多高度復雜的數(shù)據(jù)操作的單一用戶或少數(shù)用戶。另一方面,數(shù)據(jù)庫的設(shè)計是為了保存大量有組織的信息,有時是海量的。數(shù)據(jù)庫允許多個用戶同時使用高度復雜的邏輯和語言,快速、安全地訪問和查詢數(shù)據(jù)。
5.數(shù)據(jù)庫的類型
數(shù)據(jù)庫有很多種,至于各種數(shù)據(jù)庫孰優(yōu)孰劣,主要取決于企業(yè)希望如何使用數(shù)據(jù):
關(guān)系數(shù)據(jù)庫:關(guān)系數(shù)據(jù)庫在 20 世紀 80 年代成為主流。關(guān)系數(shù)據(jù)庫中的項被組織為一系列具有列和行的表。關(guān)系數(shù)據(jù)庫技術(shù)為訪問結(jié)構(gòu)化信息提供了最有效和靈活的方法。面向?qū)ο髷?shù)據(jù)庫:面向?qū)ο髷?shù)據(jù)庫中的信息以對象的形式表示,這與面向?qū)ο蟮木幊滔囝愃?。分布式?shù)據(jù)庫:分布式數(shù)據(jù)庫由位于不同站點的兩個或多個文件組成。數(shù)據(jù)庫可以存儲在多臺計算機上,位于同一個物理位置,或分散在不同的網(wǎng)絡(luò)上(TIDB)。數(shù)據(jù)倉庫:數(shù)據(jù)倉庫是數(shù)據(jù)的中央存儲庫,是專為快速查詢和分析而設(shè)計的數(shù)據(jù)庫。NoSQL 數(shù)據(jù)庫:NoSQL 或非關(guān)系數(shù)據(jù)庫,支持存儲和操作非結(jié)構(gòu)化及半結(jié)構(gòu)化數(shù)據(jù)(與關(guān)系數(shù)據(jù)庫相反,關(guān)系數(shù)據(jù)庫定義了應如何組合插入數(shù)據(jù)庫的數(shù)據(jù))。隨著 Web 應用的日益普及和復雜化, NoSQL 數(shù)據(jù)庫得到了越來越廣泛的應用。圖形數(shù)據(jù)庫:圖形數(shù)據(jù)庫根據(jù)實體和實體之間的關(guān)系來存儲數(shù)據(jù)。OLTP 數(shù)據(jù)庫: OLTP 數(shù)據(jù)庫是一種高速分析數(shù)據(jù)庫,專為多個用戶執(zhí)行大量事務(wù)而設(shè)計。
這些只是目前投入使用的幾十種數(shù)據(jù)庫中的一小部分。另外還有許多針對具體的科學、財務(wù)或其他功能而定制的不太常見的數(shù)據(jù)庫。除了不同的數(shù)據(jù)庫類型之外,技術(shù)開發(fā)方法的變化以及云和自動化等重大進步也在推動數(shù)據(jù)庫朝新的方向發(fā)展。一些最新的數(shù)據(jù)庫包括:
開源數(shù)據(jù)庫:開源數(shù)據(jù)庫系統(tǒng)是指源代碼為開放源碼的數(shù)據(jù)庫系統(tǒng),它可以是 SQL 或 NoSQL 數(shù)據(jù)庫。(PostgreSQL,MySql)云數(shù)據(jù)庫:云數(shù)據(jù)庫指位于私有云、公有云或混合云計算平臺上的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)集合。云數(shù)據(jù)庫模式分為兩類:傳統(tǒng)模式和數(shù)據(jù)庫即服務(wù) ( DBaaS )。在 DBaaS 中,管理任務(wù)和維護由服務(wù) 提供商執(zhí)行。 B站:任我行碼農(nóng)場多模型數(shù)據(jù)庫:多模型數(shù)據(jù)庫將不同類型的數(shù)據(jù)庫模型結(jié)合到一個集成的后端中。這意味著它們可以支持各種不同的數(shù)據(jù)類型。文檔/ JSON 數(shù)據(jù)庫:文檔數(shù)據(jù)庫專為存儲、檢索和管理面向文檔的信息而設(shè)計,是一種以 JSON格式存儲數(shù)據(jù)的現(xiàn)代方法,而不是采用行和列的形式。自治駕駛數(shù)據(jù)庫:基于云的自治駕駛數(shù)據(jù)庫(也稱作自治數(shù)據(jù)庫)是一種全新的極具革新性的數(shù)據(jù)庫,它利用機器學習技術(shù)自動執(zhí)行數(shù)據(jù)庫調(diào)優(yōu)、保護、備份、更新,以及傳統(tǒng)上由數(shù)據(jù)庫管理員( DBA ) 執(zhí)行的其他常規(guī)管理任務(wù)。
6.數(shù)據(jù)庫軟件是什么?
數(shù)據(jù)庫軟件旨用于創(chuàng)建、編輯和維護數(shù)據(jù)庫文件及記錄,幫助用戶更輕松地執(zhí)行文件和記錄創(chuàng)建、數(shù)據(jù)錄入、數(shù)據(jù)編輯、更新和報告等操作。除此之外,數(shù)據(jù)庫軟件還能處理數(shù)據(jù)存儲、備份和報告以及多路訪問控制和安全性等問題。隨著當今數(shù)據(jù)盜竊日益頻繁,數(shù)據(jù)庫安全性已變得至為重要。數(shù)據(jù)庫軟件有時也稱為“數(shù)據(jù)庫管理系統(tǒng)” (DBMS)。 數(shù)據(jù)庫軟件支持用戶以結(jié)構(gòu)化形式存儲數(shù)據(jù)然后訪問數(shù)據(jù),能夠極大簡化數(shù)據(jù)管理。它一般會提供圖形界面來簡化數(shù)據(jù)創(chuàng)建和管理,在某些情況下,用戶可以使用數(shù)據(jù)庫軟件來自行構(gòu)建數(shù)據(jù)庫。
7.數(shù)據(jù)庫管理系統(tǒng) (DBMS) 是什么?
數(shù)據(jù)庫通常離不開完備的數(shù)據(jù)庫軟件程序,也就是數(shù)據(jù)庫管理系統(tǒng) (DBMS)。DBMS充當數(shù)據(jù)庫與其用戶或程序之間的接口,允許用戶檢索、更新和管理信息的組織和優(yōu)化方式。此外,DBMS還有助于監(jiān)督和控制數(shù)據(jù)庫,提供各種管理操作,例如性能監(jiān)視、調(diào)優(yōu)、備份和恢復。
常見的數(shù)據(jù)庫軟件或 DBMS 有 MySQL 、Microsoft Access、 Microsoft SQL Server 、FileMakerPro 、Oracle Database 和 dBASE , ProgreSQL。
8.簡單認識 SQL Server
SQL Server 是 Microsoft 開發(fā)的一個關(guān)系數(shù)據(jù)庫管理系統(tǒng)( RDBMS ),現(xiàn)在是世界上最為常用的數(shù)據(jù)庫之一;SQL Server 是一個高度可擴展的產(chǎn)品,可以從一個單一的筆記本電腦上運行的任何東西或以高倍云服務(wù)器網(wǎng)絡(luò),或在兩者之間任何東西。雖然說是“任何東西”,但是仍然要滿足相關(guān)的軟件和硬件的要求;SQL Server 1.0 在1989年發(fā)布,至今 SQL Server 已成為一個真正的企業(yè)信息化平臺。 SQLServer 2014 包括內(nèi)置的商務(wù)智能工具,以及一系列的分析和報告工具,可以創(chuàng)建數(shù)據(jù)庫、備份、復制、安全性更好以及更多。
9.為什么要使用SqlServer ?
數(shù)據(jù)持久化 :指的是 可以存儲在磁盤中。高效的存儲與查詢。數(shù)據(jù)共享。.Net 首選,因為與 SqlServer 同屬于微軟。
10.SQL Server 基本服務(wù)介紹
1.SQL Server 服務(wù)器類型
Sql Server 提供了四種服務(wù)器類型:
數(shù)據(jù)庫引擎 。Analysis Services (分析服務(wù) ) 。Reporting Services (報告服務(wù))。Integration Services (集成服務(wù))。
數(shù)據(jù)庫引擎 (核心服務(wù)): 是 Sql Server 的核心服務(wù) 他是存儲和處理表格關(guān)系格式的數(shù)據(jù)或 xml 文檔格式的數(shù)據(jù)服務(wù)。負責完成數(shù)據(jù)存儲,處理,和安全。 Analysis Services (分析服務(wù) ) : Analysis Services 主要是通過服務(wù)器和客戶端 提供聯(lián)機分析和處理和數(shù)據(jù)挖掘功能。(有了它用戶可以創(chuàng)建,管理來自于其他數(shù)據(jù)源的數(shù)據(jù)結(jié)構(gòu))(聯(lián)機事物的處理是由數(shù)據(jù)庫引擎來完成的)。 Reporting Services (報表服務(wù)): Reporting Services 用來做基于服務(wù)器的解決方案:他可以用來生成各種報表方便工作。 Integration Services (集成服務(wù)): Integration Services 是一個數(shù)據(jù)集成的平臺,負責完成有關(guān)數(shù)據(jù)的提取,轉(zhuǎn)換,加載,集成服務(wù)包括生成并調(diào)試包的圖形工具和向?qū)В粓?zhí)行如數(shù)據(jù)導入、導出, FTP 操作,SQL 語句執(zhí)行和電子郵件消息傳遞等工作流功能的任務(wù)等。
2.系統(tǒng)數(shù)據(jù)庫
Master:主系統(tǒng)數(shù)據(jù)庫,記錄了系統(tǒng)級別的信息,并且記錄了登錄賬戶,系統(tǒng)配置和已連接的服務(wù)信息。Model:模板數(shù)據(jù)庫.保存了創(chuàng)建數(shù)據(jù)庫所需要的模板信息。Tempdb :臨時數(shù)據(jù)庫,保存所有的臨時表信息和臨時存儲過程。Msdb :記錄代理程序的調(diào)度信息,警報,作業(yè)等信息。
2.數(shù)據(jù)庫操作
1.數(shù)據(jù)庫文件組成
1.主數(shù)據(jù)文件(.mdf)
要數(shù)據(jù)文件的建議文件擴展名是 .mdf 。主要數(shù)據(jù)文件包含數(shù)據(jù)庫的啟動信息,并指向數(shù)據(jù)庫中的其他文件,存儲部分或全部的數(shù)據(jù)。用戶數(shù)據(jù)和對象可存儲在此文件中,也可以存儲在次要數(shù)據(jù)文件中。每個數(shù)據(jù)庫有一個主要數(shù)據(jù)文件。 mdf 文件并非普通文件,因此不借助相應軟件是無法打開 mdf 文件的。打開 mdf 文件的常用虛擬光驅(qū)軟件,主要有:Daemon Tools 、東方光驅(qū)魔術(shù)師等。
2.次要數(shù)據(jù)文件(*.ndf)
次要數(shù)據(jù)文件的建議文件擴展名是 . ndf 。次要數(shù)據(jù)文件是可選的,由用戶定義并存儲用戶數(shù)據(jù),用于存儲主數(shù)據(jù)文件未能存儲的剩余數(shù)據(jù)和一些數(shù)據(jù)庫對象。通過將每個文件放在不同的磁盤驅(qū)動器上,次要文件可用于將數(shù)據(jù)分散到多個磁盤上。如果數(shù)據(jù)庫超過了單個 Windows 文件的最大大小,可以使用次要數(shù)據(jù)文件,這樣數(shù)據(jù)庫就能繼續(xù)增長。
3.事務(wù)日志(*.ldf)
事務(wù)日志的建議文件擴展名是 . ldf 。事務(wù)日志文件保存用于恢復數(shù)據(jù)庫的事務(wù)日志信息。數(shù)據(jù)庫的插入、刪除、更新等操作都會記錄在日志文件中,而查詢不會記錄在日志文件中。整個的數(shù)據(jù)庫有且僅有一個日志文件。每個數(shù)據(jù)庫必須至少有一個日志文件。
2.文件組
不同的文件可以存分布到不同的物理硬盤上,這樣便于分散硬盤IO,提高數(shù)據(jù)的讀取速度。 數(shù)據(jù)文件的組合,稱作文件組(File Group),數(shù)據(jù)庫不能直接設(shè)置存儲數(shù)據(jù)的數(shù)據(jù)文件,而是通過文件組來指定。
1.文件和文件組的關(guān)系
SQL Server 的數(shù)據(jù)存儲在文件中,文件是實際存儲數(shù)據(jù)的物理實體,文件組是邏輯對象, SQL Server 通過文件組來管理文件。
一個數(shù)據(jù)庫有一個或多個文件組,其中主文件組(Primary File Group)是系統(tǒng)自動創(chuàng)建的,用戶可以根據(jù)需要添加文件組。每一個文件組管理一個或多個文件,其中主文件組中包含主要數(shù)據(jù)文件(*. mdf),主文件組中也可以包含次要數(shù)據(jù)文件。(主要數(shù)據(jù)文件是系統(tǒng)默認生成的,并且在數(shù)據(jù)庫中是唯一的;次要數(shù)據(jù)文件是用戶根據(jù)需要添加的。)除了主文件組之外,其他文件組只能包含輔助文件。如下示例數(shù)據(jù)庫,系統(tǒng)已自動創(chuàng)建主文件組 PRIMARY,勾選 Default 表示將主文件組設(shè)置為默認文件組,即如果在 create table 和 create index時沒有指定 FileGroup 選項,那么 SQL Server 將使用默認的 PRIMARY 文件組來存儲數(shù)據(jù)。
文件組是一個邏輯實體,實際上,數(shù)據(jù)存儲在文件中( .mdf和.ndf )中,每一個文件組中都包含文件。
2.使用文件組的優(yōu)勢
在實際開發(fā)數(shù)據(jù)庫的過程中,通常情況下,用戶需要關(guān)注文件組,而不用關(guān)心文件的物理存儲,即使DBA改變文件的物理存儲,用戶也不會察覺到,也不會影響數(shù)據(jù)庫去執(zhí)行查詢。除了邏輯文件和物理文件的分離之外, SQL Server使用文件組還有一個優(yōu)勢,那就是分散IO負載,其實現(xiàn)的原理是:對于單分區(qū)表,數(shù)據(jù)只能存到一個文件組中。如果把文件組內(nèi)的數(shù)據(jù)文件分布在不同的物理硬盤上,那么 SQL Server能同時從不同的物理硬盤上讀寫數(shù)據(jù),把IO負載分散到不同的硬盤上。對于多分區(qū)表,每個分區(qū)使用一個文件組,把不同的數(shù)據(jù)子集存儲在不同的磁盤上,SQL Server 在讀寫某一個分組的數(shù)據(jù)時,能夠調(diào)用不同的硬盤IO。
3.數(shù)據(jù)庫操作
1.使用SSMS 方式
SSMS : Microsoft SqlServer Management Studio , 也就是數(shù)據(jù)庫管理軟件。 就是上圖這種通過圖形化界面來創(chuàng)建數(shù)據(jù)庫的方式。
2.T-SQL方式
1.創(chuàng)建數(shù)據(jù)庫
-- 創(chuàng)建數(shù)據(jù)庫
create database 第二單元測試
-- 指定數(shù)據(jù)文件存儲的文件組 on:在。。。。這上,primary:主文件組
on primary
(
-- 數(shù)據(jù)庫的邏輯名稱:相當于是某人的外號
Name = '第二單元測試', -- 邏輯名稱需要是唯一
filename = 'D:\test\第二單元測試_物理名稱.mdf', -- 物理名稱
size=5mb, -- 文件初始大小,初始化必須>=5 ,因為創(chuàng)建數(shù)據(jù)庫的model 模板信息 必須是
5mb以上
filegrowth = 4mb, -- 每次增長多少
maxsize =200mb -- 文件的最大值
);
2.創(chuàng)建次文件
alter database 第二單元測試
add file
(
-- 數(shù)據(jù)庫的邏輯名稱:相當于是某人的外號
Name = '第二單元測試_次文件',
filename = 'E:\test\第二單元測試_次文件.ndf', -- 物理名稱
size=5mb, -- 文件初始大小,初始化必須>=5 ,因為創(chuàng)建數(shù)據(jù)庫的model 模板信息 必須是
5mb以上
filegrowth = 4mb, -- 每次增長多少
maxsize =200mb -- 文件的最大值
)
3.簡化創(chuàng)建數(shù)據(jù)庫(初學者推薦)
-- create database <數(shù)據(jù)庫名稱>;
create database 任我行教學管理系統(tǒng)
4.刪除數(shù)據(jù)庫
-- 切換數(shù)據(jù)庫
use master;
-- drop database <數(shù)據(jù)庫名稱>;
drop database 任我行教學管理系統(tǒng);
5.查看數(shù)據(jù)庫信息
-- exec sp_helpdb '<數(shù)據(jù)庫名稱>'
exec sp_helpdb 'Soa模擬考試'
6.修改數(shù)據(jù)庫名稱
-- exec sp_renamedb '<需要修改的數(shù)據(jù)庫的名稱>','<新的數(shù)據(jù)庫名稱>' ;
exec sp_renamedb
'第二單元測試', -- 需要修改的數(shù)據(jù)庫的名稱
'第二單元' -- 新的數(shù)據(jù)庫名稱
7.切換數(shù)據(jù)庫
-- use <數(shù)據(jù)庫名稱>
use 任我行教學管理系統(tǒng);
4.備份與還原
可能有一天,數(shù)據(jù)庫遭黑客攻擊,數(shù)據(jù)庫遭破壞,這個時候就需要時常的做文件的備份。也有可能公司來了一個馬大哈,把數(shù)據(jù)庫給刪除(刪庫跑路),這個時候也需要備份。
1.備份
-- backup database <數(shù)據(jù)庫名稱> to disk = '磁盤路徑';
backup database 第二單元測試 to disk ='D:\test\第二單元測試.bak';
2.還原
數(shù)據(jù)庫不存在的情況下:
-- restore database <數(shù)據(jù)庫名稱> from disk = '磁盤路徑'
restore database 第二單元測試 from disk = 'D:\test\第二單元測試.bak'
數(shù)據(jù)庫存在的情況下:
-- with replace:替換
-- restore database <數(shù)據(jù)庫名稱> from disk = '磁盤路徑' with replace;
restore database 第二單元測試 from disk = 'E:\test\第二單元測試.bak' with
replace;
5. 附加與分離
假設(shè)我有一個比較好的數(shù)據(jù)庫,大家都想要,我可以發(fā)給你們,但是直接發(fā)送不了,因為會提示“這個文件在數(shù)據(jù)庫 SqlServer 中打開”,這個時候就需要使用分離,將這個數(shù)據(jù)庫文件從SqlServer 中 分離出去。
現(xiàn)在數(shù)據(jù)庫已經(jīng)分離并且數(shù)據(jù)庫也發(fā)給你們了,我自己也想要用這個數(shù)據(jù)庫,這個時候就要重新的附加到 SQLSERVER 中來。
1.分離
-- execute:執(zhí)行
-- sp_detach_db:分離的存儲過程(理解為一個函數(shù))
-- execute sp_detach_db '<數(shù)據(jù)庫名稱>'
execute sp_detach_db 'Soa模擬考試'
2.附加
-- 附加
-- sp_attach_db:附加的存儲過程
-- exec sp_attach_db '<數(shù)據(jù)庫名稱>','<數(shù)據(jù)庫文件所在路徑>' ;
exec sp_attach_db 'Soa模擬考試','C:\Program Files\Microsoft SQL
Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\Soa模擬考試.mdf'
3.數(shù)據(jù)類型與表操作
1.數(shù)據(jù)類型
1.Character 字符串
2.Unicode 字符串
3.Binary 類型
4.Number 類型
5.Date 類型
6.其他數(shù)據(jù)類型
1.C# 中的 類型 對應的 Sql 類型
2. Binary 類型可以存儲的類型有哪些
音頻,視頻,文件(圖片)
3.常用的數(shù)據(jù)庫類型有哪些
7.sql 中的Character和Unicode 區(qū)別
CHAR(n)類型 將 int ASCII 代碼轉(zhuǎn)換為字符的字符串函數(shù)。參數(shù)n是介于 0 和 255 之間的整數(shù)。如果整數(shù)表達式不在此范圍內(nèi),將返回 NULL 值。
nchar 和 nvarchar nchar 是固定長度 Unicode 數(shù)據(jù)的數(shù)據(jù)類型, nvarchar 是可變長度 Unicode 數(shù)據(jù)的數(shù)據(jù)類型,二者 均使用 UNICODE UCS-2 字符集。
nchar(n) 類型 包含 n 個字符的固定長度 Unicode 字符數(shù)據(jù)。n 的值必須介于 1 與 4,000 之間。存儲大小為 n 字節(jié)的 兩倍。 nchar 在 SQL-92 中的同義詞為 national char 和 national character。
nvarchar(n) 類型 包含 n 個字符的可變長度 Unicode 字符數(shù)據(jù)。n 的值必須介于 1 與 4,000 之間。字節(jié)的存儲大小是所 輸入字符個數(shù)的兩倍。所輸入的數(shù)據(jù)字符長度可以為零。 nvarchar 在 SQL-92 中的同義詞為 national char varying 和 national character varying。
8.Char 與 varchar 對比
CHAR的長度是不可變的,而VARCHAR的長度是可變的,也就是說,定義一個CHAR[10]和 VARCHAR[10],如果存進去的是‘ABCD’, 那么CHAR所占的長度依然為10,除了字符‘ABCD’外,后面 跟六個空格,而VARCHAR的長度變?yōu)?了,取數(shù)據(jù)的時候,CHAR類型的要用trim()去掉多余的空 格,而VARCHAR類型是不需要的。CHAR的存取速度要比VARCHAR快得多,因為其長度固定,方便程序的存儲與查找;但是CHAR 為此付出的是空間的代價,因為其長度固定,所以難免會有多余的空格占位符占據(jù)空間,可以說是以空間換取時間效率,而VARCHAR則是以空間效率為首位的。CHAR的存儲方式是,一個英文字符(ASCII)占用1個字節(jié),一個漢字占用兩個字節(jié);而 VARCHAR的存儲方式是,一個英文字符占用2個字節(jié),一個漢字也占用2個字節(jié)。兩者的存儲數(shù)據(jù)都是非unicode的字符數(shù)據(jù)。
2.數(shù)據(jù)表- table
數(shù)據(jù)表:相當于是C#中的類,是用于存儲數(shù)據(jù)的數(shù)據(jù)庫對象。
1.SSMS方式
在數(shù)據(jù)庫管理軟件中以圖形化的方式來創(chuàng)建表。
2.T-SQL 方式
通過代碼來創(chuàng)建表。
use step2_unit2;
--創(chuàng)建表格
create table Student
(
Id int,
StudentNo char(11),
Phone char(11),
Sex nchar(4)
);
--修改表格,添加姓名字段,varcahr(20)
alter table Student
add NickName varchar(20);
--修改字段類型,將NickName更改為nvarchar(30)
alter table Student
alter column NickName nvarchar(30);
--刪除字段
alter table Student
drop column NickName;
4.表約束
為了維護數(shù)據(jù)表的數(shù)據(jù)完整性而設(shè)定的一系列規(guī)則,防止用戶在數(shù)據(jù)表中插入一些錯誤的數(shù)據(jù)。
1.表約束分類
主鍵約束:保證數(shù)據(jù)的完整性,唯一性,原子性(Id:編號)。外鍵約束 例如:
唯一約束。檢查約束。默認值約束。非空約束。
2.主鍵約束
1.簡介
主鍵只能有一個,但是可以由1-n個字段組成,多個字段組成的主鍵叫復合主鍵。
-- 在表中添加主鍵約束
create database 第四單元; -- 簡寫的創(chuàng)建數(shù)據(jù)庫的語法,數(shù)據(jù)庫的相關(guān)參數(shù)都是默認值
-- 切換數(shù)據(jù)庫
use 第四單元;
-- 第一種寫法
create table Category
(
-- 列級約束
Id int primary key identity, -- 商品分類編號, primary key 是主鍵約束
CategoryName varchar(20)
)
-- 第二種寫法
create table Category2
(
Id int identity,
CategoryName varchar(20),
--primary key(Id)
-- 表級約束
constraint pk_category2_id primary key(id)
)
-- 第三種寫法,假設(shè)表已經(jīng)創(chuàng)建完畢,突然發(fā)現(xiàn),主鍵忘記創(chuàng)建了
create table Category3
(
Id int identity, -- 商品分類編號, primary key 是主鍵約束
CategoryName varchar(20)
)
-- 表級約束
alter table Category3
add constraint pk_category3_id primary key(Id)
2.表級約束,列級約束
列約束是對某一個特定列的約束,包含在列定義中,直接跟在該列的其他定義之后,用空格分隔,不必指定列名。 表約束與列定義相互獨立,不包括在列定義中,通常用于對多個列一起進行約束,與列定義用’,’分隔,定義表約束時必須指出要約束的那些列的名稱。
區(qū)別: 如果完整性約束涉及到該表的多個屬性列,必須定義在表級上,否則既可以定義在列級也可以定義在表級。
簡而言之:
列級約束:列級約束是行定義的一部分,只能應用于一列上。表級約束:表級約束是獨立于列的定義,可以應用在一個表中的多列上。
3.復合主鍵
create table score
(
studentId int,
courseId int,
score int,
addTime datetime,
primary key(studentId,courseId) -- 復合主鍵
)
例如:
5.表數(shù)據(jù)操作
1.SSMS 方式
在數(shù)據(jù)庫管理軟件中以圖形化的方式來添加編輯數(shù)據(jù)。
2.T-SQL 方式
1.添加數(shù)據(jù)
數(shù)字不需要加單引號(加了也不會報錯,但不建議這么干),字符類型要加單引號(C#是雙引號表示字符串)。
create table Student
(
Id int primary key identity, -- 每添加一條數(shù)據(jù),Id從1開始,每次自增1
NickName nvarchar(15), -- unicode
StudentNo char(11) , -- 學號
Sex nchar(2),
Account varchar(20), -- 賬號
[Password] varchar(50) -- 密碼
);
create table Student
(
Id int primary key identity(2,2), -- 每添加一條數(shù)據(jù),Id從2開始,每次自增2
NickName nvarchar(15), -- unicode
StudentNo char(11) , -- 學號
Sex nchar(2),
Account varchar(20), -- 賬號
[Password] varchar(50) -- 密碼
);
insert into Student values
('娜娜','2002','女','user3','123456'),
('娜娜','2002','女','user3','123456'),
('娜娜','2002','女','user3','123456');
2.修改數(shù)據(jù)
-- 1.將密碼修改為 666666
-- 修改的語法結(jié)構(gòu):update 表 set 要修改的字段1= 字段1值,字段2 = 字段2值
update UserInfo set Pwd='666666' -- 這樣修改會把所有的數(shù)據(jù)都修改了
-- 現(xiàn)在將 編號為3,2 的用戶姓名 分別修改為 張三,李四
-- 語法結(jié)構(gòu): update 表 set 要修改的字段1= 字段1值,字段2 = 字段2值 where 條件字段
=條件值
update UserInfo set UserName='張三' where Id=3
update UserInfo set UserName='李四' where Id=2
-- 將密碼為 666666 并且姓張的同學的 年齡 修改為 25
-- %:0-n 個任意字符
update UserInfo set Age=25 where Pwd='666666' and UserName like '張%'
-- 將性別為男并且姓黃的同學的角色 修改為 超級管理員
-- 0:男 1:女 2:未知 3:保密
update UserInfo set RoleId='853d469f-7906-4eb6-9034-e4e1314db331' where
Sex=0 and UserName like '黃%'
-- 將 賬號包含了 admin 并且 年齡大于30歲的同學的 密碼修改為 1qaz2wsx 年齡 修改為 25
歲
update UserInfo set Pwd='1qaz2wsx',Age=25 where Account like '%admin%' and
Age>30
3.刪除數(shù)據(jù)
-- 刪除用戶表中的數(shù)據(jù)
delete from Userinfo
select * from UserInfo -- 查詢用戶表
-- 刪除張三,李四兩位用戶
Delete from UserInfo where UserName='張三' or UserName= '李四'
-- in:在...里面
delete from UserInfo where UserName in('張三','李四')
-- 刪除用戶編號為:4,5,6 并且 性別 =3 的用戶信息
delete from UserInfo where Id in('4','5','6') and Sex='3'
或者
delete from UserInfo where Id in(4,5,6) and Sex=3
什么情況下,一定需要加引號? 字符串,一定需要加引號,還有日期,時間,中文。 數(shù)字:可加可不加, 建議不要加。
4.清空數(shù)據(jù)
1.用法
-- 如何清空數(shù)據(jù)
delete from RoleInfo
-- 刪除用戶表中的數(shù)據(jù)
delete from Userinfo
select * from UserInfo -- 查詢用戶表
-- 清空數(shù)據(jù)
truncate table UserInfo ;
2.truncate 與 delete 的區(qū)別
truncate 是真正意義上的清空, 不能加任何查詢條件,自增id 會重置 delete 只是刪除數(shù)據(jù),如果Id是自增,則自增種子不會從頭開始。
5.聯(lián)級刪除,聯(lián)級更新
-- 角色表
create table RoleInfo
(
Id uniqueidentifier primary key,
RoleName varchar(50) not null ,
CreateTime datetime not null default getdate()
);
go
-- 用戶表
create table UserInfo
(
Id int primary key identity,
UserName varchar(50) not null,
-- 聯(lián)級刪除:on delete cascade,聯(lián)級更新
RoleId uniqueidentifier not null
foreign key references RoleInfo(Id) on delete cascade on update
cascade,
Account varchar(50) not null,
Pwd varchar(50) not null ,
Sex tinyint not null ,
Age tinyint not null
);
go
6.簡單查詢
create database step2;
go
use step2;
go
-- 學生表
create table StudentInfo
(
stuId char(10) primary key, -- 主鍵
stuName varchar(20), -- 姓名
ClassId int, -- 班級編號,邏輯外鍵,并不是真正的外鍵約束
stuPhone char(11), -- 電話號碼
stuSex char(4), -- 性別
stuBirthday datetime -- 生日
);
go
-- 班級表
create table ClassInfo
(
Id int primary key identity, -- 班級的主鍵
Name varchar(30), -- 班級名稱
College varchar(20) -- 學院
);
go
-- 成績表
create table StudentScore
(
Id int primary key identity, -- 成績的主鍵
stuId char(10), -- 學生外鍵
CourseName varchar(20), -- 課程
theoryScore int, -- 理論成績
skillScore int -- 技能成績
);
INSERT INTO
dbo.StudentInfo(stuId,stuName,ClassId,stuPhone,stuSex,stuBirthday)VALUES
('180325011','任我行',5,'13823204456','男', '1999-09-09'),
('180325012','張三',4,'13823204452','女', '1998-08-08'),
('180325013','李四',2,'18899251152','男', '1997-07-07'),
('180325014','王五',1,'13597445645','女', '1998-08-08'),
('180325015','帥天行',5,'13814204456','男', '1998-06-06'),
('180325016','葉星辰',5,'17623204936','男', '1998-05-05'),
('180325017','趙日天',0,'13922044932','男', '1997-07-15');
go
INSERT INTO dbo.ClassInfo(Name,College)VALUES
('軟件技術(shù)1班', '計算機系' ),
('會計1班', '經(jīng)濟管理系' ),
('會計2班', '經(jīng)濟管理系' ),
('歐美軟件外包班', '計算機系' ),
('會計3班', '經(jīng)濟管理系' );
go
INSERT INTO dbo.StudentScore(stuId,CourseName,theoryScore,skillScore)VALUES
( '180325011', '會計從業(yè)', 80, 90 ),
( '180325011', 'C# 入門編程', 99, 100 ),
( '180325012', 'SQLServer編程', 70, 75 ),
( '180325013', '會計從業(yè)', 93, 80 ),
( '180325014', 'C# 高級編程', 99, 99 ),
( '180325015', '會計從業(yè)', 74, 40 ),
( '180325015', 'C# 入門編程', 80, 90 );
--1.如何查看表中所有數(shù)據(jù)?
-- 查看學生表
-- select: 查詢
-- *:代表表中所有的列
select * from StudentInfo
-- * 號,在數(shù)據(jù)庫優(yōu)化的章節(jié)中,不建議使用*號,因為系統(tǒng)要解析這個*號,需要一點點時間
-- 實際開發(fā)中,如果字段過多,我們查詢時,只查出業(yè)務(wù)中所需要的字段
select stuName,stuId from StudentInfo
-- 查詢班級表,執(zhí)行
select id,Name,College from ClassInfo
--2.如何查詢指定幾個字段的值?
-- 查詢學生的姓名,性別,生日,班級
select stuName,stuSex,stuBirthday,ClassId from StudentInfo
--3.如何給字段取別名?(可以省略as)
-- 把學生表中所有的字段都取別名
select stuId as 學生主鍵,stuName as 姓名,ClassId 班級編號,stuPhone 電話號碼,stuSex 性別,stuBirthday 生日 from StudentInfo
--4.distinct的用法?多個字段的用法?
-- distinct:去除重復項
select distinct ClassId from StudentInfo
select distinct stuSex from StudentInfo
-- 指的是兩個字段組合在一起,不會重復
select distinct stuSex,ClassId from StudentInfo
-- 這兩個結(jié)果集為什么會一樣?
select stuId,CourseName from StudentScore
-- disctinct 后面跟著幾個字段,表示 去除這幾個字段(組合在一起)重復的意思
select distinct stuId,CourseName from StudentScore
-- 這樣寫會去除重復嗎?
select distinct * from StudentInfo -- 這樣寫沒有意義,反而增加系統(tǒng)的開銷
--5.top 的用法?
-- 取前3條數(shù)據(jù)
-- top :前。。。條
select top 3 * from StudentInfo
--6.top ... percent(百分比)?
-- 查詢前30%的學生數(shù)據(jù)
-- 從這個故事告訴我們,數(shù)據(jù)沒有半條,向上取整
select top 30 percent * from StudentInfo
--7.查詢年齡大于20歲的?
-- year():獲取年份
-- 年齡 = 當前年份 - 生日所在年份
select * from StudentInfo where (year(getdate())-year(stuBirthday))>20
-- 查詢學生的,姓名,性別,年齡 所有字段取別名
-- 年齡 = 當前年份 - 生日所在年份
select stuName as 姓名,stuSex as 性別,(year(getdate())-year(stuBirthday)) as 年齡 from StudentInfo
-- 查詢80 后的女生
-- 80后:1980-1989
select * from StudentInfo where year(stuBirthday)>=1980 and year(stuBirthday)<=1989 and stuSex='女'
--9.查詢姓李的學生信息
-- like:模糊查詢,中文意思是:像。。。
select * from StudentInfo where stuName like '李%'
--10.列出技能成績大于90分的成績單
select * from StudentScore where skillScore>=90
--11.查詢課程包含”SqlServer”的成績信息
select * from StudentScore where CourseName like '%SqlServer%'
--12.查詢每個學生不同的成績列表
select distinct stuId,skillScore from StudentScore
--15.查詢年齡大于20歲前3條學生的姓名,年齡,所有字段取別名
select top 3 stuName as 姓名,stuSex as 性別 from StudentInfo where (year(getdate())-year(stuBirthday))>20
7.條件查詢和分組查詢
1.條件查詢
條件查詢是通過where子句進行檢索的查詢方式。
select 字段名1, 字段名2, …, 字段名n from 數(shù)據(jù)表名 where 查詢條件
1.如何使用排序(升序,降序)
asc :表示升序(默認排序方式) desc :降序 排序語法:select … from 表名 [條件] order by 要排序的字段 asc/desc
-- 將成績從高到低進行排序
select * from StudentScore order by (theoryScore+skillScore)
-- 查詢學生表,按姓名升序顯示
select * from StudentInfo order by stuName asc -- asc 可以省略
2.多字段如何排序
語法: select … from 表名 [條件] order by 第一要排序的字段 asc/desc , 第二要排序的字段 asc/desc
-- 查詢成績表,先按學生編號從低到高排序,再按成績從高到低顯示
select * from StudentScore order by stuId asc,(theoryScore+skillScore) desc
-- 查詢學生信息,先按班級進行升序,再按生日進行降序
select * from StudentInfo order by ClassId asc ,stuBirthday desc
3.如何使用關(guān)系表達式查詢(大于,小于,等于)
-- 查詢 班級編號 在 1,3,5,7 里的學生信息
select * from StudentInfo where ClassId in(1,3,5,7)
-- 查詢班級編號 不是偶數(shù)的學生信息
select * from StudentInfo where ClassId%2!=0
-- 查詢技能成績大于90分的成績信息
select * from StudentScore where skillScore>90
4.如何使用between…and 的語法
between … and :在…之間,應用范圍:數(shù)字類型
-- 查詢技能成績在60-80之間的成績信息
-- 寫法1
select * from StudentScore where skillScore between 60 and 80
-- 寫法2
select * from StudentScore where skillScore>=60 and skillScore<=80
5.如何統(tǒng)計個數(shù),平均分,最大數(shù),最小數(shù),求和
-- 統(tǒng)計學生的個數(shù)
select count(stuId) from StudentInfo
-- 統(tǒng)計女生的個數(shù)
select count(stuId) as 女生個數(shù) from StudentInfo where stuSex='女'
-- 查詢學生平均分
select avg(skillScore+theoryScore) from StudentScore
-- 查詢課程名稱為'C# 入門編程'的平均分
select avg(skillScore+theoryScore) from StudentScore where CourseName='C#
入門編程'
-- 查詢班級編號最大的班級
-- 寫法1
select max(classId) from StudentInfo
-- 寫法2
select top 1 (skillScore+theoryScore) from StudentScore order by
(skillScore+theoryScore) desc
-- 計算最低分
-- 寫法1
select min(skillScore+theoryScore) from StudentScore
-- 寫法2
select top 1 (skillScore+theoryScore) from StudentScore order by
(skillScore+theoryScore) asc
-- 計算技能總分
select sum(skillScore) from StudentScore
-- 計算學生編號為180325011 的技能總分
select sum(skillScore) from StudentScore where stuId='180325011'
-- 查詢有多少個人參加了考試
select count(distinct stuId) from StudentScore
2.聚合函數(shù)
將所有聚合函數(shù)寫在一起。
select count(distinct stuId) 學生數(shù)量,Min(skillScore) 最小值,Max(skillScore) 最大值,Sum(skillScore) 總和 from StudentScore
3.exists 查詢
功能:用于嵌套查詢。
exists后的查詢語句有結(jié)果則為真,無結(jié)果則為假,如果為真,則執(zhí)行外層查詢,否則外層查詢不執(zhí)行。
語法格式:
select 字段名1, 字段名2, …, 字段名n from 數(shù)據(jù)表名 where exists(select 字段名 from 數(shù)據(jù)表名 where …)
-- 如果存在大于20歲,則查詢結(jié)果,
select * from StudentInfo where exists (select * from StudentInfo where year(getdate())-year(stuBirthday)>20)
--如果班級里面有兩個以上的老王,則把老王的信息查詢出來
select * from StudentInfo where exists (select * from(select count(stuId) as 數(shù)量 from StudentInfo where stuName like '王%') a where a.數(shù)量>=1)
4.分組查詢
如何使用分組查詢?他們的關(guān)鍵字分別是什么?
語法:select 要分組的字段,聚合函數(shù) from 表名 group by 要分組的字段
--9.計算每門課程的平均分
select CourseName, avg(skillScore) as 平均分 from StudentScore group by CourseName
--10.統(tǒng)計每個學生的平均分
select stuId,avg(skillScore+theoryScore) from StudentScore group by stuId
-- 統(tǒng)計每個班級有多少個學生
select ClassId,Count(stuId) as 個數(shù) from StudentInfo group by ClassId
-- 統(tǒng)計每門課程有多少位同學在學習
select CourseName,count(stuId) from StudentScore group by CourseName
-- 統(tǒng)計每個學生學習了多少門課程
select stuId,count(CourseName) from StudentScore group by stuId
--11.查看每一門課程的平均分,總分,最高分,最低分
select CourseName,avg(skillScore),sum(skillScore),max(skillScore),min(skillScore) from StudentScore group by CourseName
-- 11.1 查詢每門課程,每個學生的最低分
select CourseName,stuId,min(skillScore) from StudentScore group by CourseName,stuId
--12.統(tǒng)計每門課程的最低分,并且查詢出70分以上的
-- having:在分組的基礎(chǔ)之上進行數(shù)據(jù)過濾
select CourseName,min(skillScore) from StudentScore group by CourseName having min(skillScore)>70
--13.統(tǒng)計每門課程,但不包含課程C# 入門編程的最低分,并且查詢出70分以上的
-- 13.1統(tǒng)計每門課程最低分
select CourseName,min(skillScore) from StudentScore group by CourseName
-- 13.2 在統(tǒng)計之前加上where 課程!=C# 入門編程
select CourseName,min(skillScore) from StudentScore where CourseName!='C# 入門編程' group by CourseName
-- 13.3 在統(tǒng)計之后加上having 最低分>=70
select CourseName,min(skillScore) from StudentScore where CourseName!='C# 入門編程' group by CourseName having min(skillScore)>70
--14.查詢每門課程學習的人數(shù)大于等于2人的課程名稱與學習人數(shù)。
select CourseName,count(stuId) from StudentScore group by CourseName having count(stuId)>=2
-- 15.查詢不只學了一門課程的學生編號與學習的課程數(shù)
-- 翻譯成人話:每個學生學習的課程數(shù),并且學習的數(shù)量大于1
select stuId,count(CourseName) from StudentScore group by stuId having count(CourseName)>1
5.作業(yè)
創(chuàng)建數(shù)據(jù)庫Education_DB,創(chuàng)建表(根據(jù)說明創(chuàng)建符合規(guī)范的表),如圖所示:
課程表:
用戶選課表:
需求描述:
創(chuàng)建兩張表并添加約束。每張表添加5條數(shù)據(jù)。查詢用戶選課信息表的前3條數(shù)據(jù)。查詢用戶選課信息表中年齡大于20的用戶信息。查詢用戶選課信息表中性別為女的信息 。查詢用戶選課信息表中用戶名稱、用戶性別和用戶年齡并為查詢的字段起中文別名。查詢用戶選課信息表的信息并按照年齡升序排列。查詢用戶選課信息表中所有用戶的年齡總和。查詢用戶選課信息表中所有用戶的最小年齡。查詢用戶選課信息表中所有用戶的最大年齡 。查詢用戶選課信息表中所有用戶的平均年齡。查詢用戶選課信息表中一共有多少條數(shù)據(jù) 。查詢姓李的用戶信息。查詢姓張的兩個字的用戶信息。查詢每個課程有多少人選擇 。查詢大于平均年齡的用戶信息 。查詢大于平均年齡的前2條信息。查詢學習C#課程的人數(shù)。
答案示例(不唯一):
--2.每張表添加5條數(shù)據(jù)
insert into Course(CourseName) values ('語文');
insert into Course(CourseName) values ('數(shù)學');
insert into Course(CourseName) values ('英語');
insert into Course(CourseName) values ('物理');
insert into Course(CourseName) values ('化學');
insert into Course(CourseName) values ('操作系統(tǒng)');
insert into Course(CourseName) values ('數(shù)據(jù)結(jié)構(gòu)');
insert into Course(CourseName) values ('語文');
insert into Customer(Customer_Name,Customer_Sex,Customer_Age,Customer_Phone,Customer_Address,CourseId) values('鋼鐵俠','男','21','111111','NewYork','1');
insert into Customer(Customer_Name,Customer_Sex,Customer_Age,Customer_Phone,Customer_Address,CourseId) values('蜘蛛俠','男','18','222222','London','2');
insert into Customer(Customer_Name,Customer_Sex,Customer_Age,Customer_Phone,Customer_Address,CourseId) values('綠巨人','男','30','333333','NewYork','3');
insert into Customer(Customer_Name,Customer_Sex,Customer_Age,Customer_Phone,Customer_Address,CourseId) values('緋紅女巫','女','24','444444','California','4');
insert into Customer(Customer_Name,Customer_Sex,Customer_Age,Customer_Phone,Customer_Address,CourseId) values('黑寡婦','女','23','555555','Los Angeles','5');
insert into Customer(Customer_Name,Customer_Sex,Customer_Age,Customer_Phone,Customer_Address,CourseId) values('張大中','女','24','444444','California','6');
insert into Customer(Customer_Name,Customer_Sex,Customer_Age,Customer_Phone,Customer_Address,CourseId) values('張三','女','23','555555','Los Angeles','7');
insert into Customer(Customer_Name,Customer_Sex,Customer_Age,Customer_Phone,Customer_Address,CourseId) values('王五','男','29','666666','Los Angeles','1');
--3.查詢用戶選課信息表的前3條數(shù)據(jù)
select top 3 * from Customer;
--4.查詢用戶選課信息表中年齡大于20的用戶信息
select * from Customer where Customer_Age>20;
--5.查詢用戶選課信息表中性別為女的信息
select *from Customer where Customer_Sex='女';
--6.查詢用戶選課信息表中用戶名稱、用戶性別和用戶年齡并為查詢的字段起中文別名
select Customer_Name as 名字,Customer_Sex as 性別,Customer_Age as 年齡 from Customer;
--7.查詢用戶選課信息表的信息并按照年齡升序排列
select *from Customer order by Customer_Age;
--8.查詢用戶選課信息表中所有用戶的最小年齡
select min(Customer_Age) from Customer;
--9.查詢用戶選課信息表中所有用戶的最大年齡
select max(Customer_Age) from Customer;
--10.查詢用戶選課信息表中所有用戶的平均年齡
select avg(Customer_Age) from Customer;
--11.查詢用戶選課信息表中一共有多少條數(shù)據(jù)
select count(Customer_Age) from Customer;
--12.查詢姓李的用戶信息
select *from Customer where Customer_Sex like '李';
--13.查詢姓張的兩個字的用戶信息
select *from Customer where Customer_Name like '張_';
--14.查詢每個課程有多少人選擇
select count(Customer_Name) from Customer group by CourseId;
--15.查詢大于平均年齡的前2條信息
select top 2 * from Customer where Customer_Age >(select avg(Customer_Age) from Customer);
--16.查詢學習語文課程的人數(shù)
select *from Customer where CourseId in
(
select CourseId from Course where CourseName='語文'
)
8.嵌套查詢
ClassInfo: StudentInfo: StudentScore:
--1.查詢軟件技術(shù)1班的所有學生信息
--思路:--分析可得:這需要綜合查詢2張表格,那么就要通過外鍵來連接2張表格進行綜合查詢
--1.找表:學生表,班級表,外鍵:ClassId
--2.根據(jù)已經(jīng)條件查詢外鍵的值
--3.根據(jù)外鍵的值查詢出題目的所有要求
select *from StudentInfo where ClassId=
(
select Id from ClassInfo where Name='軟件技術(shù)1班'
);
--2.查詢?nèi)挝倚型瑢W的所有成績
--思路:
--1.找外鍵 stuId
--2.根據(jù)已經(jīng)條件查詢外鍵的值
--3.根據(jù)外鍵的值查詢出題目要求的成績信息
select * from StudentScore where stuId=
(
select stuId from StudentInfo where stuName='任我行'
);
--3.查詢'張三'同學所在班級信息
select *from ClassInfo where Id=
(
select ClassId from StudentInfo where stuName='張三'
)
--4.查詢學號為'180325011'的同學所在班級所有男生的信息
select *from StudentInfo where ClassId=
(
select ClassId from StudentInfo where stuId='180325011'
) and stuSex='男';
--5.查詢班級名為“軟件技術(shù)1班”一共有多少個女生信息
select * from StudentInfo where ClassId=
(
select ClassId from ClassInfo where Name='軟件技術(shù)1班'
) and stuSex='女';
--6.查詢電話號為“18899251152”同學所在的班級信息
select * from ClassInfo where Id=
(
select ClassId from StudentInfo where stuPhone='18899251152'
);
--7.查詢所有成績高于平均分的學生信息
select * from StudentInfo where stuId in
(
-- 查詢出高于平均分的Stuid
select stuId from StudentScore where skillScore>=
(
select AVG(skillScore) from StudentScore
)
);
--8.查詢所有年齡小于平均年齡的學生信息
select * from StudentInfo where (year(getdate())-year(stuBirthday))<
(
-- 計算平均年齡
select avg(year(getdate())-year(stuBirthday)) from StudentInfo
);
--9.查詢不是軟件技術(shù)1班級的學生信息
--寫法1:
select * from StudentInfo where ClassId not in
(
select Id from ClassInfo where Name='軟件技術(shù)1班'
);
--寫法2:
select * from StudentInfo where ClassId !=
(
select Id from ClassInfo where Name='軟件技術(shù)1班'
);
--10.查詢所有班級人數(shù)高于平均人數(shù)的班級信息
-- 每個班有多少人
select * from ClassInfo where Id in
(
select ClassId from StudentInfo group by ClassId having count(stuId)>
(
-- 求平均人數(shù)
select avg(人數(shù))from
(
select count(stuId) as 人數(shù) from StudentInfo group by ClassId
) aa
)
);
--11.查詢成績最高的學生信息
select * from StudentInfo where stuId in
(
select stuId from StudentScore where skillScore =
(
select MAX(skillScore) from StudentScore
)
);
--12.查詢班級名是“會計1班”所有學生(使用in 關(guān)鍵字查詢)
select * from StudentInfo where ClassId in
(
select Id from ClassInfo where Name='會計1班'
);
--13.查詢年齡是16、18、21歲的學生信息
select * from StudentInfo where (year(getdate())-year(stuBirthday)) in (16,18,21);
--14.查詢所有17-20歲且成績高于平均分的女生信息
select * from StudentInfo where (year(getdate())-year(stuBirthday)) between 17 and 20 and stuSex='女' and stuId in
(
select stuId from StudentScore where skillScore>
(
select avg(skillScore) from StudentScore
)
);
--15.查詢不包括'張三'、'王明'、'肖義'的所有學生信息(not in 關(guān)鍵字查詢)
select * from StudentInfo where stuName not in('張三','王明','肖義')
--16.查詢不是“計算機系”學院的所有學生(not in 關(guān)鍵字查詢)
select * from StudentInfo where ClassId not in
(
select Id from ClassInfo where College='計算機系'
);
--17.-查詢成績比學生編號為'180325011','180325012'其中一位高的同學
-- any,some:某一個,其中一個
select * from StudentInfo where stuId in
(
select stuId from StudentScore where skillScore> some
(
select skillScore from StudentScore where stuId in('180325011','180325012')
)
);
--18.查詢成績比學生編號為'180325011','180325012'都高的同學(all)
-- all:所有
select * from StudentInfo where stuId in
(
select stuId from StudentScore where skillScore> all
(
select skillScore from StudentScore where stuId in('180325011','180325012')
)
);
--19.-Row_Number() Over(Order by 字段):按某個字段進行編號排名
-- 以stuId進行升序排名
select Row_Number() Over(Order by stuId) ,* from StudentInfo
--20.按總成績降序排序并給每一位同學進行編號
select Row_Number() Over(Order by skillScore desc) as 排名, * from StudentScore
--21.按總成績降序排序后查詢4-8名的學生信息
select * from
(
select Row_Number() Over(Order by (skillScore+theoryScore) desc) as 排名, * from StudentScore
)
aa where aa.排名 between 4 and 8;
--22.sqlserver 2012以后,offset rows fetch next rows only用于從有序的結(jié)果集中,跳過一定數(shù)量的數(shù)據(jù)行,獲取指定數(shù)量的數(shù)據(jù)行,從而達到數(shù)據(jù)行分頁的目的
-- offset:在。。。位置
select * from StudentScore order by (skillScore+theoryScore) desc offset 3 rows fetch next 5 rows only;
--23.獲取按Id排序后的第3-5位同學信息
select * from
(
select Row_Number() Over(Order by StuId) as 排名, * from StudentScore
)
aa where aa.排名 between 3 and 5;
--24.
select * from StudentScore order by Id offset 2 rows fetch next 3 rows only;
9.連接查詢
連接查詢就是把多張表連接成一張表。
其實連接查詢和上面學習過的嵌套查詢,都屬于共同查詢多個表。但是,嵌套查詢用的并不是很多,而且也不簡單(但是嵌套查詢也要會。)。連接查詢也是很重要的一個知識點。
內(nèi)連接會把兩表中匹配上的數(shù)據(jù)進行連接顯示,注意是匹配上的數(shù)據(jù),如果匹配不上就不會顯示。
1.連接查詢的分類
內(nèi)連接。外連接(左外連接,右外連接,全連接)。自連接。交差連接(用處不大,暫時不學)。
2.內(nèi)連接
1.簡介
以下為2張表的結(jié)構(gòu):
語法格式:select 字段列表 from 表1 inner join 表2 on 表1.外鍵=表2.外鍵。
注意:
Join 與 inner join等效(默認為內(nèi)連接)。inner join:內(nèi)連接。on:當…時。在使用連接時,盡量避免使用 * 獲取字段。
代碼示例:
--2.查詢部門編號、部門名
select Id,DName from Dept;
--3.查詢員工姓名,薪資
select * from Emp;
--4.查詢員工姓名,薪資,所在部門
select *from Emp inner join Dept on Emp.Did=Dept.Id;
--5.查詢分配了部門的員工信息和相應的部門信息(內(nèi)連接)
select a.*,b.DName from Emp a join Dept b on a.Did=b.Id; --這里分別對2張表格取了別名
2.等值內(nèi)連接
條件是等量關(guān)系。
select * from 表1 (inner) join 表2 on 表1的主鍵列 = 表2的外鍵列
注:表1是主鍵表,表2是外鍵表
仍然以上文中嵌套查詢中的3張表為例:
use step2;
-- 1.查詢出分配了班級的學生和班級信息
select a.*,b.Name,b.College from StudentInfo a inner join ClassInfo b on a.ClassId=b.Id;
-- 2.查詢出軟件技術(shù)1班的學生和班級信息
select a.*,b.Name,b.College from StudentInfo a inner join ClassInfo b on a.ClassId=b.Id where b.Name='軟件技術(shù)1班'
-- 3.查詢分配了班級,年齡又在20歲以上的學生和班級信息
select a.*,b.Name,b.College from StudentInfo a inner join ClassInfo b on a.ClassId=b.Id where (year(getdate())-year(stuBirthday))>20;
-- 4.查詢分配了班級,年齡又在20-24之間的學生和班級信息
select a.*,b.Name,b.College from StudentInfo a inner join ClassInfo b on a.ClassId=b.Id where (year(getdate())-year(stuBirthday)) between 20 and 24;
-- 5.查詢沒有學生的班級名稱
-- 如果這個班有學生,是不是一定會在學生中有classId
-- 如果說在學生表中沒有出現(xiàn)的classId,是不是就表示 那個班沒有學生呢?
select Name from ClassInfo where id not in
(
select classId from StudentInfo
);
-- 6.查詢分配了班級,性別又為女的學生和班級信息
select stuName,stuBirthday,Name,College from StudentInfo a inner join ClassInfo b on a.ClassId=b.Id where stuSex='女';
3.不等連接
連接條件中的關(guān)系是非等量關(guān)系,就是使用除(=)以外的比較運算符查詢的內(nèi)連接, 如:>,>=,<=,<,!>,!<,<> ,!=。
-- 1.每位同學除了自己所屬的班級外查詢出其余可選擇的班級
select * from StudentInfo a join ClassInfo b on a.ClassId!=b.Id;
-- 2.查詢其他同學的成績
select * from StudentInfo a join StudentScore b on a.stuId!=b.stuId;
3.自連接
一張表看做兩張表,自己連自己。
create table menu
(
Id int primary key identity,
Name varchar(30), -- 菜單名稱
ParentId int -- 上級菜單
) ;
insert into menu values('商品管理',0),('系統(tǒng)管理',0),('訂單管理',0) ;
insert into menu values('商品列表',1),('商品分類',1),('發(fā)布商品',1) ;
insert into menu values('權(quán)限管理',2),('用戶管理',2),('角色管理',2) ;
insert into menu values('訂單列表',3),('運費模板',3),('物流跟蹤',3) ;
-- 查詢所有菜單信息以及它的上級菜單名稱
-- 自連接一定要取別名
select a.*,b.Name from menu a inner join menu b on a.ParentId=b.Id;
4.外連接
外連接是以一張表為基表,返回基表中所有記錄及連接表中 符合條件的記錄的連接查詢。外連接分為以下3種:
左外連接 。右外連接 。全外連接。
1.左外連接
是以左表為基表,返回左表中所有記錄及連接表中符合條件的記錄的外連接:
以左表為基表 。返回左表中所有數(shù)據(jù)。連接表不符合條件以NULL填充。
數(shù)據(jù)庫表仍以上文中嵌套查詢表為例:
use step2;
-- 1.查詢所有學生信息以及對應的班級信息(要求顯示學生編號,學生姓名,班級編號,班級名稱)
-- 左外連接:left outer join
select * from StudentInfo a left outer join ClassInfo b on a.ClassId =b.Id;
-- 左連接:以左表主表,不管是否匹配上,都會把左表中的數(shù)據(jù)都顯示出來,未匹配的數(shù)據(jù)會以NULL進行填充
2.右外連接
是以右表為基表,返回右表中所有記錄及連接表中符合條件的記錄的外連接:
以右表為基表 。返回右表中所有數(shù)據(jù) 。連接表不符合條件以NULL填充。
-- 1.查詢所有班級信息以及對應的學生信息(要求顯示學生編號,學生姓名,班級編號,班級名稱)
select * from StudentInfo a right outer join ClassInfo b on a.ClassId=b.Id;
-- 右連接:以右表為主表,不管是否匹配上,都會把右表中的數(shù)據(jù)都顯示出來,未匹配上的數(shù)據(jù)會以NULL進行填充
3.全外連接
是分別以左右表為基表的外連接:
將左表和右表所有的記錄都顯示。連接表不符合條件以NULL填。
-- 1.查詢所有學生信息以及所有班級信息(要求顯示學生編號,學生姓名,班級編號,班級名稱)
-- 全連接:full join,不管是否有沒有匹配上,都會顯示
select * from StudentInfo a full outer join ClassInfo b on a.ClassId=b.Id
5.聯(lián)合查詢
連接查詢可以理解為把多張表的數(shù)據(jù)綜合橫著顯示。 而聯(lián)合查詢可以理解為把多張表的數(shù)據(jù)豎著綜合顯示。
create table course1
(
Id int primary key,
Name varchar(30)
);
create table course2
(
Id int primary key,
Name varchar(30)
);
insert into course1 values(1,'c#'),(2,'sql'),(3,'.net core'),(4,'mysql');
insert into course2 values(1,'c#'),(2,'sql'),(3,'asp.net core'),
(4,'docker');
select *from course1;
select *from course2;
如圖,2張表數(shù)據(jù)分別為: 現(xiàn)在通過聯(lián)合查詢將2個表的數(shù)據(jù)合并在一起(相當于豎著堆疊在一起): 以下為操作語句:
select *from course1
union all
select *from course2
執(zhí)行結(jié)果:
6.作業(yè)
Students(學生表):
Teachers(老師表):
Courses(課程表):
Scores(成績表):
開發(fā)要求:
使用SSMS或SQL語句創(chuàng)建數(shù)據(jù)庫。按數(shù)據(jù)字典要求創(chuàng)建表結(jié)構(gòu)。分別給各表按照下列語句添加數(shù)據(jù):
--1.向表Students中添加數(shù)據(jù)
insert into Students values('馮程',20,0)
insert into Students values('許文強',18,1)
insert into Students values('凌凌七',19,0)
insert into Students values('莫向南',22,1)
insert into Students values('路寶妮',25,0)
insert into Students values('鳳凰',16,1)
--2.向表Teachers中添加數(shù)據(jù)
insert into Teachers values('梁冰','112')
insert into Teachers values('李劍','113')
insert into Teachers values('耿彬彬','001')
insert into Teachers values('劉龍飛','002')
insert into Teachers values('吳慧敏','116')
insert into Teachers values('張靜敏','068')
insert into Teachers values('劉澤飛','167')
insert into Teachers values('項天佑','153')
--3.向表Courses中添加數(shù)據(jù)
insert into Courses values('C#入站編程',3)
insert into Courses values('SQL Server',3)
insert into Courses values('ASP.NET Core',5)
insert into Courses values('前端入門',6)
insert into Courses values('ASP.NET WebApi',8)
insert into Courses values('Linux虛擬化技術(shù)',1)
insert into Courses values('MySQL',1)
--4.向表Scores中添加數(shù)據(jù)
insert into Scores values(100,6,1)
insert into Scores values(90,3,1)
insert into Scores values(100,3,2)
insert into Scores values(99,3,3)
insert into Scores values(95,3,4)
insert into Scores values(90,3,5)
insert into Scores values(91,3,6)
insert into Scores values(89,3,7)
insert into Scores values(100,1,3)
insert into Scores values(70,1,4)
insert into Scores values(100,2,3)
insert into Scores values(80,2,1)
insert into Scores values(90,2,2)
4. 使用SQL語句查詢?nèi)缦拢?/p>
查詢學生表中的前5條記錄并按照年齡進行降序排序,顯示字段為中文:學號,姓名,年齡,性別。查詢姓“李”的老師的個數(shù)。查詢學生表中年齡大于16歲的男生信息。統(tǒng)計每個教師所教的課程數(shù)量,顯示字段包括老師編號,課程數(shù)量。查詢“梁冰”老師所教課程的信息。查詢成績最高的學生編號及學生姓名。按成績進行降序排序,查詢第6名到第10名的成績信息。按學生編號分組,查詢平均成績大于90分的同學的學生編號和平均成績。查詢所有的課程信息及對應的老師信息,顯示字段包含課程編號、課程名稱、老師編號、老師姓 名。查詢學過“耿彬彬”老師所教課程的同學的學號、姓名。每行SQL語句添加注釋。
代碼:
--1.查詢學生表中的前5條記錄并按照年齡進行降序排序,顯示字段為中文:學號,姓名,年齡
select Id 學號,Name 姓名,Age 年齡,Sex 性別 from Students order by Age desc;
--2.查詢姓“李”的老師的個數(shù)
select * from Teachers where Name like '李%';
--3.查詢學生表中年齡大于16歲的男生信息
select *from Students where Age>=16 and Sex=1;
--4.統(tǒng)計每個教師所教的課程數(shù)量,顯示字段包括老師編號,課程數(shù)量
柚子快報激活碼778899分享:SqlServer基礎(chǔ)學習筆記
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。