Top Banner
Өгөгдлийн сан удирдах систем
46
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: SQL

Өгөгдлийн сан удирдах

систем

Page 2: SQL

Лекц - 1

SQL Server нь бусад Server-тэй ижилхэн байдлаар зохион байгуулагдсан.

SQL нь график интерфэйс сайтай. SQL 9.2 хэлийг бүх өгөгдлийн сан удирдах систем авч ашигладаг.

SQL Server - Standard edition enterprise

- Desktop edition

SQL серверийн бүтэц зохион байгуулалт

Microsoft SQL Server бол SQL буюу Structured Query Language хэл дээр үндэслэгдсэн, клиент сервер

өгөгдлийн сан удирдах системүүдтэй харьцуулахад олон шинж чанараараа давуу байдаг. Үүнд:

1. MS SQL 7.0 нь ажиллаж байх явцдаа өөрийгөө автоматаар тохируулдаг. Хэрэв сэрвэр их

ачаалалтай ажиллаж байвал SQL сервер нь санах ой гэх мэт шаардлагатай нэмэлт нөөцийг

динамикаар авна. Хэрэв ачаалал багасвал SQL сервер нь илүүдэл нөөцөө чөлөөлж системд

өгнө. Мөн баазад өгөгдөл нэмэгдэх, хасагдахад баазын хэмжээг тохируулан өөрчилж байдаг.

2. SQL сервертэй ажиллах, системийг удирдах тохируулахад зориулсан маш хүчирхэг

багажуудтай.

3. SQL өгөгдлийн санд маш олон хэлбэрээр (ADO, OLE DB, ODBC…) хандаж ажиллах

боломжтой.

4. Команд бичих, текст бичихэд зориулсан интерактив интерфэйстэй.

5. MS SQL Server нь MS Windows 95/98, Windows NT Workstation, Windows NT Server зэрэг

үйлдлийн системүүд дээр ажиллах чадвартай.

6. Өгөгдлийн сан удирдах engine нь хэдэн мянган хэрэглэгчээр зэрэг хандагдах Terabyte

хэмжээтэй баазыг удирдах чадвартай.

7. SQL 7.0 хувилбар нь хүсэлтийг боловсруулах хурдийг ихэсгэх шинэ арга хэлбэрүүдийг

ашигладаг.

8. Хэрэв систем нэгээс олон процессортой бол SQL сервер нь хүсэлтийг хуваан параллелиар

гүйцэтгэх ба энэ нь хүсэлтийг маш хурдан биелүүлэх боломжийг олгодог.

9. MS SQL нь Microsoft Exchange болон бусад mail server-үүдээс захиа уншиж, явуулах

боломжтой.

Клиент сервер архитектур

MS SQL server нь кпиент сервер өгөгдлийн сан удирдах систем, desktop өгөгдлийн сан удирдах

систем гэсэн 2 горимд ажиллах боломжтой.

Клиент сервер өгөгдлийн сан удирдах систем

Клиент сервер систем нь өгөгдлийн бааз нь сервер компьютер дээр байрлах,олон хэрэглэгч түүнийг

клиент сервер програм хангамж ашиглан хамтран эзэмшдэг систем юм. Өгөгдлийн бааз нь нэг

байрлалд төвлөрөх нь олон төрлийн ач холбогдолтой.

- Бүх мэдээлэл төвлөрөх тул бүх хэрэглэгчид ижил мэдээлэл, өгөгдөлд хандаж ажиллах

- Бизнесийн болон хамгаалалтын дүрэм, механизмыг сервер дээр зөвхөн нэг удаа

тодорхойлоход л бүх хэрэглэгчдэд ижил үйлчилгээ үзүүлнэ.

- Хэрэглэгчийн өгсөн хүсэлтийн дагуу зөвхөн түүнд хэрэгтэй мэдээллийг буцаах тул

сүлжээгээр дамжих мэдээлэл багасаж, програмын ажиллах хурд нэмэгдэнэ.

- Клиент компьютеруудад өгөгдөл хадгалагдахгүй учир санах ой шаардлагагүй.

- Олон хэрэглэгчтэй өгөгдлийн санд нэг өгөгдлийг зэрэг өөрчлөхөд гардаг хүндрэлийг SQL

сервер зохион байгуулсан байдаг.

Page 3: SQL

Server - Internet

application Information Server

` SQL Server

client application ` SQL Server

client application

SQL Server - SQL Server

client application

Internet clients

Database computer

Internet server

Client computer Client computer

SQL баазын архитектур

MS SQL бааз нь 2 болон түүнээс дээш физик файлуудаас тогтоно. Өгөгдлийн баазыг ашиглахдаа

хэрэглэгч зөвхөн хүснэгт, процедур гэх мэт логик элементүүдтэй ажиллана. Харин физик зохион

байгуулалт нь зөвхөн администраторт л хэрэгтэй.

Table: abc Table:def Table:ghi

User view

Physical implementation

Data1.mdf Data2.ndf

Log1.ldf

Database XYZ

MS SQL сервер нь системийн баазтай (master, model, tempdb, msdb).

Page 4: SQL

Server computer

SQL Server

System databases User databases

master tempdb msdb model payroll sales employees

master

Бүх системийн мэдээллийг хадгалдаг бааз юм. Үүнд бүх хэрэглэгчийн бүртгэл, системийн

тохиргооны мэдээлэл орно. Мөн энэ баазад системд оршин байгаа бүх хэрэглэгчийн баазуудийн

тухай, мөн тэдгээрийн физик файлын тухай мэдээлэл хадгалагдана.

tempdb

Энэ баазад бүх түр зуурын хүснэгтүүд, процедурууд байдаг. Мөн SQL серверийн үйл ажиллагаанд

хэрэгтэй бусад түр зуурын өгөгдлүүдийг хадгалдаг. SQL сервер эхэлж ачаалагдах бүрдээ энэ баазыг

хоослон шинэчилж байдаг.

model

Системд үүсгэгдэх бүх баазын хувьд загвар болон ашиглагддаг бааз юм. CREATE DATABASE

команд ажиллан шинэ бааз үүсгэхдээ

msdb

Энэ бааз нь SQL Server Agent-д ашиглагдах ба төлөвлөгдсөн ажил, мэдээллүүдийг хадгалдаг.

SQL server-ийг удирдах

SQL server үйлдлийн систем эхдэх бүрт автоматаар ачаалагдаж болно. Үүнийг MS SQL- ийг

суурилуулж байх үедээ тохируулна. Энэ нь үйлдлийн системд нэвтэрч ороогүй байсан ч ажиллана

гэсэн үг. SQL server ба SQL Server Agent-ууд тусдаа ажилладаг, тусдаа ачаалагддаг. Хоѐул эхлэх, түр

зогсох, зогсох гэсэн үйлдлүүдтэй. SQL server ажиллаж байх үед SQL server-т хандах боломжтой.

SQL server-ийг эхлүүлэх

SQL server-ийг эхлүүлэх дараах аргууд байдаг.

1. SQL Server Enterprise Manager- Бүх үйлдлийг хийх бололцоотой.

2. SQL Server Service Manager- Agent SQL Server хоѐрын эхлэх , түр зогсох, автоматаар эхлүүлэх

тохиргоог хийдэг програм. Taskbar дээр орсон байдаг. Байнга ажилладаг.

3. Control Panel-> Administration-> Services – Энд бүх Service-үүд жагсаатай байдаг. Эндээс

эхлүүлэх, түр зогсоох боломжтой.

4. CMD-> netstart mssqlserver

CMD-> netstart sqlserver

CMD-> netstart SQLServerAgent -командуудаар мөн ажиллуулж болно.

SQL Server-ийг нэг хэрэглэгчийн горимд эхлүүлэх

Зарим онцгой тохиолдолд SQL Server-ийг нэг хэрэглэгчийн горимд эхлүүлэх шаардлага гардаг.

Жишээ нь: server-ийн тохиргоог өөрчлөх, эвдэрсэн баазыг засварлах гэх мэт.

Ингэхийн тулд –m гэсэн тохируулгыг ашиглана. cmd-> netstart mssqlserver –m

SQL Server-ийг нэг хэрэглэгчийн горимд эхлүүлэх үед

Зөвхөн нэг л хэрэглэгч серверт холбогдоно.

CHECKPOINT процесс ажиллахгүй.

Системийн процедур sp_configure нь allow updates тохиргоог зөвшөөрнө.

Page 5: SQL

SQL Server-ийг хамгийн бага нөхцөлтэйгөөр эхлүүлэх

Хэрэв серверийн тохиргооны асуудлыг засварлах шаардлагатай бол түүнийг хамгийн бага

тохиргоотойгоор эхлүүлэх хэрэгтэй. Ингэхдээ –f гэсэн тохиргоог ашиглана.

cmd-> netstart mssqlserver –f

Энэ үед сервер автоматаар нэг хэрэглэгчийн горимд ордог. Server хамгийн бага нөхцөлтэйгөөр эхлэх

үед:

Санах ойг зөвхөн түр хугацаагаар ашиглахаар тохируулна. Мөн серверийн хувьсагчдийн

утгыг sp_configure процедур хамгийн бага байхаар тогтоодог.

SQL Server нэг хэрэглэгчийн горимд эхлэнэ.

Алсын хэрэглэгчийн хандалтыг хориглоно.

Сервер эхлэхэд ажилладаг процедурууд ажиллахгүй.

Ингэж серверийг хамгийн бага горимд эхлүүлсний дараа, холбогдох хувьсагч, тохируулгуудыг

өөрчлөөд серверээ дахин ачаалах шаардлагатай.

SQL Server-ийг хамгийн бага горимд эхлүүлэхээсээ өмнө SQL Server Agent service-ийг заавал

зогсоосон байх шаардлагатай. Тэгэхгүй бол SQL Server Agent service нь серверт холбогдсон холболт

ашиглаж байдаг тул серверийг хамгийн бага горимд эхлүүлэх боломжгүй байдаг.

SQL Server-т бүртгүүлж орох буюу log in хийх

Серверт холбогдож орохын тулд Enterprise Manager болон бусад график интерфэйсүүдийг ашиглаж

болох ба командын мөрөөс osql командыг ашиглана. График интерфэйс ашиглан серверт холбогдох

үед серверийн нэр, хэрэглэгчийн ID, нууц үгийг асуусан диалог гарна. SQL server-т windows

Authentication ашиглан холбогдож болно. Ингэж серверт холбогдоход ID, нууц үг ашиглах

шаардлагагүй.

SQL серверийг суурилуулсны дараа эхний удаа холбогдох үед sa (system administrator) гэсэн

хэрэглэгчийн нэрийг ашиглана. sa нь эхлээд хоосон нууц үгтэй байна.

Server-ийг эхлүүлэх бусад тохиргоо

SQL Server-ийг суурилуулах үед суурилулагч нь Windows Registry-д анхдагч тохиргоог хийж өгдөг.

Эдгээр тохиргоог ашиглан өөр master баазыг тодорхойлж болно.

Анхдагч тохиргоо Тайлбар -d master_file_path master баазын хаяг. (C:\Mssql7\Data\Master.mdf) -e error_log_path Алдааны мэдээлэл хадгалах файл. (C:\Mssql7\Log\Errorlog) -l master _log_path master баазын бичлэгийн файл. (C:\Mssql7\Data\Mastlog.ldf)

Мөн бусад тохиргоог ашиглан SQL серверийг эхлүүлж болно.

Бусад тохиргоо Тайлбар -c SQL серверийн эхлэх хугацааг багасгаж үйлдлийн системээс

тусгаарлана. Windows-д service болж ордоггүй. -f SQL серверийг хамгийн бага горимд эхлүүлнэ. -m Нэг хэрэглэгчийн горимд эхлүүлнэ. -n -e-г хамт ашиглах хэрэгтэй.. -p precision_level Decimal ба numeric төрлийн орны тоо, хэмжээг тогтоож өгнө.

Анхдагч тохиргоо нь 28 байна. Авч болох утга нь 1-38 байна -s registry_key Серверийг эхлүүлнэ. Энэ тохиргоо нь командын мөрөөс л

ажиллана. -x Ажиллах явцын статистик үзүүлэлтүүдийг бэлтгэхгүй.

Page 6: SQL

Лекц - 2

Өгөгдлийн сан буюу бааз үүсгэх, зохион байгуулах

SQL Server-ийн бааз нь хүснэгт, индекс, процедур, триггер зэрэг обьектуудаас тогтоно.

Өгөгдлийн санг төлөвлөх

1. Мэдээлэл цуглуулах

2. Обьектуудыг тодорхойлох

3. Обьектуудыг загварчлах

4. Обьект бүрийн хувьд агуулах мэдээллийн төрлийг тодорхойлох

5. Обьектуудын хоорондох хамаарлыг тодорхойлох

Мэдээлэл цуглуулах

Бааз үүсгэхэд шаардлагатай бүх мэдээллийг цуглуулах алхам юм. Хэрэв хуучин систем нь цаас

ашиглан бүртгэл гүйцэтгэдэг байсан бол эндээс системийн тухай мэдээлэл цуглуулна. Мөн системд

хамаарах бүх нэгжээс тэдний хэрэгцээ шаардлагыг судалж, мэдээлэл цуглуулах нь чухал.

Обьектуудыг тодорхойлох

Мэдээлэл цуглуулах явцдаа тухайн баазад хадгалагдах үндсэн обьектуудыг тодорхойлно. Обьект нь

хүн, бараа материал гэх мэт биет зүйлс, бизнесийн ажил гүйлгээ, салбар нэгжийн бүртгэл, тайлангийн

үе гэх мэт биет бус зүйлс байж болно. Ер нь системд цөөн тооны үндсэн обьект, харин түүнтэй

холбоотой бусад обьектууд байдаг.

Обьектуудыг загварчлах

Систем дэх обьектуудаа тодорхойлсны дараа тэдгээрийн шинж чанарыг тодорхойлж загварчлах

шаардлагатай байдаг. Үунийг гүйцэтгэхийн тулд урьд нь өгөгдлийн сан зохион байгуулагчид үзэг,

цаас ашиглан төлөвлөх, эсвэл тусгай програм ашиглан гүйцэтгэдэг байсан. Харин SQL Enterprise

Manager програм нь өөртөө энэ зорилгоор ашиглагдах визуаль багажтай байдаг.

Обьект бүрийн хувьд агуулах мэдээллийн төрлийг тодорхойлох

Өгөгдлийн сан дахь үндсэн обьектуудыг тодорхойлон хүснэгт үүсгээд тэдгээрийн агуулах мэдээллийг

тогтооно. Энэ нь хүснэгтийн багануудыг тодорхойлно гэсэн үг юм.

Обьектуудын хоорондох хамаарлыг тодорхойлох

Обьектуудын хоорондох хамаарлыг тогтоохын тулд хүснэгтүүдийн хоорондох логик холбоог

тодорхойлох хэрэгтэй.

Анхааруулга: master бааз дотор хэрэглэгчийн ямар ч обьект үүсгэж болохгүй. Учир нь бааз

системийн эзэмшилд ашиглагддаг.

Өгөгдлийн сан үүсгэх

Өгөгдлийн сан үүсгэхийн тулд өгөгдлийн сангын нэр, түүний эзэмшигч буюу өгөгдлийн санг үүсгэгч,

хэмжээ зэрэг өгөгдөл шаардлагатай.

1. Өгөгдлйин сангийн анхдагч өгөгдлүүдийг үүсгэх, өөрчлөх эрхийг sysadmin ба dbcreator

хэрэглэгчдэд олгох хэрэгтэй.

2. Өгөгдлийн санг үүсгэсэн хэрэглэгч тухайн баазын эзэмшигч болно.

3. Хамгийн ихдээ нэг серверт 32,767 ширхэг өгөгдлийн сан үүсгэх боломжтой.

4. Өгөгдлийн сангийн нэр нь идентификаторын шаардлагыг хангаж байх ѐстой.

Өгөгдлийн санг хадгалахын тулд дараах төрлийн файлууд ашиглагддаг.

1. Үндсэн файл – Өгөгдлийн сангийн тухай үндсэн мэдээлэл болон өгөгдөл хадгална. Өгөгдлийн

сан бүрт нэг үндсэн файл байна.

2. Нэмэлт файл - Үндсэн файлд багтаагүй бусад өгөгдлийг хадгална. Хэрэв үндсэн файл нь том

хэмжээтэй бөгөөд бүх мэдээллийг хадгалах багтаамжтай бол нэмэлт файл шаардлагагүй.

Page 7: SQL

Зарим баазууд маш том хэмжээтэй зохион байгуулагддаг учир хэд хэдэн нэмэлт файл

шаарддаг. Эсвэл хэд хэдэн диск дээр өгөгдлөө хувааж байрлуулдаг.

3. Бичлэгийн файл – Өгөгдлийн санг сэргээхэд шаардлагатай үйл явдлын бичлэгийг хадгалдаг

файл. Өгөгдлийн сан бүрт ядаж нэг бичлэгийн файл байх ѐстой. Энэ файлын хамгийн бага

хэмжээ 512KB байна.

Анхааруулга: MSSQL Server системийн өгөгдлийн болон бичлэгийн файлууд нь шахагдсан файлын

систем дээр эсвэл алсын компьютерийн диск дээр байрлах ѐсгүй.

Өгөгдлийн сан үүсгэж байхдаа файлын хамгийн их хэмжээг тогтоож өгөх ёстой. Ингэх нь

файлын хэмжээ өсч диск дүүргэхээс сэргийлнэ.

Хамгийн их хэмжээг зааж өгөхдөө CREATE DATABASE командын MAXSIZE параметрийг

ашиглана. Эсвэл SQL Server Enterprise Manager-ийн Restrict filegrowth (MB) –ийг ашиглана. Бааз

үүсгэсний дараа та master баазыг архивлаж авах шаардлагатай.

Partition ашиглан бааз үүсгэх

SQL server нь partition ашиглан бааз үүсгэх боломжтой. Partition нь NTFS, FAT гэх мэт аль нэг

үйлдлийн системээр форматлагдаагүй байх шаардлагатай. Зарим тохиолдолд ингэж бааз үүсгэх нь

ажиллагааны хувьд сайн байдаг боловч ихэнх тохиолдолдбаазыг файлуудаар үүсгэдэг. Partition

ашиглаж бааз үүсгэхэд хэд хэдэн дутагдалтай тал байдаг.

1. Нэг partition дээр зөвхөн нэг бааз үүсгэх боломжтой. Учир нь файлын систем байхгүй.

2. Файлын систем дээр хийгддэг copy, move, delete үйлдлүүд хийгдэхгүй.

3. Windows Backup програмаар баазыг архивлах боломжгүй. Гэхдээ SQL Server-ийн

архивлалтыг хийж болно.

4. Partition дээр үүсгэсэн учраас баазын файлыг автоматаар тэлэх боломжгүй.

5. Файлын систем дээр хийгддэг эвдэрхий блокуудыг зөөх гэх мэт үйлдлүүд хийгдэх

боломжгүй.

CREATE DATABASE команд (T-SQL)

Энэ командаар шинээр өгөгдлийн сан үүсгэнэ.

Бичигдэх хэлбэр:

CREATE DATABASE баазын нэр

[ ON [PRIMARY]

[ <файлын тодорхойлолт>[,…n] ]

[,<файл групп>[,…n] ]

]

[LOG ON { <файлын тодорхойлолт> [,…n]} ]

[ FOR LOAD | FOR ATTACH ]

<файлын тодорхойлолт>::=

( [ NAME = логик_файлын_нэр,]

FILENAME=‟ҮС_файлын_нэр‟

[, SIZE = Хэмжээ ]

[,MAXSIZE={max_хэмжээ| UNLIMITED} ]

[, FILEGROWTH= нэмэгдэх_хэмжээ] )[,…n]

<файл групп>::=

FILEGROUP Файлгруппын_нэр<файлын тодорхойлолт>[,…n]

Аргументууд

Баазын нэр

Шинээр үүсгэж байгаа баазын нэр юм. Баазын нэр нь давхцаж болохгүй мөн идентификаторын

дүрмээр нэрлэгдсэн байх шаардлагатай. Баазын нэр нь 128 хүртэлх тэмдэгтийн урттай байж болно.

Хэрэв баазын нэрийг зааж өгөөгүй тохиолдолд SQL Server нь автоматаар нэр өгдөг.

Page 8: SQL

ON

Өгөгдөл хадгалах диск файлуудыг зааж өгнө. Энэ үгийн ард <файлын тодорхойлолт>- д таслалаар

зааглан файлуудыг зааж өгнө.

PRIMARY

<Файлын тодрхойлолт>-уудын жагсаалт нь үндсэн файлыг тодорхойлно. Үндсэн файлын групп нь

бүх системийн хүснэгтүүд болон хэрэглэгчийн файл группт хамаараагүй обьектуудыг агуулна. Хэрэв

PRIMARY нь тодорхойлогдоогүй бол CREATE DATABASE командад жагсаагдсан эхний файл нь

үндсэн файл болно.

[,…n]

Олон файл тодорхойлогдсон гэдгийг үзүүлсэн тэмдэглэгээ.

LOG ON

Бичлэгийн файлуудыг зааж өгнө. Хэрэв LOG ON-д файл зааж өгөөгүй бол бичлэгийн нэг файлыг

систем автоматаар үүсгэх ба хэмжээ нь өгөгдлийн сангийн хэмжээний 25%-тай тэнцэх хэмжээтэйгээр

үүсгэгдэнэ.

FOR LOAD

Өмнөх хувилбаруудтай зохицуулах үүднээс ашиглагддаг. Өмнөх хувилбарууд дээр dbo use only

тохиргоотойгоор үүсгэгдсэн баазыг 7.0 хувилбар дээр ашиглахдаа хэрэглэнэ.

FOR ATTACH

Бааз нь өмнө байсан системээс холбогдсоныг зааж өгнө. CREATE DATABASE FOR ATTACH-ыг

шууд ашигласнаас sp_attach_db процедурыг ашигласан нь дээр байдаг. Хэрэв 16-аас их файл

тодорхойлох гэж байгаа тохиолдолд л CREATE DATABASE FOR ATTACH-ыг ашиглана.

NAME

<Файлын тодорхойлолт >-д заасан файлуудад логик нэр зааж өгнө. FOR ATTACH-ыг хэрэглэсэн үед

NAME параметр хэрэглэгдэхгүй.

логик_файлын_нэр

Үүсгэгдэх баазын логик нэрийг зааж өгнө. Иймд нэр нь идентификаторын шаардлагыг хангасан байх

ѐстой, мөн давхцахгүй нэр байх ѐстой.

FILENAME

<Файлын тодорхойлолт>-д заасан файлуудын үйлдлийн систем дэхь файлын нэрийг тодорхойлно.

‘ҮС_файлын_нэр’

<Файлын тодорхойлолт>-д заасан файлуудын үйлдлийн систем дэхь физик файлын нэр юм. Хэрэв

баазыг partition дээр үүсгэсэн бол, „ҮС_файлын_нэр‟-д дискийн нэр буюу үсгийг зааж өгнө. Хэрэв

ингэж дискийг зааж өгсөн тохиолдолд MAXSIZE, FILEGROWTH параметрууд ашиглагдахгүй.

SIZE

<Файлын тодорхойлолт>-д заасан файлын хэмжээг зааж өгнө. Хэрэв SIZE параметр заагдаагүй

тохиолдолд SQL Server нь хэмжээг 1MB-аар авна.

хэмжээ

KB ба MB –уудыг ашиглан kilobyte, megabyte-ыг зааж өгнө. Default нь MB байна. Зааж өгөх хамгийн

бага хэмжээ нь 512KB байна. Хэрэв хэмжээ нь заагдаагүй бол 1MB-аа авна.

MAXSIZE

<Файлын тодорхойлолт>-д заасан файлын хэмжээний хамгийн их хэмжээг тодорхойлно.

UNLIMITED

<Файлын тодорхойлолт>-д заасан файлын хэмжээ диск дүүртэл нэмэгдэнэ гэдгийг зааж өгнө.

Page 9: SQL

FILEGROWTH

<Файлын тодорхойлолт>-д заасан файлын хэмжээ яаж нэмэгдэхийг зааж өгнө. Энэ зааж өгөх хэмжээ

нь MAXSIZE тохиргооноос хэтэрч болохгүй.

нэмэгдэх хэмжээ

Шинээр зай хэрэгтэй болох үед ямар хэмжээгээр баазыг тэлэхийг тодорхойлно. Хэрэв 0 байвал

нэмэгдэхгүй гэсэн үг. Нэмэгдэх утгыг MB, KB эсвэл %-аар зааж өгнө. %-аар тодорхойлсон

тохиолдолд файлын хэмжээний хувиар нэмэгдүүлнэ. Хэрэв FILEGROWTH-ийг заагаагүй тохиолдолд

хэмжээ нь 10%-аар нэмэгдэнэ гэсэн анхдагч тохиргоотой байна. Энэ хэмжээ нь хамгийн багадаа 64

KB байна.

Тодруулга

CREATE DATABASE командыг ашиглан бааз үүсгэх ба баазын өгөгдөл хадгалах файлуудыг зааж

өгнө. SQL server нь CREATE DATABASE командыг ажиллуулахдаа 2 бүлэг үйлдлийг хийдэг.

1. SQL Server нь model бааз, түүний бүтцийг хуулан шинэ бааз үүсгэхэд ашиглана.

2. SQL Server дараа нь үүсгэж буй баазын бусад хэсгийг хоосноор дүүргэнэ.

Model баазад байрлах бүх хэрэглэгчийн обьектууд нь шинэ бааз үүсгэхэд хамт хуулагдана. Хэрэв

үүсгэж байгаа бүх бааздаа зарим обьектыг байлгахыг хүсвэл тэдгээр обьектоо model бааз дээр нэмж

өгч болно. Өгөгдлийн санг хадгалахын тулд үндсэн файл, нэмэлт файл, бичлэгийн файл 3

ашиглагддаг. Бүх өгөгдлийн санд ядаж үндсэн файл болон бичлэгийн файлууд байх ѐстой. Эдгээр

файлууд нь дараах өргөтгөлтэй байдаг.

Баазын үндсэн файл .mdf

Нэмэлт файл .ndf

Бичлэгийн файл .ldf

Өгөгдлийн сан бүр өөрийн эзэмшигчтэй байна. Баазыг үүсгэсэн хэрэглэгч нь эзэмшигч болно.

Өгөгдлийн сангийн эзэмшигчийг sp_changedbowner процедураар сольж болно. SQL server дээрх бүх

баазын тухай мэдээллийг авахыг хүсвэл sp_helpdb процедурыг, баазад ашиглагдаж байгаа зайг

мэдэхийг хүсвэл sp_spaceused, бааз дахь файлуудын группын мэдээллийг sp_helpfilegroup, баазад

ашиглагдаж байгаа файлуудын тухай мэдээллийг sp_helpfile процедурыг ашиглана.

SQL server-ийн өмнөх хувилбаруудад DISK INIT командыг ашиглан CREATE DATABASE командаас

өмнө тухайн баазад ашиглагдах баазаа үүсгэдэг байсан. Тэгэхээр өмнөх хувилбаруудтай зохицохын

тулд CREATE DATABASE команд нь мөн DISK INIT-ээр үүсгэсэн файлыг ашиглан бааз үүсгэдэг.

Жишээ:

А. Өгөгдлийн файл болон бичлэгийн файлыг зааж өгч бааз үүсгэх

Энэ жишээ нь Sales баазыг үүсгэж байна. PRIMARY түлхүүр үг ашиглагдаагүй учир эхний файл нь

(Sales_dat) үндсэн файл болно. Хэмжээг нь зааж өгөхдөө MB ба KB-г ашиглаагүй учир анхдагч

тохиргоогоор 10MB гэж сервер ойлгоно. Харин Sales_log файлыг тодорхойлохдоо файлын хэмжээг

megabyte-аар зааж өгсөн байна.

USE master

GO

CREATE DATABASE Sales

ON

( NAME = Sales_dat,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\saledat.mdf',

SIZE = 10,

MAXSIZE = 50,

FILEGROWTH = 5 )

LOG ON

( NAME = 'Sales_log',

FILENAME = 'c:\program files\microsoft sql server\mssql\data\salelog.ldf',

Page 10: SQL

SIZE = 5MB,

MAXSIZE = 25MB,

FILEGROWTH = 5MB )

GO

B. Олон өгөгдлийн файл, бичлэгийн олон файл ашиглан бааз үүсгэх

Энэ жишээнд Archive нэртэй 3 ширхэг 100MB хэмжээтэй өгөгдлийн файл ба 2 ширхэг 100MB-ийн

бичлэгийн файлаас бүрдэх баазыг үүсгэж байна. Үндсэн файлыг PRIMARY түлхүүр үгээр зааж өгсөн

байна. Бичлэгийн файлыг LOG ON түлхүүр үгээр тодорхойлсон байна.

USE master

GO

CREATE DATABASE Archive

ON

PRIMARY ( NAME = Arch1,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\archdat1.mdf',

SIZE = 100MB,

MAXSIZE = 200,

FILEGROWTH = 20),

( NAME = Arch2,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\archdat2.ndf',

SIZE = 100MB,

MAXSIZE = 200,

FILEGROWTH = 20),

( NAME = Arch3,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\archdat3.ndf',

SIZE = 100MB,

MAXSIZE = 200,

FILEGROWTH = 20)

LOG ON

( NAME = Archlog1,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\archlog1.ldf',

SIZE = 100MB,

MAXSIZE = 200,

FILEGROWTH = 20),

( NAME = Archlog2,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\archlog2.ldf',

SIZE = 100MB,

MAXSIZE = 200,

FILEGROWTH = 20)

GO

C. Энгийн бааз үүсгэх

Энэ жишээнд Products нэртэй бааз үүсгэж, зөвхөн нэг файл тодорхойлжээ. Иймд 1MB хэмжээтэй

бичлэгийн файлыг автоматаар үүсгэжээ. Бичлэгийн файлын MAX хэмжээг зааж өгөгүй тул бичлэгийн

файлын хэмжээ диск дүүртэл ихэсч болно.

USE master

GO

CREATE DATABASE Products

ON

( NAME = prods_dat,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\prods.mdf',

SIZE = 4,

MAXSIZE = 10,

FILEGROWTH = 1 )

GO

Page 11: SQL

D. Файл зааж өгөлгүйгээр бааз үүсгэх

Энэ жишээнд mytest нэртэй баазыг үүсгэж байна. Баазуудын хэмжээг зааж өгөөгүй учир model

баазын хэмжээгээр файлуудыг үүсгэнэ.

CREATE DATABASE mytest

E. SIZE –ыг тодорхойлж өгөлгүйгээр бааз үүсгэх

Жишээнд products2 баазыг үүсгэж байна. prods2_dat файлын хэмжээ нь model баазын үндсэн файлын

хэмжээгээр үүсгэгдэнэ. Бичлэгийн файл нь автоматаар үүсгэгдэх ба хэмжээ нь үндсэн файлын

хэмжээний 25% ба 512КВ хоѐрын аль ихээр үүсгэгдэнэ.

USE master

GO

CREATE DATABASE Products2

ON

( NAME = prods2_dat,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\prods2.mdf' )

GO

F. Файл групптэй бааз үүсгэх

Энэ жишээнд sales нэртэй баазыг 3н файл групптэй үүснэж байна.

• Үндсэн файл групп нь Spri1_dat, Spri2_dat файлуудтай. FILEGROWTH буюу тэлэх хэмжээ нь

15% байна.

• SalesGroup1 нэртэй групп нь SGrp1Fi1, SGrp1Fi2 файлуудтай.

• SalesGroup2 нэртэй групп нь SGrp2Fi1, SGrp2Fi2 файлуудтай.

CREATE DATABASE Sales

ON PRIMARY

( NAME = SPri1_dat,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\SPri1dat.mdf',

SIZE = 10,

MAXSIZE = 50,

FILEGROWTH = 15% ),

( NAME = SPri2_dat,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\SPri2dt.ndf',

SIZE = 10,

MAXSIZE = 50,

FILEGROWTH = 15% ),

FILEGROUP SalesGroup1

( NAME = SGrp1Fi1_dat,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\SG1Fi1dt.ndf',

SIZE = 10,

MAXSIZE = 50,

FILEGROWTH = 5 ),

( NAME = SGrp1Fi2_dat,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\SG1Fi2dt.ndf',

SIZE = 10,

MAXSIZE = 50,

FILEGROWTH = 5 ),

FILEGROUP SalesGroup2

( NAME = SGrp2Fi1_dat,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\SG2Fi1dt.ndf',

SIZE = 10,

MAXSIZE = 50,

FILEGROWTH = 5 ),

( NAME = SGrp2Fi2_dat,

FILENAME = 'c:\program files\microsoft sql server\mssql\data\SG2Fi2dt.ndf',

Page 12: SQL

SIZE = 10,

MAXSIZE = 50,

FILEGROWTH = 5 )

LOG ON

( NAME = 'Sales_log',

FILENAME = 'c:\program files\microsoft sql server\mssql\data\salelog.ldf',

SIZE = 5MB,

MAXSIZE = 25MB,

FILEGROWTH = 5MB )

GO

G. Баазыг холбох

Энэ жишээнд Archive дараах физик файлуудтай бааз үүсгэж байна.

c:\program files\microsoft sql server\mssql\data\archdat1.mdf

c:\program files\microsoft sql server\mssql\data\archdat2.ndf

c:\program files\microsoft sql server\mssql\data\archdat3.ndf

c:\program files\microsoft sql server\mssql\data\archlog1.ldf

c:\program files\microsoft sql server\mssql\data\archlog2.ldf

sp_detach_db дроцедурыг ашиглан баазыг салгаж, CREATE DATABASE командыг FOR ATTACH

тохиргоотойгоор ашиглан холбож болно.

sp_detach_db Archive

GO

CREATE DATABASE Archive

ON PRIMARY (FILENAME = 'c:\program files\microsoft sql server\mssql\data\archdat1.mdf')

FOR ATTACH

GO

H. partition ашиглан бааз үүсгэх

Жишээнд энэ аргыг ашиглан Employees баазыг үүсгэж байна.

USE master

GO

CREATE DATABASE Employees

ON

( NAME = Empl_dat,

FILENAME = 'f:',

SIZE = 10,

MAXSIZE = 50,

FILEGROWTH = 5 )

LOG ON

( NAME = 'Sales_log',

FILENAME = 'g:',

SIZE = 5MB,

MAXSIZE = 25MB,

FILEGROWTH = 5MB )

GO

Лекц 3 - Хүснэгт үүсгэх

Өгөгдлийн сангийн өгөгдөл хадгалдаг үндсэн обьект нь хүснэгт юм. Хүснэгт нь багануудын

олонлогоос тогтоно. Хүснэгт үүсгэхийн тулд эхлээд тухайн хүснэгтэд ямар төрлийн обьектууд

хадгалахыг тодорхойлох хэрэгтэй. SQL Server нь олон төрлийн өгөгдлийн төрлүүдтэй байдаг. Мөн

хэрэглэгч системийн төрлүүд дээр үндэслэсэн хэрэглэгчийн төрөл тодорхойлох боломжтой.

Page 13: SQL

Үндсэн өгөгдлийн төрлүүд

Өгөгдлийн

төрлүүд Системийн өгөгдлийн

төрлүүд Хэмжээ Тайлбар

Хоѐртын binary[(n)] varbnary[(n)]

1-8000

Тэмдэгтэн char[(n)] varchar[(n)]

1-8000 (8000 тэмдэгт)

Unicode тэмдэгтэн

nchar[(n)] nvarchar[(n)]

2-8000 (1-4000 тэмдэгт)

Он сар datetime, smalldatetime 8,4 datetime нь 1753-1-1-ээс

9999-12-31, smalldatetime

нь 1900-1-1-ээс 2079-6-6

утга хадгална Бодит тоон decimal(p[,s])

float[(n)], real 5-17, 4-8, 4

Глобаль идентификатор

uniqueidentifier 16 Давтагдашгүй тоон

дугаарлалтыг автоматаар

хийдэг Бүхэл тоон int, smallint, tipyint 4, 2, 1

Мөнгөний money, smallmoney 8, 4

Тусгай төрөл bit, cursor, sysname,

timestamp 1, 0-8

Текст, график text, image 0-2GB

Unicode текст ntext 0-2GB

Хэрэглэгчийн өгөгдлийн төрөл үүсгэх

SQL Server дээр үндсэн өгөгдлүүдийн төрлүүд дээр үндэслэн хэрэглэгчийн төрөл үүсгэх

бололцоотой байдаг. sp_addtype системийн процедурын тусламжтайгаар хэрэглэгчийн төрлийг

үүсгэдэг.

Бичлэгийн хэлбэр:

sp_addtype нэр, системийн өгөгдлийн төрөл [,’NULL’|’NOT NULL’]

Жишээ:

EXEC sp_addtype isbn, ‘smallint’ , ‘NOT NULL’

EXEC sp_addtype zipcode, ‘char(10)’, ‘NULL’

EXEC sp_addtype longstring, ‘varchar(63)’, ‘NULL’

Хэрэглэгчийн төрлийг устгах

sp_droptype системийн процедурыг ашиглан хэрэглэгчийн төрлийг системийн systypes таблицаас

устгана. Хэрэв тухайн хэрэглэгчийн төрөл нь ямар нэгэн хүснэгт эсвэл өгөгдлийн обьектод

ашиглагдаж байвал түүнийг устгаж болохгүй.

Бичлэгийн хэлбэр:

sp_droptype төрөл

Дараах жишээнд isbn гэсэн хэрэглэгчийн төрлийг устгаж байна.

Page 14: SQL

EXEC sp_droptype isbn

Системийн процедур sp_help-ыг ажиллуулах эсвэл information_schama.domains –аас тухайн баазын

хэрэглэгчийн төрлүүдийг уншиж болно.

Хүснэгт үүсгэх

Хүснэгт үүсгэхийн тулд эхлээд хүснэгтийн нэр, талбарын нэрүүд, талбарын өгөгдлийн төрлүүдийг

тодорхойлох шаардлагатай. Талбарын нэр нь тухайн хүснэгт дотроо давтагдашгүй байх ѐстой. SQL

өгөгдлийн сан нь 2 миллиард хүртэл хүснэгт агуулах чадвартай. Мөн хүснэгт нь 1024 хүртэл

талбартай байж болно.

CREATE TABLE

[

Баазын_нэр.[Эзэмшигч].

| Эзэмшигч.

] хүснэгтийн_нэр

(

{<Баганын тодорхойлолт >

|Баганын_нэр AS Тооцоологдсон_багана

| <Хүснэгтийн_нэмэлт_тодорхойлолт>

} [,…n]

)

[ON {файлгрупп |DEFAULT} ]

[TEXTIMAGE_ON {файлгрупп |DEFAUL}]

<column_definition >::={Баганын_нэр өгөгдлийн_төрөл}

[ [DEFAULT тогтмол_илэрхийлэл ]

|[ IDENTITY [(анхны_утга, нэмэгдүүлэлт )[NOT FOR REPLICATION ] ] ]

]

[ ROWGUIDCOL ]

[ < Баганын_нэмэлт_тодорхойлолт >] [,…n]

< Баганын_нэмэлт_тодорхойлолт >:: =[CONSTRAINT Тодорхойлолтын_нэр]

{

[ NULL | NOT NULL]

| [ { PRIMARY KEY | UNIQUE }

[ CLUSTERED | NONCLUSTERED ]

[ WITH FILLFACTOR = дүүргэлт ]

[ON { файлгрупп | DEFAULT } ] ]

]

| [ [ FOREIGN KEY]

REFERENCES Хүснэгт [ (Багана )]

[ NOT FOR FEPLICATION ]

]

| CHECK [ NOT FOR REPLICATION ]

(логик_илэрхийлэл)

}

<Хүснэгтийн_нэмэлт_тодорхойлолт>::=[CONSTRAINT Тодорхойлолтын_нэр]

{

[ { PRIMARY KEY | UNIQUE }

[ CLUSTERED | NONCLUSTERED ]

{( Багана [,…n] )}

[ WITH FILLFACTOR=дүүргэлт ]

[ON { файлгрупп | DEFAULT } ]

]

| FOREIGN KEY

[ ( Багана[,…n] )]

Page 15: SQL

REFERENCES Хүснэгт [( Багана[,…n] ) ]

[NOT FOR REPLICATION]

| CHECK [NOT FOR REPLICATION]

(Хайх нөхцөл)

}

Аргументууд

Баазын_нэр

Хүснэгт үүсгэх баазын нэр юм. Хэрэв үүнийг зааж өгөөгүй тохиолдолд идэвхитэй баазад үүсгэнэ.

Эзэмшигч

Тухайн баазыг үүсгэсэн эзэмшигчийн нэр. Хэрэв тухайн баазыг үүсгэгч нь sysadmin –ий гишүүн бол

хэрэглэгчийн нэр нь dbo байдаг ба үүсгэсэн бааз нь ч dbo эзэмшигчтэй байна. Харин бусад

хэрэглэгчид үүсгэсэн баазынхаа эзэмшигч болно.

Хүснэгтийн_нэр

Үүсгэх гэж байгаа хүснэгтийн нэр. Эзэмшигч.Хүснэгтийн_нэр нь тухайн бааз дотор давтагдашгүй

байх ѐстой. Хүснэгтийн_нэр нь 128 хүртэлх тэмдэгтээс бүрдэнэ. Харин түр зуурын хүснэгтийн нэр нь

(# тэмдэгтээр эхэлдэг) 116 тэмдэгтээс хэтрэх ѐсгүй.

Баганын_нэр

Хэрэв багана нь timestamp төрөлтэй байвал баганын нэрийг тавихгүй байж болно. Хэрэв нэрийг нь

тавьж өгөөгүй тохиолдолд автоматаар timestamp болдог.

Тооцоологдсон_багана

Тооцоологдсон багана гэдэг нь бодитойгоор хүснэгтэд оршин байдаггүй, виртуал багана юм. Бусад

баганууд үйлдэл хийн энэ баганыг үүсгэдэг. Жишээ нь: cost AS price * qty ийм байдлаар cost гэсэн

шинэ баганыг үүсгэнэ. Энэ илэрхийлэл нь баганын нэр, тогтмол, функц, хувьсагчаас бүрдэж болно.

Харин илэрхийлэл нь дэд-хүснэгт байж болохгүй.

Энэ багана нь SELECT-д, WHERE-д, ORDER BY –д болон бусад илэрхийлэлд ашиглагдаж болно.

Гэхдээ дараах болзлуудтай:

Энэ багана нь индекс түлхүүр багана байж болохгүй. Мөн PRIMARY KEY, UNIQUE,

FOREIGN KEY, DEFAULT тодорхойлолтуудад оролцож болохгүй.

Мөн INSERT болон UPDATE командад ашиглагдахгүй.

ON {файлгрупп | DEFAULT }

Хүснэгтийг хадгалах файлгруппыг зааж өгнө. Хэрэв DEFAULT-ыг зааж өгсөн, эсвэл ON-ыг зааж

өгөөгүй тохиолдолд default файл групп ашиглагдана.

ON {файлгрупп| DEFAULT } нь PRIMARY KEY болон UNIQUE зэрэг индекс үүсгэдэг

тодорхойлолтод ашиглагдаж болно.

TEXTIMAGE_ON

text, ntext, image баганууд нь тухайн файл группт хадгалагдахыг тодорхойлно. Хэрэв тухайн

хүснэгтэд text, ntext, image баганууд байхгүй бол TEXTIMAGE ON –ийг хэрэглэхийг зөвшөөрөхгүй.

өгөгдлийн_ төрөл

Системийн болон хэрэглэгчийн тодорхойлсон төрлүүдийг ашиглаж болно. Хэрэглэгчийн төрлийг

хүснэгт үүсгэхээсээ өмнө тодорхойлсон байх шаардлагатай. CREATE TABLE командад

хэрэглэгчийн төрлийн хэмжээг дахин тодорхойлж болохгүй.

DEFAULT

Тухайн баганад утга зааж өгөөгүй тохиолдолд авах утга. DEFAULT тодорхойлолтыг timestamp –аас

бусад талбарт хэрэглэнэ. Мөн IDENTITY–г ашигласан үед хэрэглэх боломжгүй. Тухайн хүснэгтийг

Page 16: SQL

устгасан үед DEFAULT тодорхойлолт мөн устана. Зөвхөн тогтмол утга, системийн зарим функц мөн

NULL-ийг энэ тодорхойлолтод ашиглана.

IDENTITY

Шинэ бичлэг хүснэгтэд нэмэгдэх бүрд сервер нь энэ талбарт давтагдашгүй, нэмэгдсэн утгыг олгоно.

Identity багана нь PRIMARY KEY тодорхойлолттой хослон ихээр хэрэглэгддэг. IDENTITY нь зөвхөн

tinyint, smallint, int, decimal(p,0), or numeric (p,0) төрөлтэй багануудад л хэрэглэгдэнэ. Нэг хүснэгтэд

зөвхөн нэг identity багана л байх ѐстой.

Анхны_утга, нэмэгдүүлэлт

Тухайн баганын утга анх ямар байх мөн яаж нэмэгдэхийг тодорхойлно.

NOT FOR REPLICATION

Sqlrepl зэрэг хэрэглэгчид хүснэгт рүү өгөгдөл оруулж байхад IDENTITY

тодорхойлолтыг хэрэгсэхгүй гэснийг тодорхойлно.Хуулагдаж байгаа бичлэгүүд нь анх баазд

орохдоо ямар түлхүүр утга авсан түүнийгээ хадгалж үлдэнэ. Харин бусад хэрэглэгчид оруулсан шинэ

бичлэгүүдэд ердийн журмаар түлхүүр талбаруудад утга олгогдоно.

ROWGUIDCOL

Шинэ багана нь глобаль идентификатор багана гэдгийг тодорхойлно.Нэг хүснэгтэд зөвхөн нэг л

uniqueidentifier багана л ROWGUIDCOL – аар жнтодорхойлогдоно. ROWGUIDCOL тодорхойлолт нь

зөвхөн uniqueidentifier баганад л тодорхойлогдоно.

ROWGUIDCOL тодорхойлолттой багана нь давтагдашгүй утгуудыг авдаггүй.Мөн шинэ мөр үүсэхэд

автоматаар утга авдаггүй.Иймд давтагдашгүй утгууд үүсгэхийн тулд INSERT командад NEWID

функцыг ашиглах, эсвэл NEWID-г баганын default утга тодорхойлохдоо ашиглах хэрэгтэй.

CONSTRAINT

PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY, CHECK тодорхойлолтууд эхэлж байгааг

тодорхойлсон үг.

NULL | NOT NULL

Тухайн баганад NULL утга хадгалагдах эсэхийг тодорхойлсон түлхүүр үг.

PRIMARY KEY

Тухайн баганыг гол түлхүүр талбар хэмээн тодорхойлдог түлхүүр үг. Тухайн хүснэгтэд зөвхөн нэг

PRIMARY KEY байх ѐстой.

UNIQUE

Тухайн баганын өгөгдөл давтагдашгүй шинж чанартай байх ѐстойг тодорхойлно. Хүснэгтэд олон

UNIQQUE тодорхойлолт хэрэглэж болно.

CLUSTERED | NONCLUTERED

PRIMARY KEY болон UNIQUE тодорхойлолтууд нь кластер төрлийн индекс ашиглах эсэхийг

тодорхойлно.

[WITH FILLFACTOR= fillfactor]

Индекс өгөгдөл хадгалах индекс хуудсыг хэрхэн зохион байгуулахыг тодорхойлно. 1-ээс 100 хүртлэх

утгуудыг авах ба анхдагч утга нь 0 байна. Энэ утга нь бага байх тусам шинэ индекс үүсгэхдээ их

хэмжээтэйгээр авна.

FOREIGN KEY… REFERENCES

Гадаад түлхүүрээр холбоно. Холбогдох хүснэгт ба түүний холбогдох багана.Тэр багана нь тухайн

хүснэгтдээ PRIMARY KEY эсвэл UNIQUE байх ѐстой. Багана нь олон багана байж болно.

CHECK - Тухайн баганад орох утгыг шалгах тодорхойлолт.

Page 17: SQL

NOT FOR REPLICATION

REPLICATION хийх үед CHECK-ийг шалгах уу? Гэсэн үг.

Хүснэгтийн нэмэлт тодорхойлолт

Олон баганыг өөр хүснэгтийн олон багана руу зааглана.

Хайх нөхцөл

Хүснэгт дээр шалгахдаа хайна.

CREATE TABLE jobs

(

job_id smallint

IDENTITY(1,1)

PRIMARY KEY CLUSTERED,

job_desc varchar(50) NOT NULL

DEFAULT 'New Position - title not formalized yet',

min_lvl tinyint NOT NULL

CHECK (min_lvl >= 10),

max_lvl tinyint NOT NULL

CHECK (max_lvl <= 250)

)

/* ************************* employee table ************************* */

CREATE TABLE employee

(

emp_id empid

CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED

CONSTRAINT CK_emp_id CHECK (emp_id LIKE

'[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or

emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),

/* Each employee ID consists of three characters that

represent the employee's initials, followed by a five

digit number ranging from 10000 through 99999 and then the

employee's gender (M or F). A (hyphen) - is acceptable

for the middle initial. */

fname varchar(20) NOT NULL,

minit char(1) NULL,

lname varchar(30) NOT NULL,

job_id smallint NOT NULL

DEFAULT 1

/* Entry job_id for new hires. */

REFERENCES jobs(job_id),

job_lvl tinyint

DEFAULT 10,

/* Entry job_lvl for new hires. */

pub_id char(4) NOT NULL

DEFAULT ('9952')

REFERENCES publishers(pub_id),

/* By default, the Parent Company Publisher is the company

to whom each employee reports. */

hire_date datetime NOT NULL

DEFAULT (getdate())

/* By default, the current system date is entered. */

)

Page 18: SQL

/* ***************** publishers table ******************** */

CREATE TABLE publishers

(

pub_id char(4) NOT NULL

CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED

CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')

OR pub_id LIKE '99[0-9][0-9]'),

pub_name varchar(40) NULL,

city varchar(20) NULL,

state char(2) NULL,

country varchar(30) NULL

DEFAULT('USA')

)

Use an expression for a computed column

CREATE TABLE mytable

(

low int,

high int,

myavg AS (low + high)/2

)

Temporary Tables

You can create local and global temporary tables. Local temporary tables are visible only in the current

session; global temporary tables are visible to all sessions.

Prefix local temporary table names with single number sign (#table_name), and prefix global temporary

table names with a double number sign (##table_name).

SQL statements reference the temporary table using the value specified for table_name in the CREATE

TABLE statement:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)

INSERT INTO #MyTempTable VALUES (1)

If a local temporary table is created in a stored procedure or application that can be executed at the same time

by several users, SQL Server has to be able to distinguish the tables created by the different users. SQL

Server does this by internally appending a numeric suffix to each local temporary table name. The full name

of a temporary table as stored in the sysobjects table in tempdb consists of table name specified in the

CREATE TABLE statement and the system-generated numeric suffix. To allow for the suffix, table_name

specified for a local temporary name cannot exceed 116 characters.

Temporary tables are automatically dropped when they go out of scope, unless explicitly dropped using

DROP TABLE:

A local temporary table created in a stored procedure is dropped automatically when the stored

procedure completes. The table can be referenced by any nested stored procedures executed by the

stored procedure that created the table. The table cannot be referenced by the process which called

the stored procedure that created the table.

All other local temporary tables are dropped automatically at the end of the current session.

Global temporary tables are automatically dropped when the session that created the table ends and

all other tasks have stopped referencing them. The association between a task and a table is

maintained only for the life of a single Transact-SQL statement. This means that a global temporary

Page 19: SQL

table is dropped at the completion of the last Transact-SQL statement that was actively referencing

the table when the creating session ended.

A local temporary table created within a stored procedure or trigger is distinct from a temporary table with

the same name created before the stored procedure or trigger is called. If a query references a temporary

table, and two temporary tables with the same name exist at that time, it is not defined which table the query

is resolved against. Nested stored procedures can also create temporary tables with the same name as a

temporary table created by the stored procedure that called it. All references to the table name in the nested

stored procedure are resolved to the table created in the nested procedure, for example:

CREATE PROCEDURE Test2

AS

CREATE TABLE #t(x INT PRIMARY KEY)

INSERT INTO #t VALUES (2)

SELECT Test2Col = x FROM #t

GO

CREATE PROCEDURE Test1

AS

CREATE TABLE #t(x INT PRIMARY KEY)

INSERT INTO #t VALUES (1)

SELECT Test1Col = x FROM #t

EXEC Test2

GO

CREATE TABLE #t(x INT PRIMARY KEY)

INSERT INTO #t VALUES (99)

GO

EXEC Test1

GO

Here is the result set:

(1 row(s) affected)

Test1Col

-----------

1

(1 row(s) affected)

Test2Col

-----------

2

When you create local or global temporary tables, the CREATE TABLE syntax supports constraint

definitions with the exception of FOREIGN KEY constraints. If a FOREIGN KEY constraint is specified in

a temporary table, the statement returns a warning message indicating that the constraint was skipped, and

the table is still created without the FOREIGN KEY constraints. Temporary tables cannot be referenced in

FOREIGN KEY constraints.

Consider using table variables instead of temporary tables. Temporary tables are useful in cases when

indexes need to be created explicitly on them, or when the table values need to be visible across multiple

stored procedures or functions. In general, table variables contribute to more efficient query processing. For

more information, see table.

PRIMARY KEY Constraints

A table can contain only one PRIMARY KEY constraint.

Page 20: SQL

The index generated by a PRIMARY KEY constraint cannot cause the number of indexes on the

table to exceed 249 nonclustered indexes and 1 clustered index.

If CLUSTERED or NONCLUSTERED is not specified for a PRIMARY KEY constraint,

CLUSTERED is used if there are no clustered indexes specified for UNIQUE constraints.

All columns defined within a PRIMARY KEY constraint must be defined as NOT NULL. If

nullability is not specified, all columns participating in a PRIMARY KEY constraint have their

nullability set to NOT NULL.

A table can contain a maximum of 253 FOREIGN KEY constraints.

FOREIGN KEY constraints are not enforced on temporary tables.

A table can reference a maximum of 253 different tables in its FOREIGN KEY constraints.

FOREIGN KEY constraints can reference only columns in PRIMARY KEY or UNIQUE constraints

in the referenced table or in a UNIQUE INDEX on the referenced table.

Лекц 4. - Хязгаарлалуудыг тогтоох

Хүснэгт үүсгэж байхдаа хүснэгтийн багануудын шинж чанарыг тодорхойлж өгөх боломжтой байдаг.

SQL Server нь багануудын утгыг хянах дараах хязгаарлалуудыг ашигладаг. Үүнд:

CHECK – Логик илэрхийллийн тусламжтайгаар баганын утгыг шалгах

NULL - Тодорхойлогдоогүй утгыг хадгалах боломжийг тодорхойлно

DEFAULT – Анхдагч утгыг тогтоох

UNIQUE – Тухайн баганын давтагдашгүй шинж чанарыг хангах

PRIMARY KEY - Үндсэн түлхүүр талбарыг тогтоох

FOREIGN KEY – Гадаад түлхүүр талбарыг тогтоох

DEFAULT тодорхойлолтыг үүсгэх, өөрчлөх

DEFAULT тодорхойлолтыг хүснэгт үүсгэх, хүснэгт өөрчлөх үед ашиглаж болно. Хүснэгтэд байгаа

багана тус бүр нэг DEFAULT тодорхойлолттой байх боломжтой. DEFAULT тодорхойлолтыг

үүсгэсний дараа түүнийг өөрчлөх шаардлагатай болбол түүнйиг эхлээд устгаж байж дахин үүсгэнэ.

Дараах төрлийн баганууд дээр DEFAULT тодорхойлолтыг ашиглаж болохгүй.

Timestamp төрөлтэй багана.

IDETITY эсвэл ROWGUIDCOL -үүдийг тодорхойлсон баганууд

Урьд нь DEFUALT тодорхойлолт хийгдсэн багана

Энэ тодорхойлолтыг ашиглан тухайн баганад зааж өгсөн анхдагч утга нь тухайн баганын таралд

хамаарах утга байх ѐстой. Мөн зааж өгсөн анхдагч утга нь тухайн хүснэгтэд шинэ бичлэгүүд

нэмэгдэх үед л ашиглагдана. Харин тухайн хүснэгтэд өмнө нь байсан бичлэгүүд болон хуучин

DEFAULT тодорхойлолттой байсан бичлэгүүдэд шинэ анхдагч утга олгогдохгүй.

Дараах жишээнд adult хүснэгтийн firstname талбарт анхдагч утга тодорхойлж байна.

Use library

ALTER TABLE adult

ADD CONSTRAINT firstname DEFAULT „Unknown‟ FOR firstname

DEFAULT тодорхойлолтод тогтмол утга ашиглахаас гадна. Функц ашиглаж болно. Жишээ нь

идэвхтэй он сарыг авч хадгалахын тулд:

DEFAULT(getdate())

Мөн тухайн бичлэгийг ямар хэрэглэгч оруулсан гэдэг хяналтын мэдээллийг хадгалахын тулд жишээ

нь USER функцыг ашиглаж болно. Харин энэ функцыг ашиглахдаа функцын хос хаалт хэрэглэдэггүй.

Page 21: SQL

DEFAULT USER

Мөн дараах функцуудыг ашиглаж болно.

CURRENT_ TIMESTAMP – Идэвхтэй он сар

CURRENT_USER – Өгөгдөл оруулж буй хэрэглэгчийн нэр

SESSION_USER – Өгөгдөл оруулж буй хэрэглэгчийн нэр

SYSTEM_USER – Өгөгдөл оруулж буй хэрэглэгчийн нэр

USER – Өгөгдөл оруулж буй хэрэглэгчийн нэр

CHECK тодорхойлолтыг үүсгэх, өөрчлөх

Энэ тодорхойлолтыг ашиглан тухайн талбарт ямар утга хадгалагдах гэж байгааг шалгана. Энэ

тодорхойлолтыг логик илэрхийлэл хэлбэрээр бичиж өгдөг. Хэрэв хадгалагдах гэж байгаа утга нь

тухайн логик илэрхийллийн шаардлагыг хангахгүй бол тухайн утгыг хадгалагдахыг зөвшөөрөхгүй.

Логик илэрхийллээ бичихдээ дурын команд, функц, хувьсагчуудыг ашиглаж болно. Хүснэгт болон

баганад хэд хэдэн CHECK тодорхойлолт ашиглаж болно. CHECK тодорхойлолт нь урьд байсан

өгөгдөл болон шинээр оруулж байгаа өгөгдлүүдэд үйлчилж чадна. Жишээ нь:

cost >= 15 AND cost<=100 эсвэл cost BETWEEN 15 and 100

Энэ жишээнд jobs хүснэгтийн min_lvl, max_lvl талбаруудад оруулах утганд хязгаарлалт тогтоож

байна. Эдгээр 2 тодорхойлолтыг нэрлээгүй байна.

CHECK (min_lvl >=10)

and

CHECK (max_lvl<=250)

Энэ жишээнд employee хүснэгтийн emp_id талбарт паттерн ашиглан хязгаарлалт тогтоож байна.

CONSTRAINT CK_emp_id CHECK (emp_id LIKE

„[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]‟)

UNIQUE тодорхойлолтыг үүсгэх, өөрчлөх

Энэ тодорхойлолтыг ашиглан нэг буюу хэд хэдэн баганыг давтагдашгүй шинж чанартайгаар

тодорхойлж болно. Талбарууд NULL утгатай байж болно. Хүснэгтэд шинээр UNIQUE

тодорхойлолтыг нэмэхэд SQL server нь урьд оруулсан өгөгдлүүд давтагдашгүй шинж чанартай байгаа

эсэхийг шалгадаг. Шалгахад хэрвээ давтагдсан утгууд байх юм бол server нь хүснэгтэд тухайн

тодорхойлолтыг нэмэхгүй бөгөөд алдааны мэдээлэл буцаана. Хэрэв тодорхойлолт амжилттай

нэмэгдсэн бол сервер автоматаар давтагдашгүй индексийг үүсгэдэг. Дараа нь хүснэгтэд давтагдсан

түлхүүртэй шинэ мөр оруулах тохиолдолд сервер алдаа мэдээлнэ.

Жишээ нь: Дараах жишээнд employee баазын driver_loc_no талбарт давтагдашгүй тодорхойлолтыг

тогтоож байна.

ALTER TABLE employee

ADD CONSTRAINT u_driver_lic_no

UNIQUE NONCLUSTERED ( driver_lic_no)

PRIMARY KEY тодорхойлолтыг үүсгэх

Хоорондоо хамааралтай олон хүснэгтийг ашиглахын тулд түлхүүрийн тусламжтайгаар тэдгээрийг

холбодог. Түлхүүр гэдэг нь хүснэгтийн бусад талбарыг төлөөлж чадах талбаруудын олонлог юм.

Хоорондоо холбоотой олон хүснэгтийг үүсгэх үед хэрэглэгч үндсэн хүснэгт дээр анхдагч түлхүүрийг

тодорхойлон, түүнээс хамаарсан бусад хүснэгтүүд дээр гадаад түлхүүрийг тодорхойлох шаардлагатай

Page 22: SQL

болдог. PRIMARY KEY тодорхойлолтыг оруулахад сервер нь түлхүүрт оролцож буй баганууд нь

үндсэн түлхүүрийн шинжийг хангаж байгаа эсэхийг шалгана. Үүнд :

Null утга агуулаагүй байх

Давтагдсан утгагүй байх

Хэрэв эдгээр нөхцлүүдийг хангаагүй тохиолдолд сервер нь тухайн тодорхойлолтыг оруулахгүй

бөгөөд алдааны мэдээлэл буцаана. PRIMARY KEY-г нэг шинжээр нь авч үзвэл UNIQUE-тэй ижил

шаардлагатай мэт боловч ялгаатай онцлог нь null утга агуулдаггүйд байдаг. Хүснэгтэд зөвхөн нэг

PRIMARY KEY тодорхойлолт байх ѐстой.

Анхааруулга:Хэрэв бусад хүснэгтэд FOREIGN KEY –г ашиглан тухайн түлхүүрийг заасан бол

PRIMARY KEY тодорхойлолтыг устгаж болохгүй. Эхлээд FOREIGN KEY –г устгах хэрэгтэй.

Жишээ нь:

USE library

ALTER TABLE member

ADD CONSTRAINT PK_member_no

PRIMARY KEY CLUSTERED (member_no)

FOREIGN KEY тодорхойлолтыг үүсгэх

Хэрэв багануудын аль нэг нь гадаад түлхүүрээр тодорхойлогдсон бол SQL нь оруулж буй утгуудыг

автоматаар шалгадаг. Хүснэгт нь хэд хэдэн гадаад түлхүүртэй байж болно. FOREIGN KEY

тодорхойлолтыг баганууд дээр нэмэхэд тухайн багануудын утга нь үндсэн түлхүүрт байгаа эсэхийг

шалгадаг.Нэмж буй утга нь үндсэн түлхүүрт байгаа эсэхийг шалгадаг.Нэмж буй утга нь үндсэн

түлхүүрийг ашиглахад дараах шаардлагууд тавигддаг.

FOREIGN KEY тодорхойлолт нь зөвхөн нэг бааз дахь хүснэгтүүдтэй л холболт хийж болно.

FOREIGN KEYтодорхойлолт нь тухайн хүснэгтийнхээ багануудтай нь ижил төрөлтэй, тэнцүү

тоотой баганууд байх шаардлагатай.

Хүснэгтэд хамгийн ихдээ 253-н FOREIGN KEY тодорхойлолт байх ѐстой.

FOREIGN KEY тодорхойлолтыг түр зуурын хүсгнэгтэд ашигладаггүй.

Гадаад түлхүүр нь нэг буюу хэд хэдэн баганаас бүрдэж болно.Дараах жишээнд зөвхөн нэг баганаас

бүрдэх гадаад түлхүүрийг үзүүлжээ.Жишээнд employee хүснэгтийн гадаад түлхүүр нь jobs хүснэгт

рүү холбогдсныг үзүүлжээ.

Job_id smallint NOT NULL

DEFAULT 1

REFERENCES jobs(job_id)

Дараах жишээнд олон баганаас бүрдэх гадаад түлхүүр тодорхойлжээ.

CONSTRAINT FK_sales_backorder FOREIGN KEY (stor_id, ord_num, title_id)

REFERENCES sales (stor_id, ord_num, title_id)

Хязгаарлалтыг зогсоох

CHECK болон FOREIGN KEY хязгаарлалтыг хэрэглэсэн үед тэдгээрийн үйлчилгээг зогсоож мөн

сэргээж болдог.Хязгаарлалтыг шалгахтай холбогдон системд нэмэлт ачаалал өгөхөөс сэргийлж

зарим тохиолдолд тэдгээрийн үйлчилгээг зогсоодог.

Дараах жишээнд sales хүснэгтийн correct_amount гэсэн тодорхойлолтын үйлчилгээг зогсоож байна.

USE library

ALTER TABLE sales

NOCHECK CONSTRAINT correct_amount

Page 23: SQL

Харин үйлчилгээг сэргээхдээ :

USE library

ALTER TABLE sales

CHECK CONSTRAINT correct_amount

Лекц 5. - Transact SQL хэл

SQL хэлний анхны хувилбарыг 1970 онд IBM компани боловсруулжээ. Энэ нь өгөгдлийн санг

удирдах хүчтэй хэрэгсэл боловсруулах анхны ч мөн сүүлийн ч оролдлого биш байлаа. Гэвч SQL хэл

нь нийтээр хүлээн зөвшөөрөгдсөн стандарт хэл болтлоо хөгжсөн юм. Одоогоор бүх орчин үеийн

өгөгдлийн сан удирдах системүүд энэхүү хэлийг хэрэглэж байна. 1992 онд Америкийн Үндэсний

Стандартын Институт ANSI-92 нэртэй стандартыг SQL хэлд баталсан бөгөөд энэ стандартаар

командуудыг хэрэглэх үндсэн дүрэм, идентификатор, хувьсагчдын дүрмийг баталгаажуулсан юм.

Microsoft корпораци бусад үйлдвэрлэгчдийн адил SQL хэлийн өөрийн хувилбарыг боловсруулсан ба

Transact-SQL хэмээн нэрийджээ.

Обьектыг нэрлэх буюу идентификатор

Transact-SQL хэлийг ашиглан обьектыг нэрлэхэд дараах шаардлагууд тавигддаг.

Нэрийн урт нь 128 тэмдэгтээс хэтэрч болохгүй. Хагрин түр зуурын хүснэгтийн нэрийн урт

116 тэмдэгтээс хэтэрч болохгүй.

Обьектыг түлхүүр үгээр нэрлэж болохгүй.

Нэр нь үсэг эсвэл тэмдэгтээр л эхэлж болно. Иймээс обьектын нэр нь цифрээр эсвэл ! $ гэх

мэт тэмдэгтүүдээр эхэлж болохгүй. Түр зуурын хүснэгтийг нэрлэхдээ хэдийгээр эхний үсэг нь

хоѐрхон тэмдэгтээр эхэлж болох боловч дараагийн тэмдэгтээс нь эхлэн энэ дүрмийг

баримталдаг.

Харин нэрийн аль хэсэгт ч дараах тэмдэгтүүдийг ашиглахыг хориглодог.

( хоосон зай, дугуй ба дөрвөлжин хаалтууд, ! % ^ & ~ - . , \ „‟ )

Дээрх дүрмийн дагуу нэрлэгдсэн хувьсагчдыг стандарт идентификатор гэнэ. Харин SQL 7.0

хувилбарт тусгаарлагдсан идентификатор гэж нэрлэгдэх идентификатор байдаг. Энэ

идентификаторыг бичиж ашиглахдаа [ ] болон “ “ тусгаарлагчаар хашиж ашигладаг. Онцлог нь эдгээр

тусгаарлагчдын хооронд дурын тэмдэгтүүд болон түлхүүр үгийг ч ашиглаж болно. Иймээс обьектоо

дурын байдлаар нэрлэх боломжийг бүрдүүлдэг.

Жишээ нь:

SELECT * FROM “Blanks in Table Name”

SELECT * FROM [Blanks In Table Name]

Давхар хашилтаар хашигдсан идентификатор нь зөвхөн QUOTED_IDENTIFIER тохиргоог ON байсан

үед л ажиллана. Хэрэв Microsoft OLE DB Provider эсвэл SQL Server ODBC driver ашигласан үед

хэрэглэгч холбогдох үед QUOTED_IDENTIFIER On болдог. Харин DB –Library ашигласан үед

тэгдэггүй. Харин хэрэглэгч дурын үед SET QUOTED_IDENTIFIER командыг ашиглан тохиргоог

хийж болно.

SELECT * FROM “My Table”

WHERE “Last Name” = „O”Brien‟

Хэрэв QUOTED_IDENTIFIER тохиргоо OFF байвал SQL дараах дүрмийг баримталдаг:

Давхар хашилт нь идентификаторыг хашихад ашиглагдах боломжгүй. Оронд нь хос

дөрвөлжин хаалтыг ашиглана.

Харин тэмдэгт мөрийг хашихад дан болон давхар хашилт хоѐуланг нь ашиглаж болно.

Давхар хашилтыг ашигласан үед тэмдэгт мөр доторх дан хашилт ямар нэг үүрэг

гүйцэтгэгдэхгүй.

Page 24: SQL

SELECT * FROM [My Table]

WHERE [Last Name] = “O‟Brien”

Тусгаарлагдсан идентификаторын дүрэм

Энгийн идентификатортай адил тооны тэмдэгтээс бүрдэнэ. (1-ээс 128 тэмдэгт, тусгаарлагч

тэмдэгт орохгүйгээр). Түр зуурын хүснэгтийн нэр 116 хүртэлх тэмдэгтээс бүрдэнэ.

Тусгаарлагч тэмдэгт нь л биш бол дурын тэмдэгтүүдээс бүрдсэн нэр байж болно.

Тусгаарлагч идентификаторыг ашигласан жишээ:

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE “$Employee Data”

(

“^First Name” varchar(25) NOT NULL,

“^Last Name” varchar(25) NOT NULL,

“^Dept ID” int

)

--------------------------------------------------

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [$Employee Data]

(

[^First Name] varchar(25) NOT NULL,

[^Last Name] varchar(25) NOT NULL,

[^Dept ID] int

)

---------------------------------------------------

$Employee Data ба ^$Employee Data хүснэгтүүдийг үүсгэн өгөгдөл оруулсны дараа хүснэгт тавихдаа:

SET QUOTED_IDENTIFIER ON

GO

SELECT *

FROM “&Employee Data”

SET QUOTED_IDENTIFIER OFF

GO

--------------------------------------------------

SELECT *

FROM [^$Employee Data]

Дараах жишээнд түлхүүр үгүүдээр нэрлэжээ.

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE “table”

(tablename char (128) NOT NULL,

“USER” char (128) NOT NULL,

“SELECT” char (128) NOT NULL,

“INSERT” char (128) NOT NULL,

“UPDATE” char (128) NOT NULL,

“DELETE” char (128) NOT NULL

)

Page 25: SQL

Хувьсагч ашиглах

SQL Server 7.0 нь 2 төрлийн түр зуурын обьектуудтай (хувьсаг, хүснэгт). Transact- SQL хэлний

хувьсагч нь тодорхой төрлийн энгийн утгыг түр зуур хадгалахын тулд ашиглагддаг. Transact SQL

хэлэнд DECLARE командыг ашиглан хувьсагч зарлана. Хувьсагч зарлахын тулд хувьсагчаа нэрлээд,

системийн эсвэл хэрэглэгчийн төрөлтэйгээр тодорхойлж өгнө. Хувьсагчийн нэр нь @ тэмдэгтээр

эхэлсэн байх шаардлагатай.

Бичлэгийн хэлбэр:

DECLARE {@local_variable data_type } [,…n]

Дараах жишээнд MyCounter нэртэй int төрөлтэй хувьсагчийг зарлаж байна.

DECLARE @MyCounter INT

Хувьсагчийн ажиллах хүрээ хязгаар нь тухайн хувьсагч зарлагдсан цэгээс эхлэн багц командын

төгсгөл хүртэл эсвэл тухайн хувьсагч зарлагдсан функц дотор байна. Дараах жишээнд нэг хувьсагч

нэг багц ажил дотор зарлагдсан боловч дараагийн багц ажилд ашиглагдаж байгаа учир алдаа гарсан

байна.

DECLARE MyVariable INT

SET @MyVariable =1

GO – Багц ажил дууссаныг илтгэсэн команд .

-- Одоо энэ цэгээс хойш @MyVariable хувьсагч байхгүй гэсэн үг.

SELECT *

FROM Employees

WHERE EmployeeID= @MyVariable

Хувьсагчид утга олгох

Хувьсагч анх зарлагдахад түүний утга нь NULL байна. Дараа нь утга олгохын тулд SET командыг

ашиглана. Энэ нь хувьсагчид утга олгох үндсэн арга юм. Мөн SELECT командыг ашиглан утга олглж

болно.

USE Northwind

GO

DECLARE @FirstNameVariable NVARCHAR(20), @RegionVariable NVARCHAR(30)

SET @FirstNameVariable =N‟Anne‟

SET @RegionVariable=N‟WA‟

-- Тэдгээр хувьсагчдаа ашиглах

SELECT LastName, FirstName, Title

FROM Employees

WHERE FirstName=@FirstNameVariable OR @RegionVariable

GO

SELECT командыг ашиглан утга олгох

USE Northwind

GO

DECLARE @EmpIDVariable INT

Page 26: SQL

SELECT @EmpIDVariable=MAX(EmployeeID)

FROM Employees

GO

Түр зуурын хүснэгт

Хэрэглэгч локаль болон глобаль түр зуурын хкүснэгт үүсгэж болно. Локаль түр зуурын хүснэгт нь

зөвхөн тухайн холболтын хугацаанд ашиглагдана. Харин глобаль нь бүх холболтын үед ашиглагдана.

Локаль түр зуурын хүснэгтийн нэр нь дан # тэмдэгтээр, харин глобаль нь давхар ## тэмдэгтээр

эхэлнэ. Жишээ:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)

INSERT INTO #MyTempTable VALUES (1)

Ажиллах хүрээ нь дууссан тохиолдолд түр зуурын хүснэгтүүд нь автоматаар устгагддаг. Хэрэв

процедур дотор түр зуурын хүснэгт ашигласан бол процедураас гарахад автоматаар устана.

Лекц 6. - Transact SQL хэл.

Илэрхийлэл

Transact SQL хэлний илэрхийлэлд дараах обьектууд оролцож болно :

Тогтмол

Функц

Баганын нэр

Хувьсагч

Дэд хүснэгт

CASE, NULLIF, COALESCE командууд

SQL хэлний илэрхийлэлд арифметик, харьцуулах, логик, бит, утга олгох гэх мэт үйлдлүүд оролцдог.

Арифтетик үйлдлүүд

SQL хэлэнд нэмэх (+), хасах (-), үржүүлэх (*), хуваах (/), үлдэгдэл олох (%) гэсэн 5 арифметик

үйлдэлтэй.Эднээс *, /, % үйлдлүүд нь өндөр зэрэглэлтэй.

Бит үйлдлүүд

Бит үйлдлүүд нь int, smallint, tinyint төрлийн өгөгдлүүд дээр л хийгдэнэ. SQL хэлэнд дараах бит

үйлдлүүд байдаг :

Бит БА үйлдэл &

Бит БУЮУ үйлдэл |

Бит XOR үйлдэл ^

Бит үгүйсгэл үйлдэл ~

USE MASTER

GO

SELECT a_int_value & b_int_value

FROM bitwise

GO

Харьцуулах үйлдлүүд

Харьцуулах үйлдлүүд нь тоон, тэмдэгтэн, болон цаг хугацааны өгөгдлүүд дээр хийгдэх бөгөөд

ихэвчлэн WHERE, HAVING командуудад хэрэглэгдэнэ. SQL хэлэнд дараах харьцуулах үйлдлүүдтэй.

Page 27: SQL

>(их)

<(бага)

=(тэнцүү)

<=(бага буюу тэнцүү)

>=(их буюу тэнцүү)

!= (тэнцүү биш)

<>(тэнцүү биш)

!< (бага биш)

!> (их биш)

Харьцуулах үйлдлийн үр дүн нь дараах 3 утгын аль нэг нь байна. Үүнд : TRUE, FALSE мөн

UNKNOWN.Хэрэв SET ANSI_NULLS нь ON тохиргоотой байвал, NULL утга дээр хийгдсэн

харьцуулах үйлдэл нь UNKNOWN утгатай байна. Харин SET ANSI_NULLS нь OFF байвал адилхан

дүрэмтэй байх ба нэг л тохиолдолд буюу хоѐр NULL –г тэнцүү эсэхийг шалгасан үед л TRUE утга

буцаана.

DECLARE @ MyProduct int

SET @ MyProduct = 10

IF (@MyProduct<>0)

SELECT *

FROM Products

WHERE ProductID = @MyProduct

GO

Логик үйлдлүүд

SQL хэл нь дараах логик үйлдлүүдтэй.

Үйлдэл Тайлбар

ALL Хэрэв бүх шалгалтууд үнэн бол TRUE байна.

AND Хоѐр илэрхийлэлд хоѐул үнэн бол TRUE байна.

ANY Хэрэв шалгалтуудын аль нэг нь үнэн бол TRUE.

BETWEEN Хэрэв тухайн утга тодорхой завсарт байгаа бол TRUE байна.

EXISTS Хэрэв дэд хүсэлт нь ядаж нэг мөр буцааж байвал TRUE байна.

IN Хэрэв утга нь илэрхийллийн жагсаалтад байгаа бол TRUE байна.

LIKE Хэрэв утга нь тухайн нөхцөл, шүүлтүүрийг хангаж байвал TRUE байна.

NOT Boolean утгыг эсрэгээр тогтооно.

OR Хэрэв 2 илэрхийллийн ядаж нэг нь үнэн бол TRUE байна.

SOME Хэрэв шалгалтуудын зарим нь үнэн бол TRUE байна.

USE pubs

GO

SELECT phone

FROM authors

WHERE phone LIKE „415 %‟

ORDER by au_lname

GO

IF(„UB‟ !=ALL(SELECT city FROM authors))

SELECT „Улаанбаатар хотоос зохиогч байхгүй‟

ELSE

SELECT „Улаанбаатар хотоос ядаж нэг зохиогч байна‟

IF („UB‟!=ANY (SELECT city FROM authors))

SELECT „Улаанбаатар хотоос ядаж нэг зохиогч байна‟

ELSE

SELECT „Улаанбаатар хотоос зохиогч байхгүй‟

Page 28: SQL

Тэмдэгт мөр залгах үйлдэл

Тэмдэгт мөрүүдийг залгахдаа + үйлдлийг ашигладаг.Харин тэмдэгт мөртэй холбоотой бусад бүх

үйлдлүүд нь SUBSTRING гэх мэт функцүүдийн тусламжтайгаар гүйцэтгэдэг.

Үйлдлүүдийн зэрэглэл

Хэрэв илэрхийлэлд олон үйлдэл оролцсон байвал тухайн үйлдлүүд ямар дарааллаар бодогдохыг

тэдгээрийн зэрэглэл тодорхойлно. SQL хэлийн үйлдлүүд зэрэглэлээр дараах байдлаар жагсаагддаг.

Унар үйлдлүүд : +, -, ~, (Бит үгүйсгэл)

*, /, %

=, >, <, >=, <=, <>, !=, !>, !<

^ (Бит XOR), & (Бит AND), | (Бит OR)

NOT

AND

ALL, ANY, BETWEEN, IN, LIKE, OR, SOME

=

WHILE давталт

Бичлэгийн хэлбэр нь :

WHILE Boolean_илэрхийлэл

{нэг буюу бүлэг командууд}

[BREAK]

{ нэг буюу бүлэг командууд }

[CONTINUE]

Жишээ :

CREATE TABLE # Test

(Counter int, DateCreated datetime)

GO

DECLARE @ counter int

SET @counter =1

WHILE @counter<=10

BEGIN

INSERT # Test VALUES (@counter, GETDATE())

IF(SELECT COUNT(*) FROM #Test)>8

BEGIN

PRINT “Inserted more than 8 rows”

BREAK

END

SET @counter=@counter+1

END

CASE КОМАНД

Энэ команд нь олон сонголтыг гүйцэтгэдэг команд юм. CASE нь 2 үндсэн

форматтай :

Энгийн CASE команд нь илэрхийллийг тооцоолж олон сонголтыг сонгодог.

Харин нөгөө формат нь үр дүнг гаргахын тулд олон илэрхийллийг тооцоолдог.

Бичлэгийн хэлбэр

CASE оролтын илэрхийлэл

WHEN илэрхийлэл THEN үр дүнгийн илэрхийлэл

Page 29: SQL

[…n]

[

ELSE үр дүнгийн илэрхийлэл

]

END

Оролтын илэрхийллийг тооцоолоод оролтын_илэрхийлэл=илэрхийлэл шалгалтыг хийж сонголт

хийнэ.

---------------------------------------------------------------------

CASE

WHEN ШалгахИлэрхийлэл THEN Үр дүнгийн илэрхийлэл

[…n]

[

ELSE Үр дүнгийн илэрхийлэл

]

END

Дарааллын дагуу Шалгах илэрхийллүүдийг тооцоолон анхны үнэн утга буцаасан сонголтыг хийнэ.

SELECT GETDATA(), CASE DATEPART(dw, GETDATE())

WHEN 1 THEN “Даваа”

WHEN 2 THEN “Мягмар”

WHEN 3 THEN “Лхагва”

WHEN 4 THEN “Пүрэв”

WHEN 5 THEN “Баасан”

WHEN 6 THEN “Бямба”

WHEN 7 THEN “Ням”

DECLARE @Var1 smalldatetime, @ Var2 int

SET @Var1=‟13 aug 1978‟

SET @Var@=DATEDIFF (yy, @Var1, GetDate())/ 365

SELECT @Var2, Case WHEN @Var2<1 THEN „нярай‟

WHEN @Var2<10 THEN „хүүхэд нас‟

WHEN @Var2<15 THEN „өсвөр нас‟

WHEN @Var2<27 THEN „залуу нас‟

WHEN @Var2<65 THEN „том хүн‟

COALESCE команд

Энэ команд нь тухайн илэрхийллүүдээс хамгийн анхны NULL бишийг сонгодог команд юм.

Жишээ:

DECLARE @Var1 int, @Var2 int, @Var3 int

SET @Var2=1024

SELECT COALESCE (@Var1, @Var2, @Var3)

SET @Var1=17

SELECT COALESCE (@Var1, @Var2, @Var3)

ISNULL команд

Хэрвээ тухайн баганын утгууд дотор NULL утгууд хадгаламж байвал тэр багана дээр хийгдсэн бүх

үйлдлийн үр дүн NULL болдог.Иймээс тооцоололтыг зөв явуулахын тулд энэ командыг ашиглана.

SELECT 1 + NULL, „Foilant‟ + NULL, 3*NULL

--------------------------------------------------------------

Үр дүн нь :

NULL NULL NULL

DECLARE @Var1 decimal(10, 2)

SET @Var1=0

SELECT @Var1=@Var1+ISNULL(price, 0) FROM titles

Page 30: SQL

SELECT @Var1

Төрлийн хувиргалт

Transact SQL хэлэнд төрлийн хувиргалтыг дараах 2 функцын тусдамжтайгаар гүйцэтгэдэг.

CAST (илэрхийлэл AS төрөл )

CONVERT (төрөл [(урт)], илэрхийлэл, [хэлбэр])

Энэ хоѐр функцын боломж ерөнхийдөө ижил боловч datetime өгөгдлийн хувьд CONVERT функц нь

арай өргөн боломжтой.

DECLARE @Var1 int

SET @Var1=1963

SELECT CASE (@Var1 AS nvarchar(10))

DECLARE @PhNum int

SET @PhNum=99999999

SELECT „Phone Number : (‟ + SUBSTRING(CAST(@PhNum AS varchar (10)), 1, 3)+‟)‟+

SUBSTRING(CAST(@PhNum AS varchar (10)), 1, 3)+‟-‟+

SUBSTRING(CAST(@PhNum AS varchar (10)), 7, 4) /* (999)999-9999 */

Лекц 7. - SELECT команд

SELECT команд if тухайн тодорхойлогдсон шаардлагыг хангах өгөгдлийг серверээс татан,

хэрэглэгчдэд үр дүнгийн хүснэгт хэлбэрээр дамжуулдаг команд юм. SELECT командын бүрэн

синтакс бол маш хүнд байдаг боловч ихэнх SELECT команд 4 үндсэн бүлэг хэсгээс тогтдог.

Үр дүнгийн хүснэгтэд байх багана, тэдгээрийн аттрибутууд

Өгөгдлийг нь ашиглах хүснэгтүүд, тэдгээрийн логик холбоо

Тухайн хүснэгтүүдээс өгөгдөл авахын тулд тавьсан янз бүрийн нөхцөл, шалгуурууд

Үр дүнгийн хүснэгтийн хэрхэн эрэмбэлэгдэх дараалал

SELECT командын бичиглэлийн хэлбэрийг хураангуй байдлаар үзүүлвэл:

SELECT хүсэлтийн_жагсаалт

[INTO шинэ_хүсэлтийн_нэр]

FROM хүснэгтийн_жагсаалт

[WHERE хайх_нөхцлүүд]

[GROUP BY групплэх_жагсаалт]

[HAVING хайх_нөхцлүүд]

[ORDER BY дарааллын_жагсаалт [ASC | DESC ] ]

Хүсэлтийн жагсаалт

Энэ жагсаалт нь хүсэлтийн үр дүнд буцаах багануудыг тодорхойлно. Хүсэлтийн жагсаалтан дахь

илэрхийллийн тусламжтайгаар тухайн багануудын дараах аттрибутууд тодорхойлогддог.

Өгөгдлийн төрөл хэмжээ

Хүсэлтийн үр дүнд буцаах багануудын нэр байж болно. Хэрэв илэрхийлэл нь тухайн баганад

ямар нэг нэр тодорхойлоогүй, эсвэл баганын нэрийг нь солихыг хүсвэл AS түлхүүр үгийг

хэрэглэдэг.

Мөн тухайн илэрхийллийн үр дүнд бодогдон гарах тэр баганын утгууд байна.

Хүсэлтийн жагсаалтан дахь элементүүд нь дараах зүйлс байж болно:

Энгийн илэрхийлэл: функц, хувьсагч, тогтмол, баганын нэр

Тухайн үр дүнгийн хүснэгтийн мөр бүрд нэг л утга олгож чадах дэд хүсэлт байж болно.

Хэд хэдэн энгийн илэрхийллээс бүрдэх хүнд илэрхийлэл

Page 31: SQL

Бүх баганыг ашиглахыг тодорхойлсон * тэмдэглэгээ

Хувьсагчид утга ологсон илэрхийлэл байж болно.

IDENTITY шинж чанартай баганыг ашиглөхыг тодорхойлсон IDENTITYCOL түлхүүр үг

байж болно

ROWGUIDCOL шинж чанартай баганыг ашиглахыг тодорхойсон ROWGUIDCOL түлхүүр үг

Тодорхойлсон синтаксийг ашиглан шинэ багана үүсгэх

Бүх баганыг сонгох

(*) тэмдэглэгээг ашиглаж байгаа бол, багануудын дараалал нь анх CREATE TABLE, ALTER TABLE

ба CREATE VIEW командуудыг ашиглахдаа ямар дарааллаар заасантай адил байна.

Хүсэлтийн жагсаалтад илэрхийлэл бичих

Хүсэлтийн жагсаалтад илэрхийлэл ашиглаж болох ба энэ нь тухайн хүснэгтэд байхгүй тооцоологдсон

багануудыг үүсгэх боломжийг бүрдүүлдэг. Илэрхийлэл бичихдээ дараах элементүүдийг ашиглана.

Тоон тогтмол, баганууд дээр арифметик үйлдлүүд, функцуудыг ашиглаж болно.

SELECT ROUND((Unitprice *.9), 2) AS DiscountPrice

FROM Products

WHERE ProductID=58

Өгөгдлийн төрлийн хувиргалт:

SELECT (CAST (ProductID AS VARCHAR(10)) + „:‟ + ProductName) AS ProductIDName

FROM Products

CASE функц:

SELECT ProductID, ProductName8

CASE CategoryID

WHEN 1 THEN ROUND ((UnitPrice *. 6), 2)

WHEN 2 THEN ROUND ((UnitPrice *. 7), 2)

WHEN 2 THEN ROUND ((UnitPrice *. 8), 2)

ELSE ROUND ((UnitPrice * .9), 2)

END AS DiscountPrice

FROM Products

Дэд хүсэлт:

SELECT Prd.ProductID, Prd.ProductName,

( SELECT SUM(OD.UnitPrice * OD.Quantity)

FROM Northwind.dbo.[Order Details] AS OD

WHERE OD.ProductID = Prd.ProductID

) AS SumOfSales

FROM Northwind.dbo.Products AS Prd

ORDER BY Prd.ProductID

Багануудыг нэрлэх

AS командыг хүснэгтийн нэрийг солих эсвэл илэрхийллээс бүрдэх багануудыг нэрлэхэд хэрэглэнэ.

SELECT EmpSSN AS “Employee Social Security Number”

FROM EmpTable

Илэрхийллээр тооцоологдсон багана нь ямар ч нэргүй байдаг ба хэрэв нэрлэх шаардлагатай болсон

тохиолдолд AS командыг ашигладаг. Жишээнд DATEDIFF функцыг ашиглан тооцоолсон баганыг

AS-аар нэрлэж байна.

SELECTOrderID,

DATEDIFF(dd, ShippedDate, GETDATE() ) AS DaysSinceShipped

FROM Northwind.dbo.Orders

WHERE ShippedDate IS NOT NULL

Page 32: SQL

AS-ыг ашиглан баганыг дахин нэрлэхээс гадна Transact-SQL хэлэнд дараах аргаар нэрлэж болдог:

column_alias=column_name

Жишээ:

SELECT OrderID,

DaysSinceShipped= DATEDIFF(dd, ShippedDate, GETDATE() )

FROM Northwind.dbo.Orders

WHERE ShippedDate IS NOT NULL

Үр дүнгийн хүснэгтийн баганын нэр нь идентификатор мөн юм.Иймээс идентификаторын дүрмийн

дагуу стандарт болон тусгаарлагдсан идентификатор алинийг нь ч ашиглаж болно. Мөн баганын нэр

нь 128 хүртэлх тэмдэгтээс тогтож болно. Гэвч зарим тохиолдолд жишээ нь SQL 6.5 ODBC driver-ийг

ашигласан тохиолдолд баганын нэрийг 30 тэмдэгтээр хязгаарлан тасддаг.

USE pubs

SELECT pub_name AS “Book Publisher ”

FROM publishers

ORDER BY pub_name ASC

Мөн дан хашилтыг ашиглан („‟) баганын нэрийг тусгаарлах боломжтой байдаг.

USE pubs

SELECT SUM(ytd_sales) AS „sum‟

FROM titles

DISTINCT тодорхойлолтыг ашиглан давтагдсан мөрүүдийг хасах

DISTINCT түлхүүр үг нь SELECT командын үр дүнгийн мөрүүдээс давтагдсан мөрүүдийг хасна

гэдгийг тодорхойлдог. Хэрэв DISTINCT-ийг тодорхойлоогүй бол давтагдсан байсан ч бүх мөрүүдийг

үр дүн болүон буцаадаг.

USE pubs

SELECT DISTINCT au_id

FROM titleauthor

Here is the result set:

DISTINCT тодорхойлолтыг хэрэглэж байх үед NULL утгыг мөн давтагдашгүй болгодог. ӨӨрөөр

хэлбэл энэ командыг хэрэглэсэн үед SELECT нь зөвхөн нэг NULL утгатай бичлэг буцаана.

TOP ба PERCENT-ийг ашиглан үр дүнгийн бичлэгүүдийн тоог хязгаарлах

TOP-ийг ашиглан буцаагдах бичлэгүүдийн тоог хязгаарладаг.

TOP n[PERCENT]

n – буцах мөрийн тоо. Хэрэв PERCENT-ийг зааж өгөөгүй бол n нь буцаах мөрийн тоо юм. Харин

PERCENT –ийг зааж өгсөн бол n нь нийт бичлэгийн хэдэн хувийг буцаахыг тодорхойлно:

TOP 120 /* Хүснэгтийн 120 бичлэгийг буцаана */

TOP 12 PERCENT /* Хүснэгтийн нийт бичлэгийн 15%-ийг буцаана. */

Хэрэв SELECT командад TOP мөн ORDER BY хоѐрыг зэрэг заасан бол TOP-оор сонгогдох мөрүүд

нь эрэмбэлэгдсэн хүснэгтээс сонгогдоно. Буцаах мөрүүдийн тоог хязгаарлах өөр нэг арга нь SET

ROWCOUNT n-ийг хүсэлтээ өгөхөөс өмнө биелүүлэх арга юм. SET ROWCOUNT нь TOP-оос дараах

шинж чанаруудаараа ялгаатай.

SET ROWCOUNT нь ORDER BY команд үйлчилэхээс өмнө тухайн үр дүнгийн хүснэгтэд

үйлчилдэг. Эхлээд n бичлэгүүд сонгогдоод дараа нь эрэмбэлэгдээд тэгээд клиент рүү

буцаагддаг.

TOP команд нь зөвхөн нэг SELECT команддаа л үйлчилдэг. Харин SET ROWCOUNT нь

дараагийн SET ROWCOUNT команд ажиллах хүртэл үйлчилдэг. SET ROWCOUNT 0

командыг өгч энэ командын үйлчилгээг зогсоодог.

Page 33: SQL

FROM тодорхойлолтыг ашиглах

FROM-ыг дараах зорилгоор ашигладаг.

Хүснэгтэд хэрэглэгдэх хүснэгтүүдийг зааж өгөхөд хэрэглэгдэнэ. Хүснэгтийн нэрсийг AS ийг

ашиглан өөрчлөн нэрлэж болно.

Нийлмэл хүсэлтийг тодорхойлоход ашиглана.

SELECT Cst.CustomerID, Cst.CompanyName, Cst.ContactName,

Ord.ShippedDate, Ord.Freight

FROM Northwind. dbo.Orders AS Ord

JOIN

Northwind.dbo.Customers AS Cst

ON(Cst.CustomerID = Ord.CustomerID)

Мөн FROM тодорхойлолтод дэд хүсэлт ашиглаж болно.

SELECT ST.stor_id, ST.stor_name

FROM stores AS ST,

(SELECT stor_id, COUNT(DISTINCT title_id) AS title_count

FROM sales

GROUP BY stor_id

) AS SA

WHERE ST.stor_id = SA.stor_id

AND SA.title_count = (SELECT COUNT (*) FROM titles)

WHERE, HAVING ашиглан өгөгдлийг шүүх

WHERE болон HAVING командууд нь шүүлтүүрүүд юм. Логик илэрхийлэл ашиглан тухайн

өгөгдлүүд дээр шүүлтүүр тавих бөгөөд тухайн нөхцлийг хангасан бичлэгүүдийг л сервер буцаах

болно.

SELECT CustomerID, CompanyName

FROM Northwind.dbo.Customers

WHERE Region = „WA‟

HAVING команд нь ихэвчлэн GROUP BY –тай цуг ашиглагддаг. HAVING команд нь WHERE

командын дараа үйлчилгээ үзүүлдэг. Жишээ нь: энэ WHERE команд нь $100-оос өндөр үнэтэй

бараануудыг шүүж байна. Харин HAVING нь 100 болон түүнээс дээш тоотой барааг шүүж байна.

SELECT OrdD1.OrderID AS OrderID,

SUM(OrdD1.Qualitity) AS “Units Sold”,

SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue

FROM [Order Details] AS OrdD1

WHERE OrdD1.OrderID in (SELECT DISTINCT OrdD2.OrderID

FROM [Order Details] AS OrdD2

WHERE OrdD2.UnitPrice > $100)

GROUP BY OrdD1.OrderID

HAVING SUM(OrdD1.Quantity ) > 100

WHERE болон HAVING-ийн хайх нөхцөлд:

Харьцуулах үйлдлүүд

BETWEEN болон NOT BETWEEN үйлдлүүд

IN, NOT IN үйлдлүүд

SELECT CategoryID, ProductID, ProductName

FROM Northwind.dbo.Products

WHERE CategoryID IN (1,4,5,7)

ORDER BY CategoryID, ProductID

LIKE ба NOT LIKE үйлдлүүд ашиглагдана.

Page 34: SQL

IS NULL ба IS NOT NULL үйлдлүүд.

SELECT CompanyName, City, Region, Country

FROM Northwind.dbo.Customers

WHERE Region IS NOT NULL

ORDER BY CompanyName

=ALL, >ALL, <=ALL, ANY үйлдлүүд.

USE Northwind

GO

SELECT OrdD1.OrderID, OrdD1.ProductID

FROM “Order Details” OrdD1

WHERE OrdD1.Quantity > ALL

(SELECT OrdD2.Quantity

FROM “Order Details” OrdD2.JOIN Products Prd

ON OrdD2.ProductID = Prd.ProductID

WHERE Prd.CategoryID = 1 )

GO

AND, OR , NOT логик холбоосууд

ORDER BY ашиглан эрэмбэлэх

ORDER BY-ыг ашиглан үр дүнгийн хүснэгтийг эрэмбэлдэг. Эрэмбэлэлтийг өсөхөөр (ASC) мөн

буурахааар (DESC) хийж болно. Анхдагч тохиргоо нь ASC байдаг. Хэрэв ORDER BY –д нэгээс олон

багана зааж өгсөн бол эрэмбэлэлт нь давхар хийгдэнэ. Дараах жишээнд titles хүснэгтээс өгөгдөл

авахдаа эхлээд pub_id талбараар буурахаар, дараа нь бусад талбараар өсөхөөр эрэмбэлж байна.

USE pubs

SELECT pub_id, type, title_id, price

FROM titles

ORDER BY pub_id DESC, type, price

Харин text болон image төрлөөр эрэмбэлэх боломжгүй. Мөн дэд хүсэлт, тогтмол илэрхийлэл,

функцийг ORDER BY- д ашиглах боломжгүй. Харин тэдгээрийг хүсэлтийг жагсаалтад бичээд нэрлэн

ашиглаж болно.

SELECT type, sum (ytd_sales) AS sales_total

FROM titles

GROUP BY type

ORDER BY sales_total

Нийлмэл хүсэлт

Нийлмэл хүсэлтийг ашиглан хоорондоо логик холбоотой хэд хэдэн хүснэгтүүдээс өгөгдөл татдаг.

Нийлмэл хүсэлтийг нөхцөл нь хүснэгтүүд хэрхэн холбогдохыг тодорхойлно. FROM болон WHERE

хэсгүүдийн алинийг нь ч нийлмэл хүсэлт тодорхойлоход ашиглаж болно. FROM хэсэгт холболтын

нөхцлийг зааж өгөхдөө дараах бичлэгийг ашиглана.

FROM Эхний_хүснэгт Холболтын_төрөл Удаах_хүснэгт [ ON (холболтын_нөхцөл )]

Холболтын_төрөл – нь холболтыг ямар байдлаар хийхийг тодорхойлно. Гадаад, дотоод, шууд

холболт гэсэн төрлүүд байна. Холболтын_нөхцөл нь хоѐр хүснэгтийн мөрүүд хэрхэн холбогдох

нөхцлийг тодорхойлно.

SELECT ProductID,

Suppliers.SupplierID,

CompanyName

FROM Suppliers JOIN Products

Page 35: SQL

ON (Suppliers.SupplierID=Products.SupplierID)

WHERE UnitPrice>$10

AND CompanyName Like N‟F%‟

Өмнөх жишээнд FROM хэсэгт холболтыг хийсэн байнаь харин дараах жишээнд WHERE хэсэгт

холболт хийж байна.

SELECT ProductID,

S.SupplierID,

S.CompanyName

FROM Suppliers AS S, Products AS P

WHERE S.SupplierID=P.SupplierID)

AND P.UnitPrice>$10

AND CompanyName Like N‟F%‟

Нийлмэл хүсэлтийг боловсруулахдаа SQL Server нь дараах логик дарааллыг баримталдаг:

From хэсэг дэх холболтын нөхцлийг боловсруулна.

WHERE хэсэг дэх холболтын нөхцөл болон хайлтын нөхцлийг боловсруулна.

HAVING хэсэг дэх хайлтын нөхцлийг боловсруулна.

Холболтын нөхцөлд оролцох баганууд нь ижил нэртэй байж болохгүй, мөн ижил төрөлтэй байх

ѐстой. Холболт ашиглаж хийсэн нийлмэл хүсэлтүүдийг ихэнх тохиолдолд Дэд хүсэлт ашиглан хийж

болдог. Мөн ихэнх дэд хүсэлт ашигласан хүсэлтүүдийг нийлмэл хүсэлт ашиглан хийж болдог.

Хэдийгээр холболтын нөхцлийг FROM болон WHERE хэсэгт хоѐуланд нь зааж өгч болох боловч,

FROM-д зааж өгөх нь дээр байдаг. Холболтын дараах төрлүүд байдаг.

Дотоод холболт

2 хүснэгтийн ерөнхий багануудын утгууд дээр харьцуулах үйлдэл ашиглан гадаад холболтыг

хийдэг ба тухайн харьцуулах нөхцлийг хангасан утгууд л сонгогдоно.

SELECT *

FROM authors AS a INNER JOIN publishers AS p

ON a.city = p.city

ORDER BY a.au_Iname DESC

Гадаад холболт. Гадаад холболт нь зүүн, баруун, бүтэн гэсэн 3 төрөл байдаг. Дотоод

холболт хийсэн үед тухайн нөхцлийг хангаагүй мөрүүдийг буцаадаггүй. Харин гадаад

холболт хийсэн үед тухайн 2 хүснэгтийн ядаж аль нэгнийх нь бүх бичлэгүүдийг буцаадаг.

LEFT JOIN or LEFT OUTER JOIN

Зүүн гадаад холболтын үр дүнд LEFT OUTER хэсэгт заасан зүүн хүснэгтээс зөвхөн

тухайн нөхлийг хангасан мөрүүдийг биш, бүх мөрүүдийг татна. Хэрэв зүүн

хүснэгтийн мөрийн утга нь баруун хүснэгтэд байхгүй тохиолдолд баруун хүснэгтээс

авч буй бүх талбарууд NULL утгатай болдог.

RIGHT JOIN or RIGHT OUTER JOIN.

Баруун хүснэгтээс бүх мөрүүдийг татна. Хэрэв баруун хүснэгтийн утга нь зүүн

хүснэгтэд байхгүй бол зүүн хүснэгтийн талбаруудад NULL утгууд буцаагдана.

FULL JOIN or FULL OUTER JOIN.

Бүтэн холболт нь зүүн ба баруун хүснэгтээс бүх мөрүүдийг буцаана. нэг хүснэгт дэх

утга нь нөгөөдөхдөө байхгүй байх тохиолдол бүрд нөгөө хүснэгтийн талбарууд нь

NULL утгатай буцаагдана.

Хөндлөн холболт

Хөндлөн холболтын үед зүүн хүснэгтээс бүх мөрүүд буцаагдах ба зүүн хүснэгтийн мөр бүр

нь баруун хүснэгтийн бүх мөрүүдтэй нэгтгэсэн байдлаар буцаагдана.

SQL Server нь SQL-92 стандартын дагуу WHERE хэсэгт *= ба =* үйлдлүүдийг ашиглан гадаад

холболтыг хийх боломжтой байдаг.

Page 36: SQL

Зүүн гадаад холболтыг ашиглах

Дараах жишээнд хэвлэлийн газар нь байрладаг хотдоо амьдардаг зохиолчдыг үзүүлжээ. Жишээнд бүх

зохиолчдыг үзүүлэхийн тулд зүүн гадаад холболтыг ашиглажээ.

SELECT a.au_fname, a.au_Iname, p.pub_name

FROM authors a LEFT OUTER JOIN publishers p

ON a.city = p.city

ORDER BY p.pub)name ASC, a.au_Iname ASC, a.au_fname ASC

LEFT OUTER JOIN нь authors хүснэгтээс бүх бичлэгийг publishers хүснэгтэд тухайн зохиолчийг хот

байгаа эсэхээс үл хамааран татна. Хэрэв тухайн хот байхгүй бол pub_name талбар NULL утга авна.

Баруун гадаад холболтыг ашиглах

Дараах жишээнд тухайн хэвлэлийн газрын байрладаг хотод амьдардаг зохиолчдыг үзүүлжээ. Гэхдээ

баруун холболт ашигласан учир бүх хэвлэлийн газарүр дүнд буцах ба харин тухайн хэвлэлийн газар

байрладаг хотод амьдардаг зохиолч байхгүй бол харгалзах талбарууд NULL утга авна.

SELECT a.au_fname, a.au_Iname, p.pub_name

FROM authors AS a RIGHT OUTER JOIN publishers AS p

ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_Iname, a.au_fname ASC

Бүтэн гадаад холболтыг ашиглах

Хэрэв бүх хэвлэлийн газар болон бүх зохиолчдын мэдээллийг авахыг хүсвэл бүтэн холболт ашиглана.

SELECT a.au_fname, a.au_Iname, p.pub_name

FROM authors a FULL OUTER JOIN publishers p

ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_Iname ASC, a.au_fname ASC

Хөндлөн холболт ашиглах

Өмнөх жишээн дээр CROSS JOIN ашиглавал нийт 184 бичлэг буцааж байна. Authors хүснэгт 23

бичлэг, харин publishers нь 8 бичлэгтэй бөгөөд үр дүн нь 8*23=184 болно.

SELECT au_fname, au_Iname, pub_name

FROM authors CROSS JOIN publishers

ORDER BY au_Iname DESC

Хэрэв WHERE хэсгийг CROSS JOIN дээр хийвэл энэ нь дотоод холболттой адил болно.

SELECT au_fname, au_Iname, pub_name

FROM authors CROSS JOIN publishers

WHERE authors.city = publishers.city

ORDER BY au_Iname DESC

-- Эсвэл

SELECT au_fname, au_Iname, pub_nam

FROM authors INNER JOIN publishers

ON authors.city = publishers.city

ORDER BY au_Iname DESC

WHERE хэсэгт холболтыг хийх : Эцсийн үр дүнд нөлөөлөхгүйгээр дотоод холболтыг FROM эсвэл

WHERE-д зааж өгч болно. Харин гадаад холболтын хувьд тэд FROM эсвэл WHERE-д хийгдсэн

Page 37: SQL

эсэхээсээ шалтгаалан ялгаатай ажиллаж болно. Дараах жишээнд WHERE хэсэгт холболтыг хийсэн

мөн шүүлт хийсэн байна:

SELECT t.title_id, t.title, s.qty

FROM titles AS t, sales AS s

WHERE t.title_id *= s.title_id

AND s.stor_id = „7066‟

Жишээнд stor_id = „7066‟ нь холболтын нөхцөлтэй цуг бодогдоно. Нийлмэл хүсэлт нь 18 мөр

буцаана. Харин холболтыг FROM хэсэгт хийвэл:

SELECT t.title_id, t.title, s.qty

FROM titles AS t LEFT OUTER JOIN sales AS s

ON t.title_id = s.title_id

WHERE s.stor_id = „7066‟

Энэ хүсэлт ердөө 2 мөр буцаана. Учир нь эхлээд зүүн холболт хийсний дараа stor_id = „7066‟ шүүлт

хийгдэнэ. Хүсэлт нь stor_id талбартаа NULL утга бүхий бичлэгүүдийг хасаад дараа нь шүүлт хийнэ.

Харин өмнөх жишээтэй адил үр дүн буцаахыг хүсвэл WHERE хэсгийг авч хаяж болно:

SELECT t.title_id, t.title, s.qty

FROM titles AS t LEFT OUTER JOIN sales AS s

ON t.title_id = s.title_id

AND s.stor_id = „7066‟

Лекц 10. - SELECT, INSERT, UPDATE, DELETE

UNION ашиглан хүснэгтүүдийг нэгтгэх

UNION үйлдлийг ашиглан олон SELECT хүснэгтүүдийн үр дүнг нэг хүснэгтэд нэгтгэдэг. Нэгтгэгдэх

хүснэгтүүд нь бүгд ижил бүтэцтэй байх ѐстой. Энэ нь ижил тооны багануудтай, мөн баганууд нь

харгалзан ижил төрөлтэй байх ѐстой.

Бичлэгийн хэлбэр:

Select_statement UNION [ALL] select_statement

Жишээ:

Table1 Table2

ColumnA ColumnB ColumnC ColumnD

Char(4) int char(4) int

…….. …. ……… ….

abc 1 ghi 3

def 2 jkl 4

ghi 3 mno 5

SELECT * FROM Table1

UNION

SELECT * FROM Table2

Үр дүнд нь :

abc 1

def 2

ghi 3

jkl 4

mno 5

Нэгдсэн хүснэгтийн багануудын нэр нь эхний хүснэгтээс сонгогдоно. Эхний хүснэгтийн нэрийг

өөрчлөхөд нэгдсэн хүснэгтийн нэрүүд өөрчлөгдөнө. UNION үйлдэл нь үр дүнгийн хүснэгтээс

Page 38: SQL

давтагдсан мөрүүдийг хасдаг. Харин ALL-ийг хамт ашигласан тохиолдолд давтагдсан мөрүүдийг

хасахгүйгээр бүх мөрүүдийг буцаадаг.

Хэдэн ч тооны хүснэгтүүдийг UNION ашиглан нэгтгэж болдог:

SELECT * FROM TableA

UNION

SELECT * FROM TableB

UNOIN

SELECT * FROM TableC

UNION

SELECT * FROM TableD

UNOIN ашиглан нэгтгэж байх үед, нэгж SELECT хүснэгтүүд нь ORDER BY эсвэл COMPUTE

ашиглаж болохгүй. Харин сүүлийн SELECT хүснэгтийн ард л ORDER BY, COMPUTE –ыг ашиглаж

болно. Өөрөөр хэлбэл тэдгээрийн нэгдсэн хүсэлтэд л ашиглана. GROUP BY, HAVING нь нэгдсэн

хүсэлтэд биш, харин нэгж SELECT хүсэлтэд л ашиглагдана.

Дэд хүсэлт тодорхойлох, ашиглах

Дэд хүсэлт гэдэг SELECT, INSERT, UPDATE, DELETE командуудад ашиглагдаж болох SELECT

хүсэлт юм. Илэрхийлэл ашиглах боломжтой бүх газар дэд хүсэлтийг ашиглаж болно.

SELECT Ord.OrderID, Ord.OrderDate,

(SELECT MAX(OrdDet.UnitPrice)

FROM Northwind.dbo.[Order Details] AS OrdDet

WHERE Ord.OrderID = OrdDet.OrderID) AS MaxUnitPrice

FROM Northwind.dbo.Orders AS Ord

Ихэнх дэд хүсэлт ашигласан хүсэлтүүдийг нийлмэл хүсэлт ашиглан бичиж болдог. Дараах жишээнд

дэд хүсэлт болон нийлмэл хүсэлт ашиглах аргуудаар тухайн даалгаврыг гүйцэтгэжээ:

/* Дэд хүсэлт ашиглавал */

SELECT ProductName

FROM Northwind.dbo.Products

WHERE UnitPrice =

(SELECT UnitPrice

FROM Northwind.dbo.Products

WHERE ProductName = „Sir Rodney‟‟s Scones‟ )

/* Нийлмэл хүсэлт ашиглавал */

SELECT Prd1.ProductName

FROM Northwind.dbo.Products AS Prd1

JION Northwind.dbo.Products AS Prd2

ON ( Prd1.UnitPrice = Prd2.UnitPrice)

WHERE Prd2.ProductName = „Sir Rodney‟‟s Scones‟

Дэд хүсэлт нь үргэлж хаалтаар хашигдаж байдаг. Дэд хүсэлтэд COMPUTE, FOR BROWSE-ийг

ашиглаж болохгүй. Дэд хүсэлтийг 32 хүртэл давхраар ашиглаж болно.

USE pubs

SELECT au_lname, au_fname

FROM authors

WHERE au_id IN

(SELECT au_id

FROM titleauthor

WHERE title_id IN

(SELECT title_id

FROM titles

WHERE type = „popular_comp‟ ) )

Page 39: SQL

Дэд хүсэлт ашигласан хүсэлт нь ихэвчлэн дараах форматаар ашиглагддаг.

WHERE expression [NOT] IN (subquery)

WHERE expression comparison_operator [ANY | ALL] (subquery)

WHERE [NOT] EXISTS (subquery)

Дэд хүсэлт нь зөвхөн нэг утга буцаадаг бол түүнийг илэрхийлэл дотор ашиглаж болно.

SELECT title, price,

(SELECT AVG(price) FROM titles) AS difference

FROM titles

WHERE type = „popular_comp‟

INSERT команд

Хүснэгтэд шинэ мөрүүд нэмэхийн тулд INSERT командыг ашигладаг.

INSERT [INTO] Хүснэгт [(Багануудын_жагсаалт)] Шинээр_оруулах_утгууд

Багануудын_жагсаалт нь өгөгдөл оруулах багануудыг таслалаар зааглан оруулж өгсөн дараалал юм.

Хэрэв Багануудын_жагсаалт-ыг зааж өгөөгүй бол тухайн хүснэгт дэхь бүх багануудад утга авахыг

тодорхойлно. Хэрэв хүснэгтэд өгөгдөл оруулахдаа зарим баганыг зааж өгөөгүй бол

Багануудын_жагсаалт-д заагдаагүй багануудад NULL утга (эсвэл default утга) олгогдоно. Иимд

тэдгээр багануудад нь эсвэл NULL утгыг зөвшөөрдөг байх ѐстой эсвэл анхдагч утгатай байх ѐстой.

INSERT командыг ашиглан өгөгдөл оруулахдаа дараах төрлийн багануудыг зааж өгч болохгүй.

IDENTITY тодорхойлолттой бөгөөд автоматаар утгаа авдаг баганууд

Default тодорхойлолтод нь NEWID функцыг ашигласан баганууд

Тооцоологдсон баганууд

Жишээ нь дараах байдлаар үүсгэгдсэн ColC багана:

CREATE TABLE TestTable

(ColA INT PRIMARY KEY,

ColB INT NOT NULL,

ColC AS (ColA + ColB) * 2 )

Тухайн хүснэгтэд оруулахаар зааж өгч байгаа утгууд нь тэдгээр утгыг авахаар тодорхойлогдсон

багануудтай ижил төрөлтэй, тэнцүү тоотой байх шаардлагатай. Хүснэгтэд оруулах утгуудыг зааж

өгөх арга байдаг.

VALUES хэсгийг ашиглан утгуудыг тоочиж өгөх

Энэ аргаар зөвхөн нэг бичлэгийн утгуудыг зааж өгнө. Хэрэв багануудын жагсаалтыг зааж

өгөөгүй бол утгуудыг оруулж өгөгхдөө хүснэгтийг үүсгэсэн форматын даруу дараалал

баримтална.

INSERT INTO MyTable (PriKey, Description)

VALUES (123, „A description of part 123.‟ )

Дэд хүсэлт ашиглан нэгээс олон бичлэгийг баазад оруулах үйлдлийг хийдэг. Мөн дэд хүсэлт

ашиглан өгөгдөл оруулах бас нэг хэрэглээ нь гадаад баазаас өгөгдөл оруулах юм.

SELECT INTO ашиглан өгөгдөл оруулах

SELECT INTO командыг ашиглан шинэ хүснэгт үүсгэн түүнд өгөгдөл оруулдаг. Шинээр үүсгэх

хүснэгтийн бүтэц нь хүсэлтийн жагсаалт дахь илэрхийллийн бүтэц аттрибутаар тодорхойлогдоно.

SELECT INTO команд нь хэд хэдэн хүснэгтээс нийлмэл хүсэлтээр сонгогдох өгөгдлийг нэг хүснэгтэд

нэгтгэхэд ашиглагдана.

SELECT Shippers.*, Link.Address, Link.City,

Link.Region, Link.PostalCode

INTO NewShippers

Page 40: SQL

FROM Shippers

JOIN LinkServe.DB.dbo.Shippers AS Link

ON (Shippers.ShipperID = Link.ShipperID)

Лекц 11 - UPDATE, DELETE, VIEW

Хүснэгт дэхь өгөгдлийг өөрчлөх

Хүснэгтийг үүсгэж өгөгдөл оруулсны дараа өгөгдлийг өөрчлөх үйл ажиллагаа нь өдөр тутмын үйл

ажиллагаа болдог. SQL server нь хүснэгт дэхь өгөгдлийг өөрчлөх дөрөөх арга механизмуудтай.

UPDATE команд

Хүснэгт дэхь тодорхой шаардлага хангасан мөрүүдийг өөрчлөхөд хэрэглэгдэнэ.

API функцууд ашиглах

Хүснэгтийн идэвхитэй бичлэгийг өөрчлөхөд ашиглагдана.

UPDATETEXT команд

ntext, text, image төрөлтэй утгуудыг өөрчлөхөд энэ командыг хэрэглэнэ.

UPDATE ашиглан өгөгдлийг өөрчлөх

UPDATE команд нь зөвхөн нэг бичлэгийг эсвэл хэсэг бүлэг бичлэгийг мөн бүх бичлэгийг өөрчлөхөд

ашиглагдана. Мөн OPENROWSET, OPENQUERY функцуудыг ашиглан холбосон алсын сервер дээрх

бичлэгүүдийг өөрчлөхөд ашиглагдана. UPDATE команд нь дараах үндсэн 3 хэсэгтэй.

SET

Багануудын утгыг өөрчлөх (Багана = Илэрхийлэл) илэрхийллүүдийг таслалаар зааглан

жагсаасан дарааллыг зааж өгөх хэсэг юм. Тухайн багануудад олгож өгөх утгууд нь тогтмол

утга эсвэл өөр хүснэгтийн баганын утга эсвэл илэрхийллээс бодогдох утга байж болно.

FROM

SET хэсэгт талбарууд нь ашиглагдах хүснэгтүүдийг тодорхойлох хэсэг юм.

WHERE

Хүснэгтүүдээс тодрхой шаардлага хангах бичлэгүүдийг шүүх хэсэг юм.

Жишээ:

UPDATE Northwind.dbo.Products

SET UnitPrice = UnitPrice*1.1

WHERE CategoryID = 2

Хэрэв WHERE хэсэг заагдаагүй бол тухайн UPDATE нь бүх бичлэгийн утгыг өөрчилнө.

UPDATE publishers SET city = „Atlanta‟, state = „Georgia‟

SET хэсэгт баганын утгыг тооцоолсон утгаар тодорхойлж болно.

UPDATE OrderSummary

SET Last30Days =

(SELECT SUM(OrdDet.UnitPrice * OrdDet.Quantity)

FROM [Order Details] AS OrdDet

JOIN Orders AS Ord

ON (OrdDet.OrderID = Ord.OrderID

AND Ord.OrderDate > DATEADD (dd,-30,GETDATE() ) )

)

ntext, text, image төрөлтэй талбарыг өөрчлөх

Эдгээр төрөлтэй талбаруудын утгыг дараах аргуудаар өөрчилж болно.

Хэрэв бага хэмжээний утга олгож өгөх гэж буй бол UPDATE командаар өөрчилнө.

WRITETEXT командыг ашиглан өөрчилж болно.

Page 41: SQL

Тухайн талбарын утгын зарим нэг хэсгийг өөрчлөх гэвэл UPDATETEXT командыг ашиглана.

Жишээ:

CREATE TABLE TextParts (ColA INT PRIMARY KEY, ColB TEXT)

GO

INSERT INTO TextParts

VALUES (1, „Sample string START TAG Text to go END TAG Trailing text.‟)

GO

DECLARE @PtrVar BINARY(16)

DECLARE @InsertPos INT

DECLARE @DeleteLen INT

SELECT @PtrVar = TEXTPTR(ColB),

@InsertPos = (PATINDEX(„%START TAG%‟, ColB) + 9 ),

@DeleteLen = (PATINDEX(„%END TAG%‟, ColB) – ( PATINDEX(„%START TAG%‟, ColB) + 9 + 2 /*

allow for blanks */

)

FROM TextParts

WHERE ColA = 1

UPDATETEXT TextParts.ColB

@PtrVar

@InsertPos

@DeleteLen

WITH LOG „The new text‟

GO

SELECT * FROM TextParts

Үр дүн нь:

ColA ColB

------------ ---------------------------------------------------------------------------

1 Sample string START TAG The new text END TAG Trailing text.

Өгөгдлийг устгах

SQL Server нь хүснэгт дэхь өгөгдлийг устгах дараах аргуудыг ашигладаг.

DELETE команд

Хүснэгт дэхь идэвхтэй бичлэгийг устгаах

TRUNCATE TABLE команд

DELETE команд

DELETE команд нэг болон хэд хэдэн бичлэгүүдийг устгахад хэрэглэгдэнэ.

DELETE table FROM table_sources WHERE search_condition

Хэрэв WHERE хэсгийг заагаагүй бол тухайн хүснэгтийн бүх бичлэгийг устгана. FROM хэсэгт туханй

WHERE хэсэгт заагдах нөхцөлд ашиглагдах хүснэгтийг зааж өгөхөд л хэрэглэнэ. Харин FROM хэсэгт

заагдсан хүснэгтээс өгөгдөл устгагдахгүй. Харин DELETE хэсэгт заагдсан хүснэгтээс өгөгдөл

устгагдана.

DELETE [Order Details]

FROM Supplies, Products

WHERE Products.SupplierID = Supplies.SupplierID

AND Suppliers.CompanyName = „Lyngbysild‟

AND [Order details].ProductID = Products.ProductID

Page 42: SQL

TRUNCATE TABLE команд

Энэ команд нь хүснэгт дэх бүх мөрүүдийг устгадаг маш хурдан арга юм. DELETE командыг нөхцөл

зааж өгөлгүйгээр ашиглан бүх мөрүүдийг устгаснаас TRUNCATE TABLE командыг ашиглах нь илүү

хурдан байдаг.

Жишээ нь:

TRUNCATE TABLE authors

Проекц үүсгэх, ашиглах

Проекц гэдэг нь тодорхой хүсэлтээр агуулга нь тодорхойлогдох виртуаль хүснэгт юм. Хүснэгт нь

хэдийгээр логик бүтцын хувьд бодит хүснэгттэй ижил боловч хүснэгт шиг бодитойгоор өгөгдлийн

санд хадгалагддаггүй. Харин тухайн проекцд хандах үед динамикаар түүний өгөгдлүүдийг үүсгэдэг.

Нэг болон хэд хэдэн хүснэгт эсвэл өөр проекц дээр үндэслэсэн хүсэлтээр проекцыг тодорхойлж

болно. Проекц ашиглан өгөгдөлд өөрчлөлт хийхэд тодорхой хязгаарлалт бий.

Синтакс:

CREATE VIEW view_name [(column [,…n])]

[WITH ENCRYPTION]

AS

select_statement

[WITH CHECK OPTION]

Жишээ :

CREATE VIEW dbo.TitleView

AS

SELECT title, author FROM title

Дараа нь үүсгэсэн проекцоо ашиглахдаа:

SELECT * FROM TitleView

Проекц үүсгэх хүсэлтдээ функц ашиглаж болох ба ингэсэн тохиолдолд тухайн баганыг зайлшгүй

нэрлэх шаардлагатай.

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA>VIEWS

WHERE TABLE_NAME = „categories‟)

DROP VIEW categories

GO

CREATE VEAW categories (category, average_price)

AS

SELECT tipe, AVG(price)

FROM titles

GROUP BY type

GO

Нэгэнт үүсгэсэн проекцийг өөрчлөхдөө ALTER VIEW командыг ашиглана.

ALTER VIEW dbo.TitleView

AS

SELECT title, author, synopsis

FROM title

Page 43: SQL

Лекц 14 - PROCEDURE

Transact SQL хэлийг ашиглан дараах 2 үндсэн аргаар өгөгдлийн санг удирдах програмчлалыг хийдэг.

Нэг арга нь хэрэглэгчийн програмаас Transact SQL командуудыг илгээж тухайн командууд ажиллан

өгөгдлийн санг удирдах, нөгөө нь Transact SQL командуудыг процедур хэлбэрээр өгөгдлийн санд

хадгалан, харин хэрэглэгчийн програм нь тухайн процедурыг дуудаж өгөгдлийн санг удирдах аргууд

юм. SQL Server-ийн процедур нь бусад програмчлалын хэлүүдэд байдаг процедуртай ижил шинж

чанартай юм. Жишээ нь:

SQL серверийн процедур нь аргумент авдаг. Утга буцаадаг процедур юм.

Процедур дотор өгөгдлийн санг удирдах дурын Transact SQL командуудыг ашиглаж болох

ба өөр процедурыг ч дуудсан үйлдэл байж болно.

Тухайн процедур нь амжилттай эсвэл алдаатай биелэгдсэн эсэх мэдээллийг буцаах

боломжтой.

Гэхдээ SQL-ийн процедур нь функцээс ялгаатай юм. Процедур нь дуудсан газраа утга буцаадаггүй

учир илэрхийлэлд шууд ашиглах боломжгүй. Хэрэглэгчийн програмаас SQL командаар хүсэлт

тавихаас процедур бичиж ашиглах арга нь олон талын давуу талуудтай:

Модуль програмчлалын боломжийг бүрдүүлнэ: Процедурыг нэг удаа үүсгэн баазад

хадгалаад л дараа нь хичнээн ч удаа, хэзээ ч дуудаж ашиглаж болно. Процедур ашигласан

тохиолдолд тухайн ямар нэг даалгавар, шаардлага өөрчлөгдөх үед зөвхөн процедурт л засвар

хийгдэх буюу хэрэглээний програмаа дахин засварлах шаардлагагүй.

Биелэгдэх хурдны хувьд давуу боломжтой: Хэрэв олон тооны командуудаас бүрдэх нүсэр

ажил байгаа тохиолдолд түүнийг процедур ашиглан гүйцэтгэвэл илүү хурдан гүйцэтгэлтэй

байх болно. Учир нь багц ажлын команд бүр тус тусдаа боловсруулагдах ба командыг

биелүүлэх үйлдэл нь хэд хэдэн дамжлагаар гүйцэтгэгддэг. Тиймээс сервер лүү давтан

илгээсэн багц ажил бүр тусдаа боловсруулалт хийгдэнэ. Харин процедур ашигласан

тохиолдолд процедурыг үүсгэх үед зарим боломжтой үйлдлүүдийг урьдчилан хийсэн байдаг.

Сүлжээний ачааллыг багасгана: Багц үйл ажиллагаагаа процедур болгон бичих нь маш

олон командуудыг хэрэглэгчийн програмаас серверт илгээж сүлжээний ачааллыг ихэсгэхээс

сэргиилнэ.

Процедур ашиглах нь хамгаалалтын механизм болж өгнө: Хэрэглэгчдэд зөвхөн процедур

дуудаж ажиллуулах эрх тавьж өгөх ба процедур дотор хандагдаж буй обьектуудад хандах

эрхгүй болгосноор нэгэн төрлийн хамгаалалтын механизм хэрэгжүүлж болно.

Процедур үүсгэхийн тулд CREATE PROCEDURE командыг ашиглана.

CREATE PROC[EDURE]procedure_name [;number]

[{@parameter data_tupe} [VARYING] [=default] [OUTPUT]] [,…n]

[ WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION} ]

[FOR REPLICATION]

AS

sql_statement [...n]

Аргументуудын тайлбар

VARYING

Зөвхөн курсор төрлийн параметрт хэрэглэгдэх бөгөөд процедураас хүснэгт

буцааж болохыг зааж өгнө.

default

Параметрийн анхдагч утгыг зааж өгөхөд хэрэглэгдэнэ.

OUTPUT

Тухайн параметрийг буцах утга авахыг тодорхойлно. Ө.х процедураас үр дүн

буцаахад хэрэглэгдэнэ.

{ RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION }

Page 44: SQL

RECOMPILE нь SQL Server тухайн процедурын ажлын төлөвлөгөөг кэшлэхгүй

буюу урьдчилан боловсруулалт хийхгүй гэдгийг тодорхойлно. Процедур

биелэгдэх бүрдээ компиляци хийгдэх болно.

ENCRYPTION нь SQL Server нь тухайн процедурын source код хадгалагдах

syscomments хүснэгтэд кодчилол хийх эсэхийг тодорхойлно.

Жиш:

CREATE PROCEDURE au_ info

@ lastname varchar(40),

@ firstname varchar(20)

AS

SELECT au_lname, au_fname, title, pub_name

FROM authors a INNER JOIN titleauthor ta

ON a.au_id = ta.au_id INNER JOIN titles t

ON t.title_id = ta.title_id INNER JOIN publishers p

ON t.pub_id = p.pub_id

WHERE au_fname = @firstname

AND au_lname = @lastname

OUTPUT параметрийг ашиглах

Процедур дотроос тогтоосон хувьсагчийн утгыг ашиглахын тулд OUTPUT параметрийг ашиглана.

CREATE PROCEDURE titles_sum @@TITLE varchar(40) = „%‟, @@SUM money OUTPUT

AS

SELECT „Title Name‟ = title

FROM titles

WHERE title LIKE @@TITLE

SELECT @@SUM = SUM (price)

FROM titles

WHERE title LIKE @@TITLE

GO

Дээрх процедурыг дуудаж ашигласан жишээ:

DECLARE @@TOTALCOST money

EXECUTE titles_sum „The%‟, @@TOTALCOST OUTPUT

IF @@TOTALCOST < 200

BEGIN

PRINT „ „

PRINT „All of these titles can be purchased for less than $200. „

END

ELSE

SELECT.„The total cost of these titles is $ „

+RTRIM(CAST(@@ TOTALCOST AS varchar(20)))

Here is the result set:

Title Name

-------------------------------------------------------

The Busy Executive‟s Database Guide

The Gourmet Microwave

The Psychology of Computer Cooking

(3 row(s) affected)

Page 45: SQL

Түр зуурын процедур

SQL Server нь глобаль ба локаль гэсэн 2 төрлийн түр зуурын процедуртай. Локаль түр зуурын

процедур нь зөвхөн тухай холболтод л харагдана. Харин глобаль түр зуурын процедур нь бүх

холболтын үед харагдана. Түр зуурын хүснэгтийг үүсгэхийн тулд нэрийн өмнө нь # ба ## гэсэн

префикс ашиглана. Локаль түр зуурын хүснэгтийг үүсгэсэн хэрэглэгч нь л ашиглаж чадна. Харин

глобалийг нь бүх хэрэглэгч ашиглаж болно.

Триггер

Триггер гэдэг бол хүснэгт дээр оруулах, өөрчлөх, устгах үйлдэл хийгдэх үед автоматаар биелэхээр

тодорхойлж өгсөн тусгай зориулалтын процедур юм. Өгөгдөл

өөрчлөгдөх үед автоматаар дүрэм, шаардлагуудыг шалгаж байх зорилгоор триггерийг ашигладаг. Нэг

хүснэгт дээр хэд хэдэн триггер тодорхойлогдож болно.

CREATE TRIGGER командыг ашиглан триггерийг үүсгэж болно.

Триггер нь тухайн шалгалт хийгдэх гэж байгаа үйлдэл нь биелэгдсэний дараа ажилладаг.Харин

үйлдэл нь алдаатай биелэгдсэн тохиолдолд триггер ажилладаггүй. Өгөгдөл дээр ямар өөрчлөлт хийж

байгаагаас хамаарч 3 төрлийн триггерийг тодорхойлж болдог.

- INSERT TRIGGER

- UPDATE TRIGGER

- DELETE TRIGGER

Syntax

CREATE TRIGGER trigger_name ON table

[WITH ENCRYPTION]

{ { FOR {[DELETE] [,] [INSERT] [,] [UPDATE] }

[WITH APPEND]

[NOT FOR REPLICATION]

AS

sql_statement [,...n] }

I {FOR { [INSERT] [,] [UPDATE] } [WITN APPEND] [NOT FOR REPLICATION]

AS

{ IF UPDATE (column)

[{AND |.OR} UPDATE(column)]

[...n]

| IF (COLUMNS_UPDATED() {bitwise_operator} updated_bitmask)

{ comparison_operator} column_bitmask [...n]

}

sql_statement [...n] } }

Arquments

IF UPDATE (column)

INSERT, UPDATE үйлдлүүд тухайн багана дээр хийгдсэн эсэхийг шалгана.Харин DELETE

шалгалтын үед ашиглагдахгүй. Нэгээс олон баганыг зааж өгч болно. Мөн UPDATE(column)

шалгалтыг триггерийн аль хэсэгт ашиглаж болно.

IF (COLUMNS_UPDATED())

Оруулах болон өөрчлөх үйлдлүүд баганууд дээр хийгдсэн эсэхийг шалгана. Энэ функц нь

Varbinary төрлийн утга буцаах бөгөөд энэ утгын битүүд нь хүснэгтийн ямар багануудад өөрчлөлт

орсныг тодорхойлно.

Page 46: SQL

Жишээ:

CREATE TRIGGER reminder

ON employee

FOR INSERT, UPDATE

AS RAISERROR (50009, 16, 10)

GO

CREATE TRIGGER employee_insupd

ON employee

FOR INSERT, UPDATE

AS

/* Get the range of level for this job type from the jobs table. */

DECLARE @min_lvl tinyint,

@max_lvl tinyint,

@emp_lvl tinyint,

@job_id=i.job_id

FROM employee e INNER JOIN inserted i ON e.emp_id=i.emp_id

JOIN jobs j ON j.job_id = i.job_id

IF (@job_id = 1 ) and (@emp_lvl <> 10)

BEGIN

RAISERROR („Job id 1 expect the default level of 10.‟, 16, 1)

ROLLBACK TRANSACTION

END

ELSE

IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)

BEGIN

RAISERROR („The level for job_id:%d should be between %d and %d.‟,

16, 1, @job_id, @min_lvl, @max_lvl)

ROLLBACK TRANSACTION

END