(SQL) таңдаңыз - Select (SQL)

The SQL ТАҢДАУ мәлімдеме а қайтарады нәтиже орнатылды бір немесе бірнеше жазбалар туралы кестелер.[1][2]

SELECT операторы бір немесе бірнеше қатардан нөлдік немесе одан да көп жолдарды шығарып алады мәліметтер базасының кестелері немесе мәліметтер базасы көріністер. Көптеген қосымшаларда ТАҢДАУ ең жиі қолданылады деректерді манипуляциялау тілі (DML) командасы. SQL ретінде а декларативті бағдарламалау тіл, ТАҢДАУ сұраулар нәтижелер жиынтығын көрсетеді, бірақ оны қалай есептеу керектігін көрсетпейді. Деректер базасы сұрауды «сұраныс жоспары «бұл орындау, мәліметтер базасының нұсқалары және бағдарламалық жасақтама арасында әр түрлі болуы мүмкін. Бұл функционалдылық» деп аталадысұранысты оңтайландырушы «өйткені ол қолданыстағы шектеулер шеңберінде сұрау бойынша мүмкін болатын орындау жоспарын табуға жауап береді.

SELECT операторында көптеген қосымша шарттар бар:

  • ТАҢДАУ сөйлем - бұл сұрау арқылы қайтарылуы керек бағандардың немесе SQL өрнектерінің тізімі. Бұл шамамен реляциялық алгебра болжам жұмыс.
  • AS қалауы бойынша әрбір бағанға немесе өрнектегі бүркеншік атпен қамтамасыз етеді ТАҢДАУ тармақ. Бұл реляциялық алгебра атауын өзгерту жұмыс.
  • КІМДЕН деректерді қай кестеден алу керектігін анықтайды.[3]
  • ҚАЙДА қандай жолдарды шығарып алу керектігін көрсетеді. Бұл шамамен реляциялық алгебра таңдау жұмыс.
  • ТОП қасиеттерді ортақтастыратын жолдарды ан жиынтық функция әр топқа қолдануға болады.
  • БАР GROUP BY сөйлемімен анықталған топтардың арасынан таңдайды.
  • БОЙЫНША СҰРЫПТАУ қайтарылған жолдарға қалай тапсырыс беру керектігін көрсетеді.

Шолу

ТАҢДАУ SQL-де «сұраныс» деп аталатын ең кең таралған операция. ТАҢДАУ бір немесе бірнеше деректерді алады кестелер немесе өрнектер. Стандартты ТАҢДАУ мәлімдемелер мәліметтер базасына тұрақты әсер етпейді. Кейбір стандартты емес енгізулер ТАҢДАУ сияқты тұрақты әсер етуі мүмкін КІСІНІ ТАҢДАУ кейбір мәліметтер базасында берілген синтаксис.[4]

Сұраулар пайдаланушыға қалаған деректерді сипаттауға мүмкіндік береді мәліметтер базасын басқару жүйесі (ДҚБЖ) жүзеге асыру жоспарлау, оңтайландыру және нәтижені алу үшін қажетті физикалық операцияларды орындау қажет.

Сұрауға, әдетте, келесіден кейін, соңғы нәтижеге қосылатын бағандар тізімі кіреді ТАҢДАУ кілт сөз. Жұлдызша («*«) сұраныстың барлық кестелер бағандарын қайтаруы керектігін анықтауға болады. ТАҢДАУ SQL ішіндегі ең күрделі оператор болып табылады, оған қосымша кілт сөздер мен сөйлемдер кіреді:

  • The КІМДЕН деректерді алуға арналған кесте (лер) ді көрсететін сөйлем. The КІМДЕН сөйлем міндетті емес болуы мүмкін ҚОСЫЛЫҢЫЗ кестелерге қосылу ережелерін көрсететін тармақшалар.
  • The ҚАЙДА сөйлемде сұрау арқылы қайтарылатын жолдарды шектейтін салыстыру предикаты бар. The ҚАЙДА сөйлем нәтижелер жиынтығындағы барлық жолдарды салыстырады, онда салыстыру предикаты Шын мәніне бағаланбайды.
  • The ТОП сөйлем жалпы мәндері бар жолдарды кіші жолдар қатарына шығарады. ТОП көбінесе SQL біріктіру функцияларымен бірге немесе нәтижелер жиынтығындағы қайталанатын жолдарды жою үшін қолданылады. The ҚАЙДА тармағының алдында қолданылады ТОП тармақ.
  • The БАР сөйлемде жолдардың нәтижесінде сүзгілеу үшін қолданылатын предикат бар ТОП тармақ. Себебі ол нәтижелері бойынша әрекет етеді ТОП тармағында, біріктіру функцияларын қолдануға болады БАР сөйлем предикаты.
  • The БОЙЫНША СҰРЫПТАУ тармақ алынған деректерді сұрыптау үшін қандай бағанды ​​[-тарды] және оларды қай бағытта сұрыптауды (өсу немесе кему) анықтайды. Жоқ БОЙЫНША СҰРЫПТАУ сөйлем, SQL сұранысы қайтарылған жолдардың реті анықталмаған.
  • The БІЛУ кілт сөз[5] қайталанатын деректерді жояды.[6] Ескертіп қой БІЛУ мысал болып табылады синтаксистік қант: барлық таңдалған бағандарды тізімдеу арқылы бірдей нәтижеге қол жеткізуге болады (бірақ бар болса, жиынтық функцияларды емес) ТОП тармақ.

Келесі мысал a ТАҢДАУ сұраныс қымбат кітаптардың тізімін береді. Сұрау барлық жолдарды алады Кітап кесте, онда баға бағанда 100.00-ден үлкен мән бар. Нәтиже өсу ретімен сұрыпталады тақырып. Жұлдызшасы (*) тізімді таңдаңыз барлық бағандары екенін көрсетеді Кітап кесте нәтижелер жиынтығына қосылуы керек.

ТАҢДАУ * КІМДЕН  Кітап ҚАЙДА баға > 100.00 ТАПСЫРЫС BY тақырып;

Төмендегі мысалда кітаптардың тізімін және әр кітапқа байланысты авторлардың санын қайтару арқылы бірнеше кестенің, топтастырудың және біріктірудің сұранысы көрсетілген.

ТАҢДАУ Кітап.тақырып AS Тақырып,       санау(*) AS Авторлар КІМДЕН  Кітап ҚОСЫЛЫҢЫЗ  Кітап_авторы   ҚОСУЛЫ  Кітап.isbn = Кітап_авторы.isbn ТОП BY Кітап.тақырып;

Мысал шығысы келесідей болуы мүмкін:

Тақырып авторлары ---------------------- ------- SQL мысалдары және нұсқаулық 4 SQL 1 қуанышы SQL 2-ге кіріспе SQL 1 қателіктері

Алғышарт бойынша isbn - бұл екі кестенің жалпы баған атауы және баған аталған тақырып ғана бар Кітап кестеде жоғарыдағы сұранысты келесі түрде қайта жазуға болады:

ТАҢДАУ тақырып,       санау(*) AS Авторлар КІМДЕН  Кітап ТАБИҒИ ҚОСЫЛЫҢЫЗ Кітап_авторы ТОП BY тақырып;

Алайда, көп[сандық ] жеткізушілер бұл тәсілді қолдамайды немесе табиғи қосылыстардың тиімді жұмыс істеуі үшін баған атауының белгілі бір шарттарын талап етеді.

SQL құрамына сақталған шамалар бойынша мәндерді есептеу үшін операторлар мен функциялар кіреді. SQL ішіндегі өрнектерді пайдалануға мүмкіндік береді тізімді таңдаңыз құны 100.00-ден жоғары кітаптардың тізімін қосымша келтіретін келесі мысалдағы сияқты деректерді жобалау сату_ салығы сатылым салығының 6% -бен есептелген көрсеткіші бар баған баға.

ТАҢДАУ isbn,       тақырып,       баға,       баға * 0.06 AS сату_ салығы КІМДЕН  Кітап ҚАЙДА баға > 100.00 ТАПСЫРЫС BY тақырып;

Сұраулар

Бір сұраныстың нәтижесін реляциялық оператор немесе біріктіру функциясы арқылы екінші сұраныста қолдануға болатындай етіп сұраулар енгізуге болады. Кірістірілген сұрау а деп те аталады сұрау. Біріктіру және басқа кестелік операциялар көптеген жағдайларда есептік жағынан жоғары (яғни жылдамырақ) баламалар ұсынса да, ішкі сұраныстарды қолдану пайдалы немесе қажет болуы мүмкін иерархияны енгізеді. Келесі мысалда біріктіру функциясы AVG кіріс сұранысының нәтижесін алады:

ТАҢДАУ isbn,       тақырып,       баға КІМДЕН  Кітап ҚАЙДА баға < (ТАҢДАУ AVG(баға) КІМДЕН Кітап) ТАПСЫРЫС BY тақырып;

Ішкі сұрау сыртқы сұраныстың мәндерін қолдана алады, бұл жағдайда ол а деп аталады өзара байланысты сұрау.

1999 жылдан бастап SQL стандарты аталған ішкі сұраныстарға мүмкіндік береді жалпы кестелік өрнектер (IBM DB2 2 нұсқасының орындалуынан кейін аталған және жасалған; Oracle осыларды атайды сұранысты факторинг ). CTE болуы мүмкін рекурсивті өздеріне сілтеме жасай отырып; нәтижесінде пайда болған механизм ағаштан немесе графиктен өтуге мүмкіндік береді (қатынас ретінде ұсынылғанда) және тұтастай алғанда түзету нүктесі есептеулер.

Ішкі көрініс

Кірістірілген көрініс дегеніміз - FROM сөйлемінде SQL ішкі сұранысына сілтеме жасау. Кірістірілген көрініс негізінен таңдауға немесе қосылуға болатын ішкі сұрау болып табылады. Inline View функционалдығы пайдаланушыға ішкі сұрауға кесте ретінде сілтеме жасауға мүмкіндік береді. Кірістірілген көріністі а деп те атайды алынған кесте немесе а қосалқы таңдау. Ішкі көрініс функциясы Oracle 9i-де енгізілген.[7]

Келесі мысалда SQL операторы бастапқы сатылымдағы Кітаптар кестесінен «Сатулар» кірістірілген көрінісіне қосылуды көздейді. Бұл ішкі көрініс Кітаптар кестесіне қосылу үшін ISBN көмегімен кітап сатылымы туралы ақпаратты түсіреді. Нәтижесінде кірістірілген көрініс нәтижелер жиынтығын қосымша бағандармен қамтамасыз етеді (сатылған заттардың саны және кітап сатқан компания):

ТАҢДАУ б.isbn, б.тақырып, б.баға, сату.заттар_сатылды, сату.company_nmКІМДЕН Кітап б  ҚОСЫЛЫҢЫЗ (ТАҢДАУ ҚОРЫТЫНДЫ(Заттар_сатылды) Заттар_сатылды, Компания_Nm, ISBN        КІМДЕН Кітап_сату        ТОП BY Компания_Nm, ISBN) сату  ҚОСУЛЫ сату.isbn = б.isbn

Мысалдар

«T» кестесіСұрауНәтиже
C1C2
1а
2б
ТАҢДАУ * КІМДЕН Т;
C1C2
1а
2б
C1C2
1а
2б
ТАҢДАУ C1 КІМДЕН Т;
C1
1
2
C1C2
1а
2б
ТАҢДАУ * КІМДЕН Т ҚАЙДА C1 = 1;
C1C2
1а
C1C2
1а
2б
ТАҢДАУ * КІМДЕН Т ТАПСЫРЫС BY C1 DESC;
C1C2
2б
1а
жоқТАҢДАУ 1+1, 3*2;
`1+1``3*2`
26

T кестесі берілген сұрау ТАҢДАУ * КІМДЕН Т нәтижесінде кестенің барлық жолдарының барлық элементтері көрсетіледі.

Сол кестемен сұрау ТАҢДАУ C1 КІМДЕН Т нәтижесінде кестенің барлық жолдарының С1 бағанындағы элементтер көрсетіледі. Бұл а болжам жылы реляциялық алгебра, егер жалпы жағдайда, нәтижеде қайталанатын жолдар болуы мүмкін болмаса. Бұл кейбір мәліметтер базасында тік бөлім деп те аталады, тек көрсетілген өрістерді немесе бағандарды көру үшін сұраныстың шығуын шектейді.

Сол кестемен сұрау ТАҢДАУ * КІМДЕН Т ҚАЙДА C1 = 1 нәтижесінде C1 бағанының мәні '1' болатын барлық жолдардың барлық элементтері шығады реляциялық алгебра шарттар, а таңдау орындалатын болады, себебі ҚАЙДА деген тармаққа байланысты. Бұл белгілі бір шарттарға сәйкес сұраныстың шығуын шектейтін көлденең бөлім деп те аталады.

Бірнеше кестеде нәтижелер жиынтығы жолдардың кез келген тіркесімі болады. Егер екі кесте T1 және T2 болса, ТАҢДАУ * КІМДЕН T1, T2 әрбір T2 жолымен бірге T1 жолдарының әрбір тіркесіміне әкеледі. Мысалы, егер Т1-де 3 жол болса, ал Т2-де 5 қатар болса, онда 15 жол шығады.

Стандартта болмаса да, ДҚБЖ-нің көпшілігі таңдамалы сөйлемді кестесіз қолдана отырып, бір қатарлы ойдан шығарылған кесте қолданылған деп санайды. Бұл негізінен кесте қажет емес жерде есептеулер жүргізу үшін қолданылады.

SELECT сөйлемі қасиеттер тізімін (бағандар) атауы бойынша немесе «барлық қасиеттер» мағынасын білдіретін таңбалы таңбаны («*») көрсетеді.

Нәтиже жолдарын шектеу

Жиі қайтарылатын жолдардың максималды санын көрсету ыңғайлы. Мұны тестілеу үшін немесе егер сұрау күткеннен гөрі көбірек ақпарат берсе, артық ресурстарды тұтынудың алдын алу үшін қолдануға болады. Мұны істеу тәсілі әр сатушыға әр түрлі болады.

Жылы ISO SQL: 2003 ж, нәтижелер жиынтығын қолдану арқылы шектеуге болады

ISO SQL: 2008 ж таныстырды БІРІНШІ ФЕТХ тармақ.

PostgreSQL v.9 құжаттамасына сәйкес SQL Window функциясы ағымдағы жолмен қандай да бір түрде байланысқан кесте жолдарының жиынтығы бойынша есептеуді орындайды, біріктірілген функцияларға ұқсас жолмен.[8]Атауы сигналды өңдеуді еске түсіреді терезе функциялары. Терезенің функционалдық шақыруында әрқашан ӨТТІ тармақ.

ROW_NUMBER () терезенің функциясы

ROW_NUMBER () асып кетті үшін қолданылуы мүмкін қарапайым кесте қайтарылған жолдарда, мысалы. он жолдан артық емес қайтару:

ТАҢДАУ * КІМДЕН( ТАҢДАУ    ROW_NUMBER() ӨТТІ (ТАПСЫРЫС BY сұрыптау_кілті ASC) AS қатар_сан,    бағандар  КІМДЕН кесте аты) AS ақымақҚАЙДА қатар_сан <= 10

ROW_NUMBER болуы мүмкін детерминистік емес: егер сұрыптау_кілті бірегей емес, әр сұранысты іске қосқан кезде кез-келген жолға әртүрлі жол нөмірлерін алуға болады сұрыптау_кілті бірдей. Қашан сұрыптау_кілті бірегей, әр жол әрқашан бірегей жол нөмірін алады.

RANK () терезесінің функциясы

The ДӘРЕЖЕ терезенің функциясы ROW_NUMBER сияқты жұмыс істейді, бірақ одан көп немесе аз қайтарылуы мүмкін n галстук жағдайындағы жолдар, мысалы. ең жас 10 адамды қайтару үшін:

ТАҢДАУ * КІМДЕН (  ТАҢДАУ    РАНК() ӨТТІ (ТАПСЫРЫС BY жас ASC) AS рейтинг,    person_id,    адам_ аты,    жас  КІМДЕН адам) AS ақымақҚАЙДА рейтинг <= 10

Жоғарыда келтірілген код оннан астам жолды қайтара алады, мысалы. егер бір жастағы екі адам болса, он бір қатарға оралуы мүмкін.

БІРІНШІ Сөйлемді FETCH

ISO бастап SQL: 2008 ж нәтижелер шектерін келесі мысалда көрсетілгендей етіп көрсетуге болады БІРІНШІ ФЕТХ тармақ.

ТАҢДАУ * КІМДЕН Т FETCH БІРІНШІ 10 ҚАТАР ТЕК

Қазіргі уақытта бұл сөйлемге CA DATACOM / DB 11, IBM DB2, SAP SQL Anywhere, PostgreSQL, EffiProz, H2, HSQLDB 2.0 нұсқасы, Oracle 12c және Mimer SQL.

Microsoft SQL Server 2008 және одан жоғары нұсқалары тіректер БІРІНШІ ФЕТХ, бірақ оның бөлігі болып саналады БОЙЫНША СҰРЫПТАУ тармақ. The БОЙЫНША СҰРЫПТАУ, ӨШІРУ, және БІРІНШІ ФЕТХ осы пайдалану үшін барлық тармақтар қажет.

ТАҢДАУ*КІМДЕНТТАПСЫРЫСBYбағанаDESCӨШІРУ0ҚАТАРFETCHБІРІНШІ10ҚАТАРТЕК

Стандартты емес синтаксис

Кейбір МҚБЖ SQL стандартты синтаксисінің орнына немесе оған қосымша стандартты емес синтаксисті ұсынады. Төменде, нұсқалары қарапайым шек әр түрлі ДҚБЖ-ға арналған сұраныстар тізімделген:

ОРНАТУROWCOUNT10ТАҢДАУ*КІМДЕНТ
MS SQL Server (Бұл Microsoft SQL Server 6.5-те жұмыс істейді, ал Т-дан жоғарғы 10 * таңдаңыз жоқ)
ТАҢДАУ * КІМДЕН Т ШЕК 10 ӨШІРУ 20
Нетезца, MySQL, MariaDB, SAP SQL кез келген жерде, PostgreSQL (8.4 нұсқасынан бастап стандартты қолдайды), SQLite, HSQLDB, H2, Vertica, Полиэдр, Couchbase сервері, Снежинканы есептеу, OpenLink виртуозы
ТАҢДАУ * бастап Т ҚАЙДА ROWNUM <= 10
Oracle
ТАҢДАУ БІРІНШІ 10 * Т-дан Ингрес
ТАҢДАУ БІРІНШІ 10 * T тапсырысынан a Информикс
ТАҢДАУ 20 ӨТКІЗУ БІРІНШІ 10 * Т-дан тапсырыс бойынша с, г. Информикс (жол нөмірлері бойынша сұрыпталғаннан кейін сүзіледі. SKIP сөйлемі v10.00.xC4 түзету бумасында енгізілген)
ТАҢДАУ ТОП 10 * Т-данMS SQL Server, SAP ASE, MS Access, SAP IQ, Терадата
ТАҢДАУ * КІМДЕН Т ҮЛГІ 10
Терадата
ТАҢДАУ ТОП 20, 10 * Т-данOpenLink виртуозы (20 өткізеді, келесі 10 жеткізеді)[9]
ТАҢДАУ ТОП 10 20-дан БАСТАЛАДЫ * Т-данSAP SQL кез келген жерде (сонымен қатар 9.0.1 нұсқасынан бастап стандартты қолдайды)
ТАҢДАУ БІРІНШІ 10 ӨТКІЗУ 20 * Т-данFirebird
ТАҢДАУ * КІМДЕН ТҚАТАР 20 TO 30
Firebird (2.1 нұсқасынан бастап)
ТАҢДАУ * КІМДЕН ТҚАЙДА ID_T > 10 FETCH БІРІНШІ 10 ҚАТАР ТЕК
DB2
ТАҢДАУ * КІМДЕН ТҚАЙДА ID_T > 20 FETCH БІРІНШІ 10 ҚАТАР ТЕК
DB2 (жаңа жолдар Т кестесінің кілттерімен салыстырғаннан кейін сүзіледі)

Жолдарды беттеу

Жолдарды беттеу[10] - бұл мәліметтер базасында сұраудың жалпы мәліметтерінің тек бір бөлігін шектеу және бейнелеу үшін қолданылатын тәсіл. Бір уақытта жүздеген немесе мыңдаған жолдарды көрсетудің орнына серверге тек бір парақ сұралады (жолдардың шектеулі жиынтығы, мысалы үшін 10 жол), ал пайдаланушы келесі бетті, содан кейін келесі парақты сұрау арқылы шарлауды бастайды. , және тағы басқа. Бұл өте пайдалы, әсіресе веб-жүйелерде, мұнда клиент пен сервер арасында арнайы байланыс жоқ, сондықтан клиент сервердің барлық жолдарын оқып, көрсетуді күтудің қажеті жоқ.

Беттеу тәсіліндегі мәліметтер

  • {жолдар} = Беттегі жолдар саны
  • {page_number} = Ағымдағы парақтың нөмірі
  • {begin_base_0} = Жолдың нөмірі - парақ басталатын 1 = = бет_сан-1) * жолдар

Қарапайым әдіс (бірақ өте тиімсіз)

  1. Деректер базасынан барлық жолдарды таңдаңыз
  2. Барлық жолдарды оқыңыз, бірақ оқылған жолдардың санының_ саны арасында болғанда ғана көрсетуге жіберіңіз {begin_base_0 + 1} және {begin_base_0 + жолдар}
Таңдаңыз * бастап {кесте} тапсырыс арқылы {бірегей_кілт}

Басқа қарапайым әдіс (барлық жолдарды оқығаннан гөрі тиімді)

  1. Көрсету үшін кестенің басынан бастап соңғы жолына дейінгі барлық жолдарды таңдаңыз ({begin_base_0 + жолдар})
  2. Оқу {begin_base_0 + жолдар} жолдар, бірақ оқылған жолдардың санының_ саны үлкен болғанда ғана көрсетуге жіберіледі {begin_base_0}
SQLДиалект
таңдаңыз*бастап{кесте}тапсырысарқылы{бірегей_кілт}FETCHБІРІНШІ{бастау_ негіз_0+жолдар}ҚАТАРТЕК
SQL ANSI 2008
PostgreSQL
SQL Server 2012
Дерби
Oracle 12c
DB2 12
Таңдаңыз *бастап {кесте}тапсырыс арқылы {бірегей_кілт}ШЕК {бастау_ негіз_0 + жолдар}
MySQL
SQLite
ТаңдаңызTOP{бастау_ негіз_0+жолдар}*бастап{кесте}тапсырысарқылы{бірегей_кілт}
SQL Server 2005
ОРНАТУROWCOUNT{бастау_ негіз_0+жолдар}Таңдаңыз*бастап{кесте}тапсырысарқылы{бірегей_кілт}ОРНАТУROWCOUNT0
Sybase, SQL Server 2000
Таңдаңыз *    КІМДЕН (        ТАҢДАУ *         КІМДЕН {кесте}         ТАПСЫРЫС BY {бірегей_кілт}    ) а қайда rownum <= {бастау_ негіз_0 + жолдар}
Oracle 11


Позициялау әдісі

  1. Тек таңдаңыз {жолдар} көрсету үшін келесі жолдан басталатын жолдар ({begin_base_0 + 1})
  2. Деректер базасынан оқылған барлық жолдарды көрсету үшін оқыңыз және жіберіңіз
SQLДиалект
Таңдаңыз *бастап {кесте}тапсырыс арқылы {бірегей_кілт}ӨШІРУ {бастау_ негіз_0} ҚАТАРFETCH КЕЛЕСІ {жолдар} ҚАТАР ТЕК
SQL ANSI 2008
PostgreSQL
SQL Server 2012
Дерби
Oracle 12c
DB2 12
Таңдаңыз *бастап {кесте}тапсырыс арқылы {бірегей_кілт}ШЕК {жолдар} ӨШІРУ {бастау_ негіз_0}
MySQL
MariaDB
PostgreSQL
SQLite
Таңдаңыз * бастап {кесте} тапсырыс арқылы {бірегей_кілт}ШЕК {бастау_ негіз_0}, {жолдар}
MySQL
MariaDB
SQLite
ТаңдаңызTOP{бастау_ негіз_0+жолдар}*,_offset=жеке басын куәландыратын(10)ішіне# уақытшабастап{кесте}ТАПСЫРЫСBY{бірегей_кілт}таңдаңыз*бастап# уақытшақайда_offset>{бастау_ негіз_0}ТҮСІРУКЕСТЕ# уақытша
12.5.3 Sybase:
ОРНАТУROWCOUNT{бастау_ негіз_0+жолдар}таңдаңыз*,_offset=жеке басын куәландыратын(10)ішіне# уақытшабастап{кесте}ТАПСЫРЫСBY{бірегей_кілт}таңдаңыз*бастап# уақытшақайда_offset>{бастау_ негіз_0}ТҮСІРУКЕСТЕ# уақытшаОРНАТУROWCOUNT0
12.5.2 Sybase:
таңдаңызTOP{жолдар}*бастап(таңдаңыз*,ROW_NUMBER()аяқталды(тапсырысарқылы{бірегей_кілт})сияқты_offsetбастап{кесте})ххқайда_offset>{бастау_ негіз_0}


SQL Server 2005
ОРНАТУROWCOUNT{бастау_ негіз_0+жолдар}таңдаңыз*,_offset=жеке басын куәландыратын(int,1,1)ішіне# уақытшабастап{кесте}ТАПСЫРЫСBY{бірегей-кілт}таңдаңыз*бастап# уақытшақайда_offset>{бастау_ негіз_0}ТҮСІРУКЕСТЕ# уақытшаОРНАТУROWCOUNT0
SQL Server 2000
ТАҢДАУ * КІМДЕН (    ТАҢДАУ rownum-1 сияқты _offset, а.*     КІМДЕН(        ТАҢДАУ *         КІМДЕН {кесте}         ТАПСЫРЫС BY {бірегей_кілт}    ) а     ҚАЙДА rownum <= {бастау_ негіз_0 + cant_regs})ҚАЙДА _offset >= {бастау_ негіз_0}
Oracle 11


Сүзгісі бар әдіс (бұл өте күрделі, бірақ өте үлкен мәліметтер жиынтығы үшін қажет)

  1. Тек содан кейін таңдаңыз {жолдар} жолдар:
    1. Бірінші бет: тек біріншісін таңдаңыз {жолдар} мәліметтер базасының түріне байланысты қатарлар
    2. Келесі бет: тек біріншісін таңдаңыз {жолдар} жолдар, мәліметтер базасының түріне байланысты, қайда {бірегей_кілт} қарағанда үлкен {last_val} (мәні {бірегей_кілт} ағымдағы беттегі соңғы жолдың)
    3. Алдыңғы бет: деректерді кері тәртіпте сұрыптаңыз, тек біріншісін таңдаңыз {жолдар} жолдар, онда {бірегей_кілт} аз {first_val} (мәні {бірегей_кілт} ағымдағы беттегі бірінші жолдың), нәтижені дұрыс ретпен сұрыптаңыз
  2. Деректер базасынан оқылған барлық жолдарды көрсету үшін оқыңыз және жіберіңіз
Бірінші бетКелесі бетАлдыңғы бетДиалект
таңдаңыз*бастап{кесте}тапсырысарқылы{бірегей_кілт}FETCHБІРІНШІ{жолдар}ҚАТАРТЕК
таңдаңыз*бастап{кесте}қайда{бірегей_кілт}>{соңғы_val}тапсырысарқылы{бірегей_кілт}FETCHБІРІНШІ{жолдар}ҚАТАРТЕК
таңдаңыз*бастап(таңдаңыз*бастап{кесте}қайда{бірегей_кілт}<{бірінші_val}тапсырысарқылы{бірегей_кілт}DESCFETCHБІРІНШІ{жолдар}ҚАТАРТЕК)атапсырысарқылы{бірегей_кілт}
SQL ANSI 2008
PostgreSQL
SQL Server 2012
Дерби
Oracle 12c
DB2 12
таңдаңыз *бастап {кесте}тапсырыс арқылы {бірегей_кілт}ШЕК {жолдар}
таңдаңыз * бастап {кесте} қайда {бірегей_кілт} > {соңғы_val}тапсырыс арқылы {бірегей_кілт}ШЕК {жолдар}
таңдаңыз *  бастап (   таңдаңыз *    бастап {кесте}    қайда {бірегей_кілт} < {бірінші_val}   тапсырыс арқылы {бірегей_кілт} DESC   ШЕК {жолдар} ) а тапсырыс арқылы {бірегей_кілт}
MySQL
SQLite
таңдаңызTOP{жолдар}*бастап{кесте}тапсырысарқылы{бірегей_кілт}
таңдаңызTOP{жолдар}*бастап{кесте}қайда{бірегей_кілт}>{соңғы_val}тапсырысарқылы{бірегей_кілт}
таңдаңыз*бастап(таңдаңызTOP{жолдар}*бастап{кесте}қайда{бірегей_кілт}<{бірінші_val}тапсырысарқылы{бірегей_кілт}DESC)атапсырысарқылы{бірегей_кілт}
SQL Server 2005
ОРНАТУROWCOUNT{жолдар}таңдаңыз*бастап{кесте}тапсырысарқылы{бірегей_кілт}ОРНАТУROWCOUNT0
ОРНАТУROWCOUNT{жолдар}таңдаңыз*бастап{кесте}қайда{бірегей_кілт}>{соңғы_val}тапсырысарқылы{бірегей_кілт}ОРНАТУROWCOUNT0
ОРНАТУROWCOUNT{жолдар}таңдаңыз*бастап(таңдаңыз*бастап{кесте}қайда{бірегей_кілт}<{бірінші_val}тапсырысарқылы{бірегей_кілт}DESC)атапсырысарқылы{бірегей_кілт}ОРНАТУROWCOUNT0
Sybase, SQL Server 2000
таңдаңыз *бастап (    таңдаңыз *     бастап {кесте}     тапсырыс арқылы {бірегей_кілт}  ) а қайда rownum <= {жолдар}
таңдаңыз *бастап (  таңдаңыз *   бастап {кесте}   қайда {бірегей_кілт} > {соңғы_val}  тапсырыс арқылы {бірегей_кілт}) а қайда rownum <= {жолдар}
таңдаңыз *  бастап (   таңдаңыз *   бастап (     таңдаңыз *      бастап {кесте}      қайда {бірегей_кілт} < {бірінші_val}     тапсырыс арқылы {бірегей_кілт} DESC   ) a1   қайда rownum <= {жолдар} ) a2 тапсырыс арқылы {бірегей_кілт}
Oracle 11

Иерархиялық сұраныс

Кейбір деректер базалары қамтамасыз етеді мамандандырылған синтаксис үшін иерархиялық деректер.

Терезе функциясы SQL: 2003 ж болып табылады жиынтық функция нәтижелер жиынтығының бөліміне қолданылады.

Мысалға,

қосынды (халық)

бірдей болатын барлық жолдардың популяцияларының қосындысын есептейді қала ағымдағы жол ретінде мән.

Бөлімдер көрсетілген ӨТТІ жиынтығын өзгертетін сөйлем. Синтаксис:

 :: = ҮСТІН ([БӨЛІМ >, ...] [Тапсырыс <өрнек>])

OVER сөйлемі бөлуге және нәтижелер жиынтығына тапсырыс беруге болады. Тапсырыс қатарға қатысты функциялар үшін қолданылады, мысалы, қатар_нөмірі.

ANSI сұранысын бағалау

ANSI SQL бойынша SELECT операторын өңдеу келесідей болады:[11]

  1. таңдаңыз ж.*бастап пайдаланушылар сен ішкі қосылу топтар ж қосулы ж.Қолданушының ID = сен.Қолданушының IDқайда сен.Тек = 'Смит'және сен.Аты = 'Джон'
  2. FROM сөйлемі бағаланады, FROM сөйлеміндегі алғашқы екі кесте үшін кросс қосылыс немесе декарттық өнім жасалады, нәтижесінде Vtable1 ретінде виртуалды кесте пайда болады
  3. ON сөйлемі vtable1 үшін бағаланады; тек g.Userid = u.Userid қосылу шартына сәйкес келетін жазбалар Vtable2-ге енгізіледі
  4. Егер сыртқы қосылыс көрсетілген болса, vTable2-ден түсірілген жазбалар VTable 3-ке қосылады, мысалы, егер жоғарыдағы сұрау:
    таңдаңыз сен.*бастап пайдаланушылар сен сол қосылу топтар ж қосулы ж.Қолданушының ID = сен.Қолданушының IDқайда сен.Тек = 'Смит'және сен.Аты = 'Джон'
    кез-келген топқа кірмеген барлық пайдаланушылар Vtable3-ке қайта қосылады
  5. «ҚАЙДА» сөйлемі бағаланады, бұл жағдайда тек пайдаланушы Джон Смитке арналған топтық ақпарат vTable4-ке қосылады
  6. GROUP BY бағаланады; егер жоғарыдағы сұрау:
    таңдаңыз ж.Топ аты, санау(ж.*) сияқты Қатысушылар саныбастап пайдаланушылар сен ішкі қосылу топтар ж қосулы ж.Қолданушының ID = сен.Қолданушының IDтоп арқылы Топ аты
    vTable5 топтастырылған vTable4-тен қайтарылған мүшелерден тұрады, бұл жағдайда GroupName
  7. HAVING сөйлемі HAVING сөйлемі дұрыс және vTable6 ішіне енгізілген топтар үшін бағаланады. Мысалға:
    таңдаңыз ж.Топ аты, санау(ж.*) сияқты Қатысушылар саныбастап пайдаланушылар сен ішкі қосылу топтар ж қосулы ж.Қолданушының ID = сен.Қолданушының IDтоп арқылы Топ атыбар санау(ж.*) > 5
  8. SELECT тізімі бағаланады және Vtable 7 ретінде қайтарылады
  9. DISTINCT сөйлемі бағаланады; қайталанатын жолдар алынып, Vtable 8 ретінде қайтарылады
  10. ORDER BY сөйлемі бағаланады, жолдарға тапсырыс беріп, VCursor9 қайтарады. Бұл кесте емес, курсор, өйткені ANSI жүгіргіні жолдардың реттелген жиынтығы ретінде анықтайды (реляциялық емес).

RDBMS жеткізушілерінің терезе функциясын қолдауы

Реляциялық мәліметтер базасы мен SQL қозғалтқыштарын жеткізушілердің терезе функциясының мүмкіндіктерін жүзеге асыруы өте ерекшеленеді. Көптеген дерекқорлар терезе функцияларының ең болмағанда хош иісін қолдайды. Алайда, мұқият қарасақ, көптеген сатушылар стандарттың ішкі жиынтығын ғана жүзеге асыратыны белгілі болады. Мысал ретінде қуатты RANGE тармағын алайық. Бұл мүмкіндікті тек Oracle, DB2, Spark / Hive және Google Big Query қолданады. Жақында сатушылар стандартқа жаңа кеңейтулер қосты, мысалы. массивті біріктіру функциялары. Бұлар SQL-ді үлестірілген файлдық жүйеге (Hadoop, Spark, Google BigQuery) қарсы іске қосқан кезде пайдалы, өйткені бізде үлестірілген реляциялық мәліметтер базасына (MP) қарағанда мәліметтердің бірлескен жергілікті кепілдіктері әлсіз. Деректерді барлық түйіндер бойынша біркелкі таратудан гөрі, үлестірілген файлдық жүйеге қатысты сұраныстарды іске қосатын SQL қозғалтқыштары деректерді ұялау арқылы деректердің бірлескен мекен-жай кепілдіктеріне қол жеткізе алады және осылайша желідегі ауыр араласуды қосатын ықтимал қымбат қосылыстардың алдын алады. Терезе функцияларында қолдануға болатын пайдаланушы анықтаған жиынтық функциялар - тағы бір өте күшті функция.

T-SQL-де деректерді құру

Барлығын біріктіру негізінде деректерді қалыптастыру әдісі

таңдаңыз 1 а, 1 б одақ барлықтаңдаңыз 1, 2 одақ барлықтаңдаңыз 1, 3 одақ барлықтаңдаңыз 2, 1 одақ барлықтаңдаңыз 5, 1

SQL Server 2008 SQL3 («SQL: 1999») стандартында көрсетілген «жол конструкторын» қолдайды

таңдаңыз *бастап (құндылықтар (1, 1), (1, 2), (1, 3), (2, 1), (5, 1)) сияқты х(а, б)

Әдебиеттер тізімі

  1. ^ Microsoft. «Transact-SQL синтаксистік келісімдері».
  2. ^ MySQL. «SQL SELECT синтаксисі».
  3. ^ FROM сөйлемін алып тастау стандартты емес, бірақ көптеген DBMS файлдары рұқсат етеді.
  4. ^ «Transact-SQL сілтемесі». SQL Server тіліне сілтеме. SQL Server 2005 Books Online. Microsoft. 2007-09-15. Алынған 2007-06-17.
  5. ^ SAS 9.4 SQL процедураларын пайдалану жөніндегі нұсқаулық. SAS институты. 2013. б. 248. ISBN  9781612905686. Алынған 2015-10-21. ЕРЕКШЕ аргумент DISTINCT-пен бірдей болғанымен, ANSI стандарты емес.
  6. ^ Леон, Алексис; Леон, Мэтьюз (1999). «Көшірмелерді жою - DISTINCT көмегімен таңдау». SQL: толық анықтама. Нью-Дели: Tata McGraw-Hill Education (жарияланған 2008). б. 143. ISBN  9780074637081. Алынған 2015-10-21. [...] DISTINCT кілт сөзі [...] нәтижелер жиынтығындағы көшірмелерді жояды.
  7. ^ Сілтеме қатесі: аталған сілтеме Кірістірілген көрініс / алынған кесте шақырылған, бірақ ешқашан анықталмаған (қараңыз анықтама беті).
  8. ^ PostgreSQL 9.1.24 құжаттамасы - 3-тарау. Қосымша мүмкіндіктер
  9. ^ OpenLink бағдарламалық жасақтамасы. «9.19.10. TOP SELECT опциясы». docs.openlinksw.com. Алынған 1 қазан 2019.
  10. ^ Инг. Оскар Бонилла, MBA
  11. ^ Microsoft SQL Server 2005 ішінде: Ицик Бен-Ган, Любор Коллар және Дежан Сарканың T-SQL сұраулары

Дереккөздер

  • Көлденең және тік бөлу, Microsoft SQL Server 2000 Online Books.

Сыртқы сілтемелер