日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL server 中SQL语句实战操作

發布時間:2025/3/20 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL server 中SQL语句实战操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習網址鏈接:
https://www.w3school.com.cn/sql/sql_top.asp
學習案例鏈接:
https://wenku.baidu.com/view/720053b459fb770bf78a6529647d27284b73378e.html
寫在前面:
最近在學習sql語句之余想把自己遇到的一些坑做個記錄,當然更希望和大家一起交流學習,本篇博文在自己的學習過程中我會持續更新,有寫的不對的地方也希望大家給我留言或者來郵來電(longchengforever@163.com)。:

【select語句】

  • select嵌套
  • List item
    :temp臨時表
    Select * From (Select 字段 From 表) As temp
  • eg1:

    SELECT Production AS '11時產量' FROM (SELECT Production=( select max(Production) from dbo.[注塑車間8號設備生產信息統計]Where Date BETWEEN '2019-09-11 11:00:00' and '2019-09-11 11:59:59') ) AS temp 說明:(SELECT Production=( select max(Production) from dbo.[注塑車間8號設備生產信息統計]Where Date BETWEEN '2019-09-11 11:00:00' and '2019-09-11 11:59:59') ) 將生成結果作為臨時表 (AS temp )

    eg2:
    數據源:

    select * from dbo.[時段產量] where (dbo.[時段產量].OK = (select min(OK) from (SELECT 時間, OK FROM dbo.[8time] where [時間] BETWEEN ‘2019/10/21 15:00:00’ AND ‘2019/10/21 15:59:59’)as a))

    【行列關系轉化】

    • 1,行轉列,列轉行
      step1:測試數據準備
    CREATE TABLE [StudentScores] ([UserName] NVARCHAR(20), --學生姓名[Subject] NVARCHAR(30), --科目[Score] FLOAT, --成績 )INSERT INTO [StudentScores] SELECT '張三', '語文', 80 INSERT INTO [StudentScores] SELECT '張三', '數學', 90 INSERT INTO [StudentScores] SELECT '張三', '英語', 70 INSERT INTO [StudentScores] SELECT '張三', '生物', 85 INSERT INTO [StudentScores] SELECT '李四', '語文', 80 INSERT INTO [StudentScores] SELECT '李四', '數學', 92 INSERT INTO [StudentScores] SELECT '李四', '英語', 76 INSERT INTO [StudentScores] SELECT '李四', '生物', 88 INSERT INTO [StudentScores] SELECT '碼農', '語文', 60 INSERT INTO [StudentScores] SELECT '碼農', '數學', 82 INSERT INTO [StudentScores] SELECT '碼農', '英語', 96 INSERT INTO [StudentScores] SELECT '碼農', '生物', 78


    step2:行轉列sql

    eg1

    SELECT * FROM [StudentScores] /*數據源*/ AS P PIVOT (SUM(Score/*行轉列后 列的值*/) FOR p.Subject/*需要行轉列的列*/ IN ([語文],[數學],[英語],[生物]/*列的值*/) ) AS T

    eg2
    數據源:
    表名:8號機分時產量

    Excude Code:

    step3:測試數據準備

    CREATE TABLE ProgrectDetail (ProgrectName NVARCHAR(20), --工程名稱OverseaSupply INT, --海外供應商供給數量NativeSupply INT, --國內供應商供給數量SouthSupply INT, --南方供應商供給數量NorthSupply INT --北方供應商供給數量 )INSERT INTO ProgrectDetail SELECT 'A', 100, 200, 50, 50 UNION ALL SELECT 'B', 200, 300, 150, 150 UNION ALL SELECT 'C', 159, 400, 20, 320 UNION ALL

    step4:

    SELECT P.ProgrectName,P.Supplier,P.SupplyNum FROM (SELECT ProgrectName, OverseaSupply, NativeSupply,SouthSupply, NorthSupplyFROM ProgrectDetail )T UNPIVOT (SupplyNum FOR Supplier IN(OverseaSupply, NativeSupply, SouthSupply, NorthSupply ) ) P

    【2】

    select * from [11點] union all select * from [12點]

    【指定行列的數據選取】

    • SQL TOP 子句:

    TOP 子句
    TOP 子句用于規定要返回的記錄的數目。對于擁有數千條記錄的大型表來說,TOP 子句是非常有用的。
    (PS:并非所有的數據庫系統都支持 TOP 子句。)

    SQL Server 的語法:

    SELECT TOP number|percent column_name(s) FROM table_name

    MySQL 和 Oracle 中的 SQL SELECT TOP 是等價的
    MySQL 語法

    SELECT column_name(s) FROM table_name LIMIT number

    例子

    SELECT * FROM Persons LIMIT 5

    Oracle 語法

    SELECT column_name(s) FROM table_name WHERE ROWNUM <= number

    例子

    SELECT * FROM Persons WHERE ROWNUM <= 5

    情況一:

    選取前50條記錄

    SELECT TOP 50 * FROM table_name

    選取table中某些列的前50條

    SELECT TOP 50 column_name(s) FROM table_name

    情況二:

    選取第50行

    方法1

    SELECT no=Identity(int,1,1),* INTO temptable FROM table_name SELECT * FROM temptable WHERE no=15 DROP TABLE temptable

    利用identity函數生成記錄序號,和原表數據保存到臨時表temptable中;
    用完刪除臨時表temptable。

    方法2

    SELECT TOP 1 * FROM (SELECT TOP 50 * FROM table_name ORDER BY colnum_name DESC) AS f

    方法3

    SELECT TOP 1 * FROM table_name WHERE column_name NOT IN (SELECT TOP 49 column_name FROM table_name)

    eg:

    select top 1 * from dbo.[8號機分時產量匯總] where 分時產量 not in (select top 5 分時產量 from dbo.[8號機分時產量匯總])

    results:

    情況3

    選擇50到99行數據

    SELECT no=Identity(int,1,1),* INTO temptable FROM table_name SELECT * FROM temptable WHERE no>=50 AND no<100 DROP TABLE temptable

    情況4
    選擇前50%數據

    SELECT TOP 50 PERCENT * FROM table_name

    情況5

    選擇首/尾行數據
    方法一: 使用TOP(SQL server)

    SELECT TOP 1 * FROM user; SELECT TOP 1 * FROM user order by id desc;

    eg:
    source data:

    執行語句:

    select top 1 * from dbo.[8號機分時產量匯總] where 分時產量 not in (select top 1 分時產量 from dbo.[8號機分時產量匯總]) --獲取第一行數據union allselect top 1 * from dbo.[8號機分時產量匯總] where 分時產量 in (select top 1 分時產量 from dbo.[8號機分時產量匯總]) --獲取第二行數據

    結果:

    方法二: 使用LIMIT(MySQL)

    SELECT * FROM user LIMIT 1; SELECT * FROM user ORDER BY id ASC LIMIT 1; SELECT * FROM user ORDER BY id DESC LIMIT 1;

    【排序問題】

    • ORDER BY 語句

    ORDER BY 語句用于根據指定的列對結果集進行排序。ORDER BY 語句默認按照升序對記錄進行排序。如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字。


    實例 1
    以字母順序顯示公司名稱:

    SELECT Company, OrderNumber FROM Orders ORDER BY Company

    加載連接:https://www.w3school.com.cn/sql/sql_orderby.asp

    【視圖操作】

    • 視圖檢測
      eg1:
    IF NOT EXISTS(SELECT 1 FROM sys.views WHERE name='視圖名稱') BEGIN create view 視圖名稱 as SELECT...FROM... END

    會提示以下錯誤:

    Msg 156, Level 15, State 1, Line 4 Incorrect syntax near the keyword 'view'.

    出現這個錯誤的原因是:create view 這一句必須是批處理中的第一句。
    所以可以將該語句修改為:

    IF EXISTS(SELECT 1 FROM sys.views WHERE name='視圖名稱') DROP VIEW 視圖名稱 GO create view 視圖名稱 as SELECT ... FROM (...) INNER JOIN Content ON ...=... GO

    eg2:

    USE [DBname] GO IF EXISTS (SELECT * FROM sysobjects WHERE name ='視圖名稱')DROP VIEW view名稱 GOCREATE VIEW view名稱ASSELECT 。。。FROM 。。。INNER JOIN 。。。
    • table/view新增自增ID列
    create view v_test as select row_number() over (order by getdate()) as ID,* from 表名

    eg:原始數據

    Execute code:

    select row_number() over (order by getdate()) as ID,* from dbo.[8號機分時產量匯總]

    Results:

    【字符串操作】

    • 說明:

    /****** Sql Server中截取字符串的常用方法 ******/

    TESTCODESTRING=‘01378a77517a41e982b14cc97b1f8794’
    –1、LEFT()方法—(能夠實現和RIGHT()嵌套)
    –函數說明—
    –1)語法:LEFT(character,integer)
    –2)介紹:參數1:要截取的字符串,參數2:截取字符個數
    –3)使用:
    –返回從字符串左邊開始指定個數的字符–
    select LEFT(TESTCODESTRING,4) 返回左邊前4個字符
    –4)返回: 0137

    –2、RIGHT()方法—
    – right()函數說明—
    –1)語法:RIGHT(character,integer)
    –2)介紹:參數1:要截取的字符串,參數2:截取字符個數
    –3)使用:
    –返回從字符串右邊開始指定個數的字符–
    select RIGHT(TESTCODESTRING,4) 返回右邊后4個字符
    –4)返回: 8794

    –3、SUBSTRING()方法—
    – substring()函數說明—
    –1)語法:SUBSTRING(character,start,length)
    –2)介紹:參數1:要截取的字符串,參數2:開始截取的下標,參數3:截取的字符長度
    –3)使用:
    –返回從字符串中間的字符–
    select SUBSTRING(TESTCODESTRING,4,8) 從左邊第4個字符開始取長度為8的子串
    –4)返回: 78a77517
    –4、re.sub()方法—

    re.sub(pattern,repl,string,count=0,flags=0)

    在字符串 string 中找到匹配正則表達式 pattern 的所有子串,
    用另一個字符串 repl 進行替換。
    如果沒有找到匹配 pattern 的串,則返回未被修改的 string。Repl 既可以是字符串也可以是一個函數。

    eg:

    v = str(sh.cell_value(a, 0))v0 = int(re.sub('\D', '', v)) # 在'100abc'這個字符串中找到非數字的字符(正則表達式中'\D'表示非數字),并用""替換,然后返回的就是只剩下數字的字符串

    具體操作指令:

    SELECT TESTCODESTRING,LEFT(TESTCODESTRING,4) FROM TestTable WHERE PSCODE='33030011111103'結果為: TESTCODESTRING,(無列名) 01378a77517a41e982b14cc97b1f8794,0137SELECT TESTCODESTRING,RIGHT(TESTCODESTRING,4) FROM TestTable WHERE PSCODE='33030011111103'結果為: TESTCODESTRING,(無列名) 01378a77517a41e982b14cc97b1f8794,8794SELECT TESTCODESTRING,SUBSTRING(TESTCODESTRING,4,8) FROM TestTable WHERE PSCODE='33030011111103'結果為: TESTCODESTRING,(無列名)

    eg:
    數據源:

    select RIGHT((select top 1 * from dbo.[8號機時段工作時長] where PeridTime in (select top 1 PeridTime from dbo.[8號機時段工作時長])),5) /* 說明1: (select RIGHT((select top 1 * from dbo.[8號機時段工作時長] where PeridTime in (select top 1 PeridTime from dbo.[8號機時段工作時長])),5)) **截取字符串右邊5位** 說明2: select LEFT(pam,2) **截取字符串左邊2位** 說明3: AS TIMER **命名列***/

    【SQL Server基本操作】
    1、在SQL SERVER 2008上附加teaching數據庫,其中三張表的含義解釋如下:
    學生表dbo.student有屬性sno、sname、spec、birthday、email、sex、scholarship,分別代表學號、姓名、專業、生日、電子郵箱、性別、獎學金;
    課程表dbo.course有屬性cno、cname、credit、teacher,分別代表課號、課程名、學分、任課教師;
    選課表dbo.student_course有屬性sno、cno、grade,分別代表學號、課號、成績。
    2、在teaching數據庫中創建下列視圖:
    (1)將學生的學號、姓名及他的平均成績定義為一個視圖V1;
    (2)由(1)建立的視圖是否可更新?請說明理由;
    (3)將沒有一門課程成績在80分以下的所有學生的信息(包括學號、姓名和專業)定義為一個視圖V3;
    (4)將獲得獎學金(獎學金不為0)的同學的獎學金數量變為原來的2倍,并將這些學生的信息定義為一個視圖V4;
    (5)將學生成績得過滿分(100分)的課程(包括課號、課程名和學分)定義為一個視圖V5;
    (6)將三張表student、student_course、dbo.course連接操作定義為一個視圖V6,并根據此視圖來查詢選修了’數據庫技術與設計’課程的所有學生的學號、姓名和成績,并按成績的降序排列。
    3、在teaching數據庫中創建用戶定義函數:
    (1)求圓面積用戶定義函數的創建
    (2)求圓面積用戶定義函數的調用
    (3)求圓面積用戶定義函數的刪除
    原文鏈接:https://blog.csdn.net/j_anson/article/details/51456249
    codes:

    --2 --2.1將學生的學號、姓名及他的平均成績定義為一個視圖V1 use teaching gocreate view v1(sno,sname,avg_grade) as select s.sno,s.sname,avg(sc.grade) from student s,student_course sc where s.sno=sc.sno group by s.sno,s.sname go--2.2 --v1視圖不可更新,僅行列子集視圖可更新--2.3 --將沒有一門課程成績在80分以下的所有學生的信息(包括學號、姓名和專業)定義為一個視圖V3 use teaching gocreate view v3(sno,sname,spec,grade) as select s.sno,s.sname,s.spec,sc.grade from student s,student_course sc where s.sno=sc.sno group by s.sno,s.sname,s.spec,sc.grade having not exists (select student_course.grade from student_course where student_course.grade<80) go--2.4 --將獲得獎學金(獎學金不為0)的同學的獎學金數量變為原來的2倍,并將這些學生的信息定義為一個視圖V4 --創建 use teaching gocreate view v4(sno,sname,scholarship) as select s.sno,s.sname,s.scholarship*2 from student s where s.scholarship>0 go--2.5 --將學生成績得過滿分(100分)的課程(包括課號、課程名和學分)定義為一個視圖V5 use teaching gocreate view v5(sno,cno,cname,credit) as select sc.sno,c.cno,c.cname,c.credit from student s,student_course sc,course c where s.sno=sc.sno and sc.cno=c.cno and sc.grade=100 go--2.6 --將三張表student、student_course、dbo.course連接操作定義為一個視圖V6, --并根據此視圖來查詢選修了’數據庫技術與設計’課程的所有學生的學號、姓名和成績,并按成績的降序排列 use teaching gocreate view v6(sno,sname,grade,cno,cname) as select s.sno,s.sname,sc.grade,c.cno,c.cname from student s,student_course sc,course c where s.sno=sc.sno and sc.cno=c.cno goselect v6.sno,v6.sname,v6.grade from v6 where v6.cname='數據庫技術與設計' go --3 --函數自定義 create function Circle(@R float) returns float as begin set @R=PI()*@R*@R return @R end go--調用 select dbo.Circle(2) go--刪除 drop function Circle go

    數據庫截圖

    總結

    以上是生活随笔為你收集整理的SQL server 中SQL语句实战操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。