C 액세스 선택 쿼리 작업. VBA Access에서 데이터베이스에 쿼리를 보내는 방법

이 수업은 다음 항목에 중점을 둡니다. SQL 쿼리데이터베이스에 VBA 액세스... VBA에서 데이터베이스에 대한 INSERT, UPDATE, DELETE 쿼리가 어떻게 만들어지는지 살펴보고 SELECT 쿼리에서 특정 값을 가져오는 방법도 알아봅니다.

프로그램 하시는 분들 VBA 액세스베이스 작업하면서 SQL 데이터서버는 종종 INSERT, UPDATE 또는 간단한 SQL SELECT 쿼리와 같이 데이터베이스에 SQL 쿼리를 보내는 것과 같이 간단하고 필요한 작업에 직면합니다. 그리고 우리는 초보 프로그래머이기 때문에 이것도 할 수 있어야 합니다. 그래서 오늘은 그렇게 할 것입니다.

우리는 이미 MSSql 2008에서 텍스트 파일로 데이터 언로드에 대한 기사에서 VBA에서 이 데이터를 얻기 위한 코드를 작성하거나 SQL 서버에서 데이터를 수신하는 주제를 다루었습니다. 자료 Access에서 Word 및 Excel 템플릿으로 데이터 언로드 하지만 어떤 식 으로든 우리는 그것을 피상적으로 고려했으며 오늘은 그것에 대해 조금 더 자세히 이야기 할 것을 제안합니다.

메모! 아래의 모든 예는 Access 2003 ADP 프로젝트 및 MSSql 2008 데이터베이스를 사용하는 것으로 간주됩니다. 일반적으로 ADP 프로젝트가 무엇인지 모르는 경우 Access ADP 프로젝트를 만들고 구성하는 방법 문서에서 이를 고려했습니다.

예시를 위한 초기 데이터

연도의 숫자와 이름을 포함할 test_table이 있다고 가정해 보겠습니다(쿼리는 다음을 사용하여 만들어집니다. 매니지먼트 스튜디오)

테이블 생성(NULL이 아님, (50) NULL) ON GO

내가 말했듯이 우리는 테스트 양식을 만들고 서명이 있는 시작 버튼을 추가한 MS SQL 2008과 함께 작동하도록 구성된 ADP 프로젝트를 사용할 것입니다. "운영"코드를 테스트하는 데 필요한 것입니다. 우리는 이벤트 핸들러에 모든 코드를 작성할 것입니다" 버튼 누름».

VBA INSERT, UPDATE, DELETE 쿼리

오랫동안 지연되지 않기 위해 바로 시작하겠습니다. 테스트 테이블에 행을 추가해야 한다고 가정해 보겠습니다( 코드가 주석 처리됨)/

Private Sub start_Click () "쿼리 문자열을 저장할 변수 선언 Dim sql_query As String" 필요한 쿼리 작성 sql_query = "INSERT INTO test_table (id, name_mon) VALUES (" 6 "," June ")" "DoCmd 실행 .RunSQL sql_query 종료 서브

이 경우 쿼리는 현재 데이터베이스 연결 매개변수를 사용하여 실행됩니다. 데이터가 추가되었는지 여부를 확인할 수 있습니다.

보시다시피 데이터가 삽입되었습니다.

한 줄을 삭제하려면 다음 코드를 작성하십시오.

Private Sub start_Click() "쿼리 문자열을 저장할 변수 선언 Dim sql_query As String" 삭제 쿼리 작성 sql_query = "DELETE test_table WHERE id = 6" "DoCmd.RunSQL sql_query End Sub 실행

확인하면 필요한 줄이 삭제되었음을 알 수 있습니다.

데이터를 업데이트하려면 sql_query 변수에 업데이트 쿼리를 작성하십시오. 의미가 명확하기를 바랍니다.

VBA 기반에 대한 SELECT 쿼리

여기에서 나머지 SQL 구문보다 상황이 조금 더 흥미로워집니다.

먼저 테이블에서 모든 데이터를 가져와야 한다고 가정해 보겠습니다. 예를 들어 데이터를 처리하여 메시지에 표시하고 물론 다른 용도로 사용할 수도 있습니다. 이를 위해 다음을 작성합니다. 암호

Private Sub start_Click () "변수 선언" 데이터베이스의 레코드 집합용 Dim RS As ADODB.Recordset "Query string Dim sql_query As String" 메시지에 요약 데이터를 표시하기 위한 문자열 Dim str As String "Create a new object for 레코드 세트 RS = New ADODB .Recordset "쿼리 문자열 sql_query = SELECT id, name_mon FROM test_table "" 현재 프로젝트 연결 설정을 사용하여 쿼리 실행 RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Not 동안 레코드를 통해 루프 (RS.EOF)" 메시지를 표시하기 위해 변수를 채우십시오 str = str & RS.Fields ("id") & "-" & RS.Fields ("name_mon") & vbnewline "다음 레코드로 이동 RS.MoveNext Wend" 메시지 표시 msgbox str End Sub

여기에서는 이미 VBA 액세스 루프를 사용하여 레코드 집합의 모든 값을 반복하고 있습니다.

그러나 꽤 자주 레코드 세트에서 모든 값을 얻는 것이 아니라 코드로 월 이름을 가져와야 하는 경우가 많습니다. 이렇게 하려면 루프를 사용하는 것이 비용이 많이 들기 때문에 하나의 값만 반환하고 참조하는 쿼리를 작성하면 됩니다. 예를 들어 코드 5로 월 이름을 얻습니다.

Private Sub start_Click () "변수 선언" 데이터베이스의 레코드 집합에 대해 Dim RS As ADODB.Recordset "Query string Dim sql_query As String" 총 값을 표시하기 위한 문자열 Dim str As String "레코드 집합 RS에 대한 새 개체 만들기 = New ADODB.Recordset "쿼리 문자열 sql_query = SELECT name_mon FROM test_table WHERE id = 5 "" 현재 프로젝트 연결 설정을 사용하여 쿼리를 실행합니다. RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "값 str = RS를 가져옵니다. 필드(0) msgbox str End Sub

보편성을 위해 여기에서 우리는 이미 세포의 이름이 아니라 색인으로 언급했습니다. 0이고 이것은 첫 번째 값입니다. 레코드세트, 결국 우리는 가치를 얻었습니다 "할 수있다".

보시다시피 모든 것이 매우 간단합니다. 베이스에서 특정 값을 자주 가져와야 하는 경우( 마지막 예에서와 같이), 모든 코드를 하나의 입력 매개변수(예: 월 코드( 우리가 우리의 예를 고려한다면) 간단히 말해서 이 값을 출력해야 하는 경우 필요한 매개변수를 사용하여 필요한 함수를 호출하면 됩니다. 그러면 VBA 코드가 크게 줄어들고 프로그램에 대한 인식이 향상됩니다.

오늘은 그게 다야. 행운을 빕니다!

SQL 쿼리의 예는 MS Access에서 SQL 쿼리 작성을 배우고 연습하는 데 사용할 수 있습니다.

하나의 SQL 쿼리는 다른 쿼리 내에 중첩될 수 있습니다. 하위 쿼리는 쿼리 내의 쿼리일 뿐입니다. 일반적으로 하위 쿼리는 WHERE 절에서 사용됩니다. 그러나 하위 쿼리를 사용하는 다른 방법도 있습니다.

요청 Q011. m_product 테이블의 제품에 대한 정보가 표시되며 해당 코드는 m_income 테이블에도 있습니다.

선택하다 *
m_product에서
WHERE id IN (SELECT product_id FROM m_income);

요청 Q012. m_product 테이블의 제품 목록이 표시되며 해당 코드는 m_outcome 테이블에 없습니다.

선택하다 *
m_product에서
WHERE id NOT IN (SELECT product_id FROM m_outcome);

요청 Q013.이 SQL 쿼리는 m_income 테이블에는 있지만 m_outcome 테이블에는 없는 코드가 있는 제품 코드 및 이름의 고유 목록을 표시합니다.

SELECT DISTINCT product_id, 제목
FROM m_income INNER JOIN m_product
ON m_income.product_id = m_product.id
WHERE product_id NOT IN (SELECT product_id FROM m_outcome);

요청 Q014.고유한 범주 목록이 m_category 테이블에서 표시되며 이름은 문자 M으로 시작합니다.

DISTINCT 제목 선택
m_product에서
WHERE 제목 LIKE "М *";

요청 Q015.요청의 필드에 대해 산술 연산을 수행하고 요청의 필드 이름을 바꾸는 예(별칭). 이 예에서는 이익이 판매 금액의 7%라고 가정하고 각 항목 비용 레코드에 대한 비용 금액 = 수량 * 가격 및 이익 마진을 계산합니다.


금액 * 가격 / 100 * 7 AS 수익
m_outcome에서;

요청 Q016.산술 연산을 분석하고 단순화하여 쿼리 실행 속도를 높일 수 있습니다.

SELECT dt, product_id, amount, price, amount * price AS result_sum,
result_sum * 0.07 AS 이익
m_outcome에서;

요청 Q017. INNER JOIN 문을 사용하여 여러 테이블의 데이터를 조인할 수 있습니다. 다음 예에서 ctgry_id 값에 따라 m_income 테이블의 각 레코드는 제품이 속한 m_category 테이블의 카테고리 이름과 일치합니다.

SELECT c.title, b.title, dt, amount, price, amount * price AS income_sum
FROM (m_ income AS a INNER JOIN m_product AS b ON a.product_id = b.id)
내부 조인 m_category AS c ON b.ctgry_id = c.id
ORDER BY c.title, b.title;

요청 Q018. SUM - 합계, COUNT - 수량, AVG - 산술 평균, MAX - 최대값, MIN - 최소값과 같은 함수를 집계 함수라고 합니다. 여러 값을 취하며 처리된 후 단일 값을 반환합니다. 다음을 사용하여 금액 및 가격 필드의 곱의 합계를 계산하는 예 집계 함수합집합.

실험실 작업 1번

SQL: 데이터 추출 - 명령선택하다

객관적인:

  • SQL 문에 익숙해지십시오.
  • SELECT 명령을 사용하여 Access에서 가장 간단한 SQL 쿼리를 만드는 방법을 배웁니다.

· IN, BETWEEN, LIKE, IS NULL 연산자 사용.

연습№1. SQL 모드에서 STUDENTS 테이블에서 FIRST NAME 및 LAST NAME 필드의 모든 값을 선택하는 쿼리를 만듭니다.

이름, 성 선택

학생으로부터;

연습№2 ... STUDENTS 테이블의 모든 열에 대해 SQL 모드에서 선택 쿼리를 만듭니다.

선택하다 *

학생으로부터;


작업 번호 3. SQL 모드에서 선택하는 쿼리를 작성하여 학생이 살고 있는 도시의 이름을 선택하고 이에 대한 정보는 PERSONAL DATA 테이블에 있습니다.

고유 도시 선택

[개인 데이터]에서;

작업 번호 4. STUDENTS 테이블에 나열된 성이 Ivanov인 모든 학생의 이름을 선택하는 SQL 모드 선택 쿼리를 생성합니다.

성, 이름 선택

학생으로부터

성 = "이바노프";

작업 번호 5... 예산 형식의 교육에서 UIT-22 그룹에 등록된 학생의 이름과 성을 얻기 위해 SQL 모드에서 선택 항목에 대한 쿼리를 만듭니다.

성, 이름 선택

학생으로부터

WHERE GROUP = "WHIT-22" 및 BUDGET = true;

작업 번호 6... SQL 모드에서 쿼리를 생성합니다. EXAMS EXAMINATION 표의 샘플에서 4학년과 5학년 학생에 대한 정보.

선택하다 *

에서 [변화시험]

어디등급안으로 (4.5);

작업 번호 7. IOSU 과목에서 시험 성적이 3인 학생에 대한 정보 선택을 위해 zanpoc 및 SQL 모드를 만듭니다.

선택하다 *

에서 [변화시험]

어디물건=" 이오수"그리고등급(4.5)에 없음;

작업 번호 8.시간이 100에서 130 사이인 주제에 대한 레코드를 선택하려면 SQL 모드에서 쿼리를 작성하십시오.

선택하다 *

에서아이템

어디시계100과 130 사이;


작업 번호 9. SQL 모드에서 쿼리를 생성하여 성이 "C"로 시작하는 학생에 대한 정보를 STUDENTS 테이블에서 선택합니다.

선택하다 *

에서재학생

어디처럼 "와 함께*";

결론:실험실 작업 과정에서 SQL 문에 대해 알게 되었고 IN, BETWEEN, LIKE 연산자를 사용하여 SELECT 명령을 사용하여 Access에서 가장 간단한 SQL 쿼리를 만드는 방법을 배웠습니다.

SQL - 4단원. 데이터 가져오기 - SELECT 문

따라서 포럼 데이터베이스에는 사용자, 주제 및 게시물의 세 가지 테이블이 있습니다. 그리고 우리는 그들이 어떤 종류의 데이터를 포함하고 있는지 알고 싶습니다. 이를 위해 SQL에는 연산자가 있습니다. 선택하다... 사용 구문은 다음과 같습니다.

SELECT what_ 선택할 위치에서 FROM 선택;


"what_choose" 대신 값을 보려는 열의 이름이나 쉼표로 구분된 여러 열의 이름을 지정하거나 테이블의 모든 열이 선택되었음을 의미하는 별표(*)를 지정해야 합니다. . "where_from" 대신 테이블의 이름이어야 합니다.

먼저 users 테이블의 모든 열을 살펴보겠습니다.

SELECT * FROM 사용자;

이것이 우리가 이 테이블에 입력한 모든 데이터입니다. 그러나 id_user 열만 보기를 원한다고 가정합니다(예를 들어, 지난 단원에서 topic 테이블을 채우기 위해 users 테이블에 있는 id_user가 무엇인지 알아야 했습니다). 이렇게 하려면 요청에서 이 열의 이름을 지정합니다.

SELECT id_user FROM 사용자;

예를 들어 사용자의 이름과 이메일을 보고 싶다면 관심 있는 열을 쉼표로 구분하여 나열합니다.

사용자의 이름, 이메일을 선택하십시오.

마찬가지로 다른 테이블에 포함된 데이터를 볼 수 있습니다. 어떤 주제가 있는지 살펴보겠습니다.

SELECT * FROM 주제;

이제 주제는 4개뿐이지만 100개라면 어떻게 될까요? 예를 들어 알파벳순으로 표시하고 싶습니다. SQL에 이에 대한 키워드가 있습니다. 주문그 뒤에 정렬이 수행될 열의 이름입니다. 구문은 다음과 같습니다.

SELECT column_name FROM table_name ORDER BY sort_column_name;



기본적으로 정렬은 오름차순이지만 키워드를 추가하여 변경할 수 있습니다. DESC

이제 데이터가 내림차순으로 정렬됩니다.

정렬은 한 번에 여러 열로 수행할 수 있습니다. 예를 들어 다음 쿼리는 topic_name 열을 기준으로 데이터를 정렬하고 이 열에 동일한 행이 여러 개 포함되어 있으면 id_author 열이 내림차순으로 정렬됩니다.

결과를 이전 쿼리의 결과와 비교합니다.

종종 우리는 테이블의 모든 정보가 필요하지 않습니다. 예를 들어, 사용자 sveta(id = 4)가 어떤 테마를 만들었는지 알고 싶습니다. SQL에 이에 대한 키워드가 있습니다. 어디, 이러한 요청의 구문은 다음과 같습니다.

이 예에서 조건은 사용자 ID입니다. id_author 열(사용자 ID sveta)에 4가 있는 행만 필요합니다.

또는 누가 자전거 테마를 만들었는지 알고 싶습니다.

물론 저자의 id 대신 저자의 이름을 표시하는 것이 더 편리하겠지만, 이름은 다른 테이블에 저장됩니다. 다음 수업에서는 여러 테이블에서 데이터를 선택하는 방법을 배웁니다. 지금은 WHERE 키워드를 사용하여 설정할 수 있는 조건을 알아보겠습니다.

운영자 설명
= (같음) 지정된 값과 동일한 값이 선택됩니다.

예시:

SELECT * FROM 주제 WHERE id_author = 4;

결과:

> (더) 지정된 값보다 큰 값이 선택되었습니다.

예시:

SELECT * FROM 주제 WHERE id_author> 2;

결과:

< (меньше) 지정된 값보다 작은 값이 선택되었습니다.

예시:

SELECT * FROM 주제 WHERE id_author
결과:

> = (크거나 같음) 지정된 값보다 크거나 같은 값이 선택됩니다.

예시:

SELECT * FROM 주제 WHERE id_author> = 2;

결과:

<= (меньше или равно) 지정된 값보다 작거나 같은 값이 선택됩니다.

예시:

SELECT * FROM 주제 WHERE id_author
결과:

! = (같지 않음) 지정된 값과 같지 않은 값이 선택되었습니다.

예시:

SELECT * FROM 주제 WHERE id_author! = 1;

결과:

NULL이 아님 지정된 필드에 값이 있는 행 선택

예시:

SELECT * FROM 주제 WHERE id_author IS NOT NULL;

결과:

IS NULL 지정된 필드에 값이 없는 행 선택

예시:

SELECT * FROM 주제 WHERE id_author IS NULL;

결과:

빈 세트 - 그러한 라인이 없습니다.

BETWEEN(사이) 지정된 값 사이에 있는 값이 선택됩니다.

예시:

SELECT * FROM 주제 WHERE id_author BETWEEN 1과 3;

결과:

IN(포함된 값) 지정된 값과 일치하는 값이 선택됩니다.

예시:

SELECT * FROM 주제 WHERE id_author IN (1, 4);

결과:

NOT IN(값이 포함되지 않음) 지정된 값 이외의 값이 선택됨

예시:

SELECT * FROM 주제 WHERE id_author NOT IN (1, 4);

결과:

LIKE(일치) 패턴과 일치하는 값 선택

예시:

SELECT * FROM 주제 WHERE topic_name LIKE "led%";

결과:

LIKE 연산자의 가능한 메타 문자는 아래에서 설명합니다.

같지 않은 샘플과 일치하지 않는 값이 선택됩니다.

예시:

SELECT * FROM topic WHERE topic_name NOT LIKE "led%";

결과:

LIKE 연산자 메타 문자

메타 문자는 텍스트 필드에서만 검색할 수 있습니다.

가장 일반적인 메타 문자는 % ... 모든 기호를 의미합니다. 예를 들어 "led"로 시작하는 단어를 찾아야 하는 경우 LIKE "led%"라고 쓰고 "club" 문자가 포함된 단어를 찾으려면 LIKE "% club%"라고 씁니다. . 예를 들어:

일반적으로 사용되는 또 다른 메타 문자는 다음과 같습니다. _ ... 여러 문자를 나타내거나 전혀 나타내지 않는 %와 달리 밑줄은 정확히 한 문자를 나타냅니다. 예를 들어:

메타 문자와 "물고기" 사이의 공백에 주의하세요. 건너뛰면 요청이 작동하지 않기 때문에 메타 문자 _ 는 정확히 하나의 문자를 나타내며 공백도 문자입니다.

오늘은 충분합니다. 다음 강의에서는 두 개 이상의 테이블을 쿼리하는 방법을 배웁니다. 그 때까지는 게시물 테이블을 직접 쿼리해 보세요.

하나의 SQL 쿼리는 다른 쿼리 내에 중첩될 수 있습니다. 하위 쿼리는 쿼리 내의 쿼리일 뿐입니다. 일반적으로 하위 쿼리는 WHERE 절에서 사용됩니다. 그러나 하위 쿼리를 사용하는 다른 방법도 있습니다.

요청 Q011. m_product 테이블의 제품에 대한 정보가 표시되며 해당 코드는 m_income 테이블에도 있습니다.

선택하다 *
m_product에서
WHERE id IN (SELECT product_id FROM m_income);

요청 Q012. m_product 테이블의 제품 목록이 표시되며 해당 코드는 m_outcome 테이블에 없습니다.

선택하다 *
m_product에서
WHERE id NOT IN (SELECT product_id FROM m_outcome);

요청 Q013.이 SQL 쿼리는 m_income 테이블에는 있지만 m_outcome 테이블에는 없는 코드가 있는 제품 코드 및 이름의 고유 목록을 표시합니다.

SELECT DISTINCT product_id, 제목
FROM m_income INNER JOIN m_product
ON m_income.product_id = m_product.id
WHERE product_id NOT IN (SELECT product_id FROM m_outcome);

요청 Q014.고유한 범주 목록이 m_category 테이블에서 표시되며 이름은 문자 M으로 시작합니다.

DISTINCT 제목 선택
m_product에서
WHERE 제목 LIKE "М *";

요청 Q015.요청의 필드에 대해 산술 연산을 수행하고 요청의 필드 이름을 바꾸는 예(별칭). 이 예에서는 이익이 판매 금액의 7%라고 가정하고 각 항목 비용 레코드에 대한 비용 금액 = 수량 * 가격 및 이익 마진을 계산합니다.

가격, 금액 * 가격 AS result_sum,
금액 * 가격 / 100 * 7 AS 수익
m_outcome에서;

요청 Q016.산술 연산을 분석하고 단순화하여 쿼리 실행 속도를 높일 수 있습니다.


result_sum * 0.07 AS 이익
m_outcome에서;

요청 Q017. INNER JOIN 문을 사용하여 여러 테이블의 데이터를 조인할 수 있습니다. 다음 예에서 ctgry_id 값에 따라 m_income 테이블의 각 레코드는 제품이 속한 m_category 테이블의 카테고리 이름과 일치합니다.

SELECT c.title, b.title, dt, amount, price, amount * price AS income_sum
FROM (m_ income AS a INNER JOIN m_product AS b ON a.product_id = b.id)
내부 조인 m_category AS c ON b.ctgry_id = c.id
ORDER BY c.title, b.title;

요청 Q018. SUM - 합계, COUNT - 수량, AVG - 산술 평균, MAX - 최대값, MIN - 최소값과 같은 함수를 집계 함수라고 합니다. 여러 값을 취하며 처리된 후 단일 값을 반환합니다. SUM 집계 함수를 사용하여 금액 및 가격 필드의 곱 합계를 계산하는 예:

SELECT SUM (금액 * 가격) AS Total_Sum
FROM m_income;

요청 Q019.여러 집계 함수를 사용하는 예:


SELECT 합계(금액) AS Amount_Sum, AVG(금액) AS Amount_AVG,
MAX(금액) AS Amount_Max, Min(금액) AS Amount_Min,
개수(*) AS Total_Number
FROM m_income;

요청 Q020.이 예에서는 2011년 6월에 코드 1이 대문자인 모든 항목의 합계를 계산합니다.

선택하다
FROM m_income
WHERE product_id = 1 AND dt BETWEEN # 6/1/2011 # AND # 2011년 6월 30일 # ;.

요청 Q021.다음 SQL 쿼리는 코드 4 또는 6으로 판매된 제품의 양을 계산합니다.

선택하다
m_outcome에서
WHERE product_id = 4 또는 product_id = 6;

요청 Q022.코드가 4 또는 6인 상품의 2011년 6월 12일에 판매된 금액에 대해 계산됩니다.

SELECT 합계(금액 * 가격) AS result_sum
m_outcome에서
WHERE (product_id = 4 OR product_id = 6) AND dt = # 6/12/2011 #;

요청 Q023.과제는 다음과 같습니다. 대문자로 표시된 "빵집" 범주의 총 ​​상품 금액을 계산합니다.

이 문제를 해결하려면 다음과 같은 이유로 m_income, m_product 및 m_category의 세 가지 테이블을 사용하여 작업해야 합니다.
- 자본화 상품의 수량과 가격은 m_income 테이블에 저장됩니다.
- 각 제품의 카테고리 코드는 m_product 테이블에 저장됩니다.
- 카테고리 제목의 이름은 m_category 테이블에 저장됩니다.

이 문제를 해결하기 위해 다음 알고리즘을 사용합니다.
- 하위 쿼리를 사용하여 m_category 테이블에서 카테고리 코드 "제과점 제품" 결정;
- m_income 및 m_product 테이블을 결합하여 각 대문자 제품의 범주를 결정합니다.
- 카테고리 코드가 위의 하위 쿼리에 의해 정의된 코드와 동일한 상품의 입고 금액(= 수량 * 가격) 계산.


FROM m_product AS a INNER JOIN m_income AS b ON a.id = b.product_id
WHERE ctgry_id = (SELECT id FROM m_category WHERE title = "(! LANG: 빵집"); !}

요청 Q024.다음 알고리즘을 사용하여 "베이커리 제품" 범주에서 자본화된 상품의 총량을 계산하는 문제를 해결할 것입니다.
- m_income 테이블의 각 레코드에 대해 product_id 값에 따라 m_category 테이블에서 카테고리 이름과 일치합니다.
- 범주가 "제빵 제품"과 동일한 레코드를 선택합니다.
- 영수증 금액 = 수량 * 가격을 계산합니다.

SELECT 합계(금액 * 가격) AS income_sum
FROM(m_product AS a INNER JOIN m_income AS b ON a.id = b.product_id)
WHERE c.title = "(! LANG: 빵집"; !}

요청 Q025.이 예에서는 소비된 항목 수를 계산합니다.

SELECT COUNT(product_id) AS product_cnt
FROM (SELECT DISTINCT product_id FROM m_outcome) AS t;

요청 Q026. GROUP BY 절은 레코드를 그룹화하는 데 사용됩니다. 일반적으로 레코드는 하나 이상의 필드 값으로 그룹화되며 일부 집계 작업이 각 그룹에 적용됩니다. 예를 들어, 다음 쿼리는 상품 판매에 대한 보고서를 생성합니다. 즉, 상품 이름과 판매 금액이 포함된 테이블이 생성됩니다.

SELECT 제목, SUM(금액 * 가격) AS result_sum
FROM m_product AS a INNER JOIN m_outcome AS b
ON a.id = b.product_id
GROUP BY 제목;

요청 Q027.카테고리별 판매 보고서입니다. 즉, 제품 범주의 이름, 해당 범주의 제품이 판매된 총액 및 평균 판매액이 포함된 테이블이 생성됩니다. ROUND 함수는 평균 값을 100분의 1(소수 구분 기호 뒤의 두 번째 자리)로 반올림하는 데 사용됩니다.

SELECT c.title, SUM (금액 * 가격) AS result_sum,
ROUND (AVG(금액 * 가격), 2) AS result_sum_avg
FROM(m_product AS a INNER JOIN m_outcome AS b ON a.id = b.product_id)
내부 조인 m_category AS c ON a.ctgry_id = c.id
GROUP BY c.title;

요청 Q028.각 제품에 대해 총 영수증 및 평균 영수증 수가 계산되고 총 영수증 수가 500개 이상인 상품에 대한 정보가 표시됩니다.

SELECT product_id, SUM(금액) AS amount_sum,
라운드(Avg(금액), 2) AS amount_avg
FROM m_income
GROUP BY product_id
HAVING 합계(금액)> = 500;

요청 Q029.이 쿼리는 각 항목에 대해 2011년 2/4분기의 영수증 합계 및 평균을 계산합니다. 수령한 상품의 총량이 1000개 이상인 경우 이 제품에 대한 정보가 표시됩니다.

SELECT 제목, SUM(금액 * 가격) AS income_sum
FROM m_income a INNER JOIN m_product b ON a.product_id = b.id
# 2011년 4월 1일 # AND # 2011년 6월 30일 # 사이의 dt 위치
GROUP BY 제목
HAVING SUM(금액 * 가격)> = 1000;

요청 Q030.어떤 경우에는 특정 테이블의 각 레코드를 다른 테이블의 각 레코드에 매핑해야 합니다. 데카르트 곱이라고 합니다. 이러한 연결로 생성된 테이블을 데카르트 테이블이라고 합니다. 예를 들어, 어떤 테이블 A에 100개의 레코드가 있고 테이블 B에 15개의 레코드가 있는 경우 데카르트 테이블은 100 * 15 = 150개의 레코드로 구성됩니다. 다음 쿼리는 m_income 테이블의 모든 레코드를 m_outcome 테이블의 모든 레코드와 조인합니다.

SELECT * FROM m_income, m_outcome;

요청 Q031.두 필드로 레코드를 그룹화하는 예입니다. 다음 SQL 쿼리는 각 공급자에 대해 각 공급자로부터 받은 상품의 양과 수량을 계산합니다.


SUM (금액 * 가격) AS income_sum

요청 Q032.두 필드로 레코드를 그룹화하는 예입니다. 다음 쿼리는 각 공급업체에 대해 당사에서 판매한 제품의 양과 수량을 계산합니다.

SELECT Supplier_id, product_id, SUM(금액) AS amount_sum,
SUM (금액 * 가격) AS result_sum
GROUP BY 공급업체_ID, 제품_ID;

요청 Q033.이 예에서는 위의 두 쿼리(q031 및 q032)가 하위 쿼리로 사용됩니다. LEFT JOIN 방법을 사용하는 이러한 쿼리의 결과는 하나의 보고서로 결합됩니다. 다음 쿼리는 각 공급업체에 대해 입고 및 판매된 제품의 수량 및 양에 대해 보고합니다. 일부 제품이 이미 도착했지만 아직 판매되지 않은 경우 이 레코드의 result_sum 셀이 비어 있습니다. 또한 이 요청은 복잡한 쿼리하위 쿼리로. 성능 이 요청의많은 양의 데이터가 있는 SQL이 의심스럽습니다.

선택하다 *
에서
SUM (금액 * 가격) AS income_sum
ON a.product_id = b.id GROUP BY Supplier_id, product_id) AS a
왼쪽 조인
(SELECT Supplier_id, product_id, SUM(금액) AS amount_sum,
SUM (금액 * 가격) AS result_sum
FROM m_outcome AS a INNER JOIN m_product AS b
ON a.product_id = b.id GROUP BY Supplier_id, product_id) AS b
ON (a.product_id = b.product_id) AND (a.supplier_id = b.supplier_id);

요청 Q034.이 예에서는 위의 두 쿼리(q031 및 q032)가 하위 쿼리로 사용됩니다. RIGTH JOIN 방법을 사용하는 이러한 쿼리의 결과는 하나의 보고서로 결합됩니다. 다음 쿼리는 각 고객이 사용한 지불 시스템에 대한 지불 금액과 투자 금액에 대한 보고서를 표시합니다. 다음 쿼리는 각 공급업체에 대해 입고 및 판매된 제품의 수량 및 양에 대해 보고합니다. 일부 제품이 이미 판매되었지만 아직 도착하지 않은 경우 이 레코드의 income_sum 셀이 비어 있습니다. 이러한 빈 셀의 존재는 판매 회계에 오류가 있음을 나타내는 지표입니다. 판매 전에 먼저 해당 제품이 도착해야 하기 때문입니다.

선택하다 *
에서
(SELECT Supplier_id, product_id, SUM(금액) AS amount_sum,
SUM (금액 * 가격) AS income_sum
FROM m_income AS a INNER JOIN m_product AS b ON a.product_id = b.id
GROUP BY Supplier_id, product_id) AS a
오른쪽 조인
(SELECT Supplier_id, product_id, SUM(금액) AS amount_sum,
SUM (금액 * 가격) AS result_sum
FROM m_outcome AS a INNER JOIN m_product AS b ON a.product_id = b.id
GROUP BY Supplier_id, product_id) AS b
ON (a.supplier_id = b.supplier_id) AND (a.product_id = b.product_id);

요청 Q035.제품별 수입 및 지출 금액에 대한 보고서를 표시합니다. 이를 위해 m_income 및 m_outcome 테이블에 따라 제품 목록이 생성된 다음 이 목록의 각 제품에 대해 m_income 테이블에 따른 영수증 합계와 m_outcome 테이블에 따른 비용 합계가 계산됩니다.

SELECT product_id, SUM(in_amount) AS income_amount,
SUM(out_amount) AS result_amount
에서
(SELECT product_id, 금액 AS in_amount, 0 AS out_amount
FROM m_income
유니온 올
SELECT product_id, 0 AS in_amount, 금액 AS out_amount
FROM m_outcome) AS t
GROUP BY product_id;

요청 Q036. EXISTS는 전달된 집합에 요소가 포함되어 있으면 TRUE를 반환합니다. EXISTS 함수는 전달된 집합이 비어 있는 경우, 즉 요소를 포함하지 않는 경우 FALSE를 반환합니다. 다음 쿼리는 m_income 및 m_outcome 테이블 모두에 포함된 제품 코드를 표시합니다.

DISTINCT 제품 ID 선택
FROM m_income AS a
WHERE EXISTS (SELECT product_id FROM m_outcome AS b

요청 Q037. m_income 테이블과 m_outcome 테이블 모두에 포함된 제품 코드가 표시됩니다.

DISTINCT 제품 ID 선택
FROM m_income AS a
WHERE product_id IN(m_outcome에서 product_id 선택)

요청 Q038. m_income 테이블에 포함되어 있지만 m_outcome 테이블에는 포함되지 않은 제품 코드가 표시됩니다.

DISTINCT 제품 ID 선택
FROM m_income AS a
존재하지 않는 곳(m_outcome AS b에서 product_id 선택
어디에 b.product_id = a.product_id);

요청 Q039.최대 판매 상품의 목록이 표시됩니다. 알고리즘은 다음과 같습니다. 각 제품에 대해 판매 금액이 계산됩니다. 그런 다음 이러한 금액의 최대값이 결정됩니다. 그런 다음 각 제품에 대해 총 판매액이 다시 계산되고 코드와 제품 판매 총계(총계가 최대값과 동일함)가 표시됩니다.

SELECT product_id, SUM(금액 * 가격) AS amount_sum
m_outcome에서
GROUP BY product_id
HAVING SUM(금액 * 가격) = (SELECT MAX(s_amount)
FROM (SELECT SUM (금액 * 가격) AS s_amount FROM m_outcome GROUP BY product_id));

요청 Q040. IIF 예약어( 조건 연산자)는 추정하는 데 사용됩니다. 부울 표현식및 결과(TRUE 또는 FALSE)에 따라 하나 또는 다른 작업을 수행하는 단계를 포함합니다. 다음 예에서 항목의 배송은 수량이 500보다 작으면 "소"로 간주됩니다. 그렇지 않은 경우, 즉 입고 수량이 500보다 크거나 같으면 배송이 "대량"으로 간주됩니다.

SELECT dt, product_id, 금액,
IIF(금액<500,"малая","большая") AS mark
FROM m_income;

SQL 쿼리 Q041. IIF 연산자를 여러 번 사용하는 경우 SWITCH 연산자로 대체하는 것이 더 편리합니다. SWITCH 연산자(객관식 연산자)는 부울 식을 평가하고 결과에 따라 작업을 수행하는 데 사용됩니다. 다음 예에서 배송된 로트는 로트의 상품 수량이 500개 미만이면 "소"로 간주됩니다. 그렇지 않고, 즉, 500개 이상인 경우 로트는 "대"로 간주 ":

SELECT dt, product_id, 금액,
SWITCH(금액<500,"малая",amount>= 500, "대") AS 표시
FROM m_income;

요청 Q042. <300 не выполняется, то проверяется является ли количество товаров в партии меньше 500. Если размер партии меньше 500, то она считается «средней». В противном случае партия считается «большой»:

SELECT dt, product_id, 금액,
IIF(금액<300,"малая",
IIF(금액<1000,"средняя","большая")) AS mark
FROM m_income;

SQL 쿼리 Q043.다음 요청에서 수신된 배치의 상품 수량이 300개 미만인 경우 배치는 "소량"으로 간주됩니다. 그렇지 않으면, 즉 금액 조건이<300 не выполняется, то проверяется является ли количество товаров в партии меньше 500. Если размер партии меньше 500, то она считается «средней». В противном случае партия считается «большой»:

SELECT dt, product_id, 금액,
SWITCH(금액<300,"малая",
양<1000,"средняя",
금액> = 1000, "대") AS 표시
FROM m_income;

SQL 쿼리 Q044.다음 쿼리에서 매출은 소형(최대 150개), 중형(150~300개), 대형(300개 이상)의 세 그룹으로 나뉩니다. 다음으로 각 그룹에 대해 총계가 계산됩니다.

SELECT 범주, SUM(결과_합) AS Ctgry_Total
FROM(금액 선택 * 가격 AS result_sum,
IIf (금액 * 가격<150,"малая",
IIf (금액 * 가격<300,"средняя","большая")) AS Category
FROM m_outcome) AS t
범주별 그룹;

SQL 쿼리 Q045. DateAdd 함수는 주어진 날짜에 일, 월 또는 연도를 추가하고 새 날짜를 얻는 데 사용됩니다. 다음 쿼리:
1) dt 필드의 날짜에 30일을 더하고 dt_plus_30d 필드에 새 날짜를 표시합니다.
2) dt 필드의 날짜에 1개월을 추가하고 dt_plus_1m 필드에 새 날짜를 표시합니다.

SELECT dt, dateadd("d", 30, dt) AS dt_plus_30d, dateadd("m", 1, dt) AS dt_plus_1m
FROM m_income;

SQL 쿼리 Q046. DateDiff 함수는 서로 다른 단위(일, 월 또는 연도)로 두 날짜 간의 차이를 계산합니다. 다음 쿼리는 dt 필드의 날짜와 현재 날짜(일, 월 및 연도) 간의 차이를 계산합니다.

SELECT dt, DateDiff("d", dt, 날짜()) AS last_day,
DateDiff("m", dt, 날짜()) AS last_months,
DateDiff("yyyy", dt, 날짜()) AS last_years
FROM m_income;

SQL 쿼리 Q047.상품 수령일(테이블 m_income)부터 현재 날짜까지의 날짜 수는 DateDiff 함수를 사용하여 계산되고 만료 날짜가 비교됩니다(테이블 m_product):


DateDiff("d", dt, 날짜()) AS last_days
FROM m_income AS a INNER JOIN m_product AS b
ON a.product_id = b.id;

SQL 쿼리 Q048.상품 수령일부터 현재 날짜까지의 일 수를 계산한 다음이 숫자가 만료 날짜를 초과하는지 확인합니다.

SELECT a.id, product_id, dt, lifedays,
DateDiff("d", dt, 날짜()) AS last_days, IIf(last_days> lifedays, "Yes", "No") AS date_expire
FROM m_income a INNER JOIN m_product b
ON a.product_id = b.id;

SQL 쿼리 Q049.상품 수령일로부터 현재 날짜까지의 개월 수를 계산합니다. month_last1 열은 월의 절대 수를 계산하고 month_last2 열은 전체 월 수를 계산합니다.

SELECT dt, DateDiff("m", dt, 날짜()) AS month_last1,
DateDiff("m", dt, 날짜()) - iif(일(dt)>일(날짜()), 1,0) AS month_last2
FROM m_income;

SQL 쿼리 Q050. 2011년에 자본화된 상품 수량 및 금액에 대한 분기별 보고서가 표시됩니다.

SELECT kvartal, SUM(outcome_sum) AS 합계
FROM(금액 선택 * 가격 AS result_sum, 월(dt) AS m,
스위치(m<4,1,m<7,2,m<10,3,m>= 10.4) AS 크바르탈
FROM m_income WHERE 연도(dt) = 2011) AS t
GROUP BY 크바르탈;

요청 Q051.다음 쿼리는 사용자가 항목 수령 금액보다 많은 양의 항목 소비에 대한 정보를 시스템에 입력할 수 있는지 확인하는 데 도움이 됩니다.

SELECT product_id, SUM(in_sum) AS income_sum, SUM(out_sum) AS result_sum
FROM(SELECT product_id, amount * price as in_sum, 0 as out_sum
m_income에서
유니온 올
SELECT product_id, in_sum으로 0, 금액 * out_sum으로 가격
m_outcome에서) AS t
GROUP BY product_id
HAVING SUM(in_sum)

요청 Q052.쿼리에서 반환된 줄 번호는 다양한 방식으로 구현됩니다. 예를 들어, MS Access 자체를 사용하여 MS Access에서 작성된 보고서의 행 번호를 다시 매길 수 있습니다. VBA 또는 PHP와 같은 프로그래밍 언어를 사용하여 번호를 다시 매길 수도 있습니다. 그러나 때때로 이것은 SQL 쿼리 자체에서 수행되어야 합니다. 따라서 다음 쿼리는 ID 필드 값의 오름차순에 따라 m_income 테이블의 행 번호를 지정합니다.

SELECT COUNT(*) as N, b.id, b.product_id, b.amount, b.price
FROM m_income a INNER JOIN m_income b ON a.id<= b.id
GROUP BY b.id, b.product_id, b.amount, b.price;

요청 Q053.제품 중 상위 5개를 판매액으로 표시합니다. 처음 5개 레코드는 TOP 문을 사용하여 표시됩니다.

SELECT TOP 5, product_id, sum(금액 * 가격) AS summa
m_outcome에서
GROUP BY product_id
ORDER BY 합계(금액 * 가격) DESC;

요청 Q054.제품 중 판매량에 따라 5개의 리더가 표시되고 결과적으로 라인에 번호가 매겨집니다.

SELECT COUNT(*) AS N, b.product_id, b.summa
에서

FROM m_outcome GROUP BY product_id) AS a
내부 조인
(SELECT product_id, sum(금액 * 가격) AS summa,
summa * 10000000 + product_id AS id
FROM m_outcome GROUP BY product_id) AS b
ON a.id> = b.id
GROUP BY b.product_id, b.summa
카운트(*)<=5
개수로 주문(*);

요청 Q055.다음 SQL 쿼리는 MS Access SQL에서 수학 함수 COS, SIN, TAN, SQRT, ^ 및 ABS의 사용을 보여줍니다.

SELECT(m_income에서 카운트(*) 선택)를 N으로, 3.1415926을 pi, k로,
2 * pi * (k-1) / N을 x로, COS(x)를 COS_로, SIN(x)를 SIN_으로, TAN(x)를 TAN_으로,
SQR(x)을 SQRT_로, x ^ 3을 "x ^ 3"으로, ABS(x)를 ABS_로
FROM (SELECT COUNT(*) AS k
FROM m_income AS a INNER JOIN m_income AS b ON a.id<=b.id
그룹 BY b.id) t;



관련 기사: