SQL Server 요약 복습(2)
--
SELECT * FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid
WHERE scorename = ' '
-------------------------------------------
--ROW_NUMBER() 1
-------------------------------------------
SELECT ROW_NUMBER() OVER (ORDER BY B.SCORE DESC) AS ROWNUMBER ,A.NAME, B.SCORE, a.Id
FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid
WHERE scorename = ' '
-- order by, ( )
SELECT ROW_NUMBER() OVER (ORDER BY B.SCORE DESC) AS ROWNUMBER ,A.NAME, B.SCORE, a.Id
FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid
WHERE scorename = ' ' ORDER BY a.Id
-- , , cte , row_number
WITH b AS
(
SELECT stuid, SUM(score) AS score FROM ScoreTB GROUP BY stuid
)
SELECT * ,ROW_NUMBER() OVER (ORDER BY b.score desc) AS rownumer
FROM dbo.student AS a INNER JOIN b ON a.id = b.stuid
----------------------------------------------------------------------------
--RANK() ROW_NUMER , order by , ,
-- , 1, 4,
----------------------------------------------------------------------------
----------------------------------------------------------------------------
--DENSE_RANK() ROW_NUMER、RANK , , rank
-- , 1, 2,
----------------------------------------------------------------------------
----------------------------------------------------------------------------
--ntile 。 , 。
-- ( 1 )。 “ ”。
-- , ,
----------------------------------------------------------------------------
SELECT ntile(2) OVER (ORDER BY B.SCORE DESC) AS GROUPID ,A.NAME, ISNULL(B.SCORE,0) SCORE, a.Id
FROM dbo.student AS a LEFT JOIN dbo.ScoreTB AS b ON a.Id = b.stuid AND scorename = ' '
--------------------------------------------------------------------------
--PARTITION BY group by,
--------------------------------------------------------------------------
-- :
SELECT RANK() OVER (PARTITION BY b.scorename ORDER BY B.SCORE DESC) AS ROWNUMBER,b.scorename,
b.score, A.NAME, a.Id FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid ORDER BY SCORENAME
2.TOP 의 새로운 용법
DECLARE @num INT = 101
SELECT TOP (@num) * FROM Student ORDER BY Id --
SELECT TOP (@num) percent * FROM Student ORDER BY Id -- float 1-100 ,
group by all 필드/group by 필드 전 자 는 left join,right join 의 느낌 과 비슷 합 니 다.이들 의 주요 차 이 는 where 조건 이 걸 러 진 집합 함수 에 나타 나 고 다시 캡 처 하여 문의 한 데이터 시트 에 넣 습 니 다.다만 취 합 함 수 는 반환 값 의 유형 에 따라 취 합 함수 의 반환 값 을 기본 값 0 또는 NULL 로 대체 합 니 다.물론 효율 적 으로 후 자 는 전자 보다 낫다.inner join 이 left join 보다 좋 은 것 처럼 4.count(*)/count(0)와 count(필드)가 조회 한 필드 에 NULL 값 이 없다 면 두 가지 조회 조건 은 아무런 차이 가 없다.NULL 이 있 으 면 후자 가 통계 한 기록 은 총 기록 수-NULL 기록 수 는 성능 적 으로 전자 가 후자 보다 높다.후 자 는 한 줄 씩 검색 필드 에 NULL 값 이 있 는 지,NULL 이 있 으 면 통 계 를 하지 않 고 논리 적 으로 읽 는 비용 을 줄 이기 때문이다.성능 향상 5.top n With ties 의 용법 상세 참조http://www.cnblogs.com/skynet/archive/2010/03/29/1700055.html 예 를 들 어 select top 1 with ties*from student order by score desc 등 가 는 select*from student where score=(select top 1 score from student order by score desc)6.Apply 연산 자
View Code
--
CREATE TABLE [dbo].[Student](
[Id] [int] NULL,
[Name] [varchar](50) NULL
)
go
INSERT INTO dbo.Student VALUES (1, ' ')
INSERT INTO dbo.Student VALUES (2, ' ')
INSERT INTO dbo.Student VALUES (3, ' ')
INSERT INTO dbo.Student VALUES (4, ' ')
go
CREATE TABLE [dbo].[scoretb](
[stuId] [int] NULL,
[scorename] [varchar](50) NULL,
[score] INT NULL
)
go
INSERT INTO [scoretb] VALUES (1,' ',22)
INSERT INTO [scoretb] VALUES (1,' ',32)
INSERT INTO [scoretb] VALUES (1,' ',42)
INSERT INTO [scoretb] VALUES (2,' ',52)
INSERT INTO [scoretb] VALUES (2,' ',62)
INSERT INTO [scoretb] VALUES (2,' ',72)
INSERT INTO [scoretb] VALUES (3,' ',82)
INSERT INTO [scoretb] VALUES (3,' ',92)
INSERT INTO [scoretb] VALUES (3,' ',72)
--
CREATE FUNCTION [dbo].[fGetScore](@stuid int)
RETURNS @score TABLE
(
[stuId] [int] NULL,
[scorename] [varchar](50) NULL,
[score] INT NULL
)
as
BEGIN
INSERT INTO @score
SELECT stuid,scorename,score FROM dbo.scoretb WHERE stuId = @stuid
RETURN;
END
GO
--
SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
CROSS APPLY [dbo].[fGetScore](A.Id) B -- inner join
SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
OUTER APPLY [dbo].[fGetScore](A.Id) B -- left join
--
--SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
-- INNER JOIN [dbo].[fGetScore](A.Id) B ON A.Id = B.stuid
-- SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
-- INNER JOIN (SELECT * FROM [dbo].[fGetScore](A.Id)) B ON A.Id = B.stuid
7.INTERSECT 와 EXCEPT 연산부적 EXCEPT 는 excpet 키워드 만 포함 하고 왼쪽 과 오른쪽 결 과 는 존재 하지 않 는 줄 을 집중 적 으로 포함 합 니 다.INTERSECT 는 두 가지 결과 만 집중 적 으로 존재 하 는 줄 을 포함 합 니 다.흔히 EXISTS 키 워드 는 위의 키 워드 를 대체 할 수 있 고 성능 에서 그들 보다 더 좋 은 것 을 볼 수 있 지만 EXCEPT/INTERSECT 는 읽 기 쉽 고 직관 적 입 니 다.아니면 성능 이 더 좋 은 것 부터 시작 하 는 것 을 권장 합 니까?8.색인 이 조회 효율 을 향상 시 키 는 원리 색인 은 EXISTS 연산 자 와 처리 방식 이 비슷 합 니 다.이들 은 일치 하 는 값 을 찾 은 후에 바로 조회 실행 을 종료 하여 조회 성능 을 향상 시 킬 수 있 습 니 다.9.표 변 수 는 임시 표 와 주요 한 차이 점 을 나 타 냅 니 다.1 표 변 수 는 로 그 를 쓰 지 않 고 통계 메시지 가 없 으 며 잦 은 변경 은 저장 과정 을 재 컴 파일 하지 않 습 니 다.색인 과 통계 정 보 를 만 들 수 없습니다.그러나 메 인 키 를 만 들 고 색인 검색 을 할 수 있 습 니 다.표 변 수 는 메모리 에서 만 작 동 하 는 것 이 아니 라 데이터 양 이 많은 경우 에 도 tempdb,즉 물리 디스크 의 IO 작업 을 쓸 수 있 습 니 다.2.트 랜 잭 션 스크롤 백 테이블 변수 가 잘못 되 었 습 니 다(통계 정보 가 없 기 때 문 입 니 다)일반적으로 데이터 양 이 많 습 니 다.임시 결과 집합 은 다른 표 와 2 차 관련 이 있어 야 합 니 다.임시 표 데이터 양 이 적 고 임시 결과 집합 용 표 변수 10.스 크 립 트 와 일괄 처리 Go 는 T-SQL 명령 이 아 닙 니 다.그 는 컴 파일 도구 Management Studio,SQLCMD 로 만 식별 할 수 있 습 니 다.제3자 도 구 를 사용 하면반드시 GO 명령 을 지지 하 는 것 은 아니다.예 를 들 어 ADO.NET,ADO.11.SQLCMD 활용 SQLCMD-Usa-psa-Q"SELECT*FROM TESTDB.dbo.mytable"SQLCMD-Usa-psa-i testsql.sql 실행 파일 에 있 는 SQL 문 구 를 사용 합 니 다.12.EXEC 사용 설명 은 EXEC 를 실행 한 후@ROWCOUNT 와 같은 변 수 를 사용 하여 영향 행 수 를 볼 수 있 습 니 다.EXEC 의 매개 변수 에서 EXEC 문자열 에 대해 함 수 를 실행 할 수 없습니다.예 를 들 어 cast(XX AS VARCHAR)는 EXEC 의 매개 변수 에 대해 문자열 을 추가 하거나 전체 문자열 만 사용 할 수 있 습 니 다.13.WAITFOR 의 의미 WAITFOR TIME<'TIME'>을 정시 에 실행 합 니 다.WAITFOR DELAY<'TIME'>지연 실행 14.저장 프로 세 스 요약 1)@@ERROR 대신 TRY/CATCH 를 사용 하 는 것 이 더 과학적 입 니 다.1@ERROR 는 TRA/CATCH 가 직관 적 이지 않 습 니 다.둘째,오류 단계 가 11-19 에 있 는 오류 가 발생 하면 운행 이 직접 중단 되 어@@ERROR 가 오류 여 부 를 판단 하 는 데 무효 가 될 수 있 습 니 다.2)RAISERROR 을 사용 하여 WITH LOG 를 잘못 던 졌 습 니 다.심각 한 단계 가 19 보다 크 면 WITH SETERROR 을 사용 하여@@ERROR 값 을 다시 쓰 도록 합 니 다.외부 호출 을 편리 하 게 하 는 WITH NOWAIT 는 즉시 클 라 이언 트 에 게 오 류 를 알 립 니 다.15.커서 의 복습 커서 의 주요 부분 은 다음 과 같 습 니 다.1)성명 2)열기 3)사용 또는 네 비게 이 션 4)종료 5)끼 워 넣 기 사용 커서 예제
DECLARE BillMsgCursor CURSOR FOR
SELECT TypeNo,TabDetailName FROM dbo.BillType
OPEN BillMsgCursor
DECLARE @TypeNo CHAR(5)
DECLARE @DetailName VARCHAR(50)
FETCH NEXT FROM BillMsgCursor INTO @TypeNo,@DetailName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @DataFieldName VARCHAR(50)
DECLARE ColumnName CURSOR FOR
SELECT name FROM syscolumns WHERE id = OBJECT_ID(@DetailName)
OPEN ColumnName
FETCH NEXT FROM ColumnName INTO @DataFieldName
PRINT ' :' + @TypeNo
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'ListDetailDataFiled.Add('''+@DataFieldName+''');'
FETCH NEXT FROM ColumnName INTO @DataFieldName
END
CLOSE ColumnName
DEALLOCATE ColumnName
FETCH NEXT FROM BillMsgCursor INTO @TypeNo,@DetailName
END
CLOSE BillMsgCursor
DEALLOCATE BillMsgCursor
@fetchstatus 값 의 의미:0 FETCH 구문 성공;-1.FETCH 구문 이 실 패 했 거나 이 줄 이 결과 에 집중 되 지 않 았 습 니 다.-2 추출 된 줄 에는 FETCH[NEXT/PRIOR/FIRST/LAST]FROM 이 존재 하지 않 습 니 다.INTO 는 커서 가 SCROLL 형식의 16.커서 에 대한 분류 1)정적 커서(static):임시 표 에 해당 하 며 tempdb 의 개인 표 에 저 장 됩 니 다.예 를 들 어 스냅 샷 표 가 a 를 복사 하 는 것 과 같 습 니 다.커서 를 만 들 면 실제 기록 과 분리 되 고 잠 금 b.커서 는 독립 적 입 니 다.원본 데이터 와 어떠한 방식 으로 도 연결 되 지 않 습 니 다.2)키 집합 으로 구동 되 는 커서(keyset):데이터 에 대한 수정 을 어느 정도 감지 해 야 하지만 최근 에 발생 한 모든 삽입 a.표 는 전체 데이터 집합 이 아 닌 유일한 색인 b.키 집합 만 tempdb 에 있어 야 합 니 다.전체 서버 성능 에 유리 한 영향 을 미 칩 니 다.커서 d 를 다시 만 듭 니 다.유일한 색인 이 없 는 테이블 을 실행 할 수 있 습 니 다.그러나 단점 으로 인해 SQLSERVER 는 커서 의 위 치 를 추적 하지 못 하고 순환 을 일 으 킬 수 있 습 니 다.4)커서 에 빨리 들 어 가 는 것 을 피해 야 합 니 다(FASTFORWARD)많은 상황 에서 fastFORWARD 커서 는 다른 커서 형식 으로 암시 적 으로 변 환 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.