sql
TRANSCRIPT
Өгөгдлийн сан удирдах
систем
Лекц - 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
сервер зохион байгуулсан байдаг.
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).
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 тохиргоог зөвшөөрнө.
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 Ажиллах явцын статистик үзүүлэлтүүдийг бэлтгэхгүй.
Лекц - 2
Өгөгдлийн сан буюу бааз үүсгэх, зохион байгуулах
SQL Server-ийн бааз нь хүснэгт, индекс, процедур, триггер зэрэг обьектуудаас тогтоно.
Өгөгдлийн санг төлөвлөх
1. Мэдээлэл цуглуулах
2. Обьектуудыг тодорхойлох
3. Обьектуудыг загварчлах
4. Обьект бүрийн хувьд агуулах мэдээллийн төрлийг тодорхойлох
5. Обьектуудын хоорондох хамаарлыг тодорхойлох
Мэдээлэл цуглуулах
Бааз үүсгэхэд шаардлагатай бүх мэдээллийг цуглуулах алхам юм. Хэрэв хуучин систем нь цаас
ашиглан бүртгэл гүйцэтгэдэг байсан бол эндээс системийн тухай мэдээлэл цуглуулна. Мөн системд
хамаарах бүх нэгжээс тэдний хэрэгцээ шаардлагыг судалж, мэдээлэл цуглуулах нь чухал.
Обьектуудыг тодорхойлох
Мэдээлэл цуглуулах явцдаа тухайн баазад хадгалагдах үндсэн обьектуудыг тодорхойлно. Обьект нь
хүн, бараа материал гэх мэт биет зүйлс, бизнесийн ажил гүйлгээ, салбар нэгжийн бүртгэл, тайлангийн
үе гэх мэт биет бус зүйлс байж болно. Ер нь системд цөөн тооны үндсэн обьект, харин түүнтэй
холбоотой бусад обьектууд байдаг.
Обьектуудыг загварчлах
Систем дэх обьектуудаа тодорхойлсны дараа тэдгээрийн шинж чанарыг тодорхойлж загварчлах
шаардлагатай байдаг. Үунийг гүйцэтгэхийн тулд урьд нь өгөгдлийн сан зохион байгуулагчид үзэг,
цаас ашиглан төлөвлөх, эсвэл тусгай програм ашиглан гүйцэтгэдэг байсан. Харин SQL Enterprise
Manager програм нь өөртөө энэ зорилгоор ашиглагдах визуаль багажтай байдаг.
Обьект бүрийн хувьд агуулах мэдээллийн төрлийг тодорхойлох
Өгөгдлийн сан дахь үндсэн обьектуудыг тодорхойлон хүснэгт үүсгээд тэдгээрийн агуулах мэдээллийг
тогтооно. Энэ нь хүснэгтийн багануудыг тодорхойлно гэсэн үг юм.
Обьектуудын хоорондох хамаарлыг тодорхойлох
Обьектуудын хоорондох хамаарлыг тогтоохын тулд хүснэгтүүдийн хоорондох логик холбоог
тодорхойлох хэрэгтэй.
Анхааруулга: master бааз дотор хэрэглэгчийн ямар ч обьект үүсгэж болохгүй. Учир нь бааз
системийн эзэмшилд ашиглагддаг.
Өгөгдлийн сан үүсгэх
Өгөгдлийн сан үүсгэхийн тулд өгөгдлийн сангын нэр, түүний эзэмшигч буюу өгөгдлийн санг үүсгэгч,
хэмжээ зэрэг өгөгдөл шаардлагатай.
1. Өгөгдлйин сангийн анхдагч өгөгдлүүдийг үүсгэх, өөрчлөх эрхийг sysadmin ба dbcreator
хэрэглэгчдэд олгох хэрэгтэй.
2. Өгөгдлийн санг үүсгэсэн хэрэглэгч тухайн баазын эзэмшигч болно.
3. Хамгийн ихдээ нэг серверт 32,767 ширхэг өгөгдлийн сан үүсгэх боломжтой.
4. Өгөгдлийн сангийн нэр нь идентификаторын шаардлагыг хангаж байх ѐстой.
Өгөгдлийн санг хадгалахын тулд дараах төрлийн файлууд ашиглагддаг.
1. Үндсэн файл – Өгөгдлийн сангийн тухай үндсэн мэдээлэл болон өгөгдөл хадгална. Өгөгдлийн
сан бүрт нэг үндсэн файл байна.
2. Нэмэлт файл - Үндсэн файлд багтаагүй бусад өгөгдлийг хадгална. Хэрэв үндсэн файл нь том
хэмжээтэй бөгөөд бүх мэдээллийг хадгалах багтаамжтай бол нэмэлт файл шаардлагагүй.
Зарим баазууд маш том хэмжээтэй зохион байгуулагддаг учир хэд хэдэн нэмэлт файл
шаарддаг. Эсвэл хэд хэдэн диск дээр өгөгдлөө хувааж байрлуулдаг.
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 нь автоматаар нэр өгдөг.
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
<Файлын тодорхойлолт>-д заасан файлын хэмжээ диск дүүртэл нэмэгдэнэ гэдгийг зааж өгнө.
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',
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
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',
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 нь олон төрлийн өгөгдлийн төрлүүдтэй байдаг. Мөн
хэрэглэгч системийн төрлүүд дээр үндэслэсэн хэрэглэгчийн төрөл тодорхойлох боломжтой.
Үндсэн өгөгдлийн төрлүүд
Өгөгдлийн
төрлүүд Системийн өгөгдлийн
төрлүүд Хэмжээ Тайлбар
Хоѐртын 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 гэсэн хэрэглэгчийн төрлийг устгаж байна.
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] )]
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–г ашигласан үед хэрэглэх боломжгүй. Тухайн хүснэгтийг
устгасан үед 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 - Тухайн баганад орох утгыг шалгах тодорхойлолт.
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. */
)
/* ***************** 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
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.
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 функцыг ашиглаж болно. Харин энэ функцыг ашиглахдаа функцын хос хаалт хэрэглэдэггүй.
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 тодорхойлолтыг үүсгэх
Хоорондоо хамааралтай олон хүснэгтийг ашиглахын тулд түлхүүрийн тусламжтайгаар тэдгээрийг
холбодог. Түлхүүр гэдэг нь хүснэгтийн бусад талбарыг төлөөлж чадах талбаруудын олонлог юм.
Хоорондоо холбоотой олон хүснэгтийг үүсгэх үед хэрэглэгч үндсэн хүснэгт дээр анхдагч түлхүүрийг
тодорхойлон, түүнээс хамаарсан бусад хүснэгтүүд дээр гадаад түлхүүрийг тодорхойлох шаардлагатай
болдог. 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
Харин үйлчилгээг сэргээхдээ :
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 дараах дүрмийг баримталдаг:
Давхар хашилт нь идентификаторыг хашихад ашиглагдах боломжгүй. Оронд нь хос
дөрвөлжин хаалтыг ашиглана.
Харин тэмдэгт мөрийг хашихад дан болон давхар хашилт хоѐуланг нь ашиглаж болно.
Давхар хашилтыг ашигласан үед тэмдэгт мөр доторх дан хашилт ямар нэг үүрэг
гүйцэтгэгдэхгүй.
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
)
Хувьсагч ашиглах
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
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 хэлэнд дараах харьцуулах үйлдлүүдтэй.
>(их)
<(бага)
=(тэнцүү)
<=(бага буюу тэнцүү)
>=(их буюу тэнцүү)
!= (тэнцүү биш)
<>(тэнцүү биш)
!< (бага биш)
!> (их биш)
Харьцуулах үйлдлийн үр дүн нь дараах 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 „Улаанбаатар хотоос зохиогч байхгүй‟
Тэмдэгт мөр залгах үйлдэл
Тэмдэгт мөрүүдийг залгахдаа + үйлдлийг ашигладаг.Харин тэмдэгт мөртэй холбоотой бусад бүх
үйлдлүүд нь 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 үр дүнгийн илэрхийлэл
[…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
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 түлхүүр үгийг
хэрэглэдэг.
Мөн тухайн илэрхийллийн үр дүнд бодогдон гарах тэр баганын утгууд байна.
Хүсэлтийн жагсаалтан дахь элементүүд нь дараах зүйлс байж болно:
Энгийн илэрхийлэл: функц, хувьсагч, тогтмол, баганын нэр
Тухайн үр дүнгийн хүснэгтийн мөр бүрд нэг л утга олгож чадах дэд хүсэлт байж болно.
Хэд хэдэн энгийн илэрхийллээс бүрдэх хүнд илэрхийлэл
Бүх баганыг ашиглахыг тодорхойлсон * тэмдэглэгээ
Хувьсагчид утга ологсон илэрхийлэл байж болно.
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
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
командыг өгч энэ командын үйлчилгээг зогсоодог.
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 үйлдлүүд ашиглагдана.
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
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 хэсэгт *= ба =* үйлдлүүдийг ашиглан гадаад
холболтыг хийх боломжтой байдаг.
Зүүн гадаад холболтыг ашиглах
Дараах жишээнд хэвлэлийн газар нь байрладаг хотдоо амьдардаг зохиолчдыг үзүүлжээ. Жишээнд бүх
зохиолчдыг үзүүлэхийн тулд зүүн гадаад холболтыг ашиглажээ.
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-д хийгдсэн
эсэхээсээ шалтгаалан ялгаатай ажиллаж болно. Дараах жишээнд 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 үйлдэл нь үр дүнгийн хүснэгтээс
давтагдсан мөрүүдийг хасдаг. Харин 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‟ ) )
Дэд хүсэлт ашигласан хүсэлт нь ихэвчлэн дараах форматаар ашиглагддаг.
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
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 командыг ашиглан өөрчилж болно.
Тухайн талбарын утгын зарим нэг хэсгийг өөрчлөх гэвэл 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
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
Лекц 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 }
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)
Түр зуурын процедур
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 төрлийн утга буцаах бөгөөд энэ утгын битүүд нь хүснэгтийн ямар багануудад өөрчлөлт
орсныг тодорхойлно.
Жишээ:
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