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嵌套
: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:測試數據準備
step2:行轉列sql
eg1
SELECT * FROM [StudentScores] /*數據源*/ AS P PIVOT (SUM(Score/*行轉列后 列的值*/) FOR p.Subject/*需要行轉列的列*/ IN ([語文],[數學],[英語],[生物]/*列的值*/) ) AS Teg2
數據源:
表名: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 ALLstep4:
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_nameMySQL 和 Oracle 中的 SQL SELECT TOP 是等價的
MySQL 語法
例子
SELECT * FROM Persons LIMIT 5Oracle 語法
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:
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%數據
情況5
選擇首/尾行數據
方法一: 使用TOP(SQL server)
eg:
source data:
執行語句:
結果:
方法二: 使用LIMIT(MySQL)
【排序問題】
- ORDER BY 語句
ORDER BY 語句用于根據指定的列對結果集進行排序。ORDER BY 語句默認按照升序對記錄進行排序。如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字。
實例 1
以字母順序顯示公司名稱:
加載連接:https://www.w3school.com.cn/sql/sql_orderby.asp
【視圖操作】
- 視圖檢測
eg1:
會提示以下錯誤:
Msg 156, Level 15, State 1, Line 4 Incorrect syntax near the keyword 'view'.出現這個錯誤的原因是:create view 這一句必須是批處理中的第一句。
所以可以將該語句修改為:
eg2:
USE [DBname] GO IF EXISTS (SELECT * FROM sysobjects WHERE name ='視圖名稱')DROP VIEW view名稱 GOCREATE VIEW view名稱ASSELECT 。。。FROM 。。。INNER JOIN 。。。- table/view新增自增ID列
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:
具體操作指令:
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:
數據源:
【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:
數據庫截圖:
總結
以上是生活随笔為你收集整理的SQL server 中SQL语句实战操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯云yum操作实现CentOS 7.6
- 下一篇: SQL SERVER while循环