bahasa pemrograman SQL. SQL "for dummies": apa yang perlu diketahui pemula? Mempelajari kueri sederhana di sql

Landasan teoretis DBMS SQL Server 2012 dipertimbangkan dengan cara yang sederhana dan mudah diakses. Instalasi, konfigurasi, dan dukungan MS SQL Server 2012 ditampilkan. Bahasa manipulasi data Transact-SQL dijelaskan. Mempertimbangkan untuk membuat database, memodifikasi tabel dan isinya, kueri, indeks, tampilan, pemicu, prosedur tersimpan, dan fungsi yang ditentukan pengguna.
Implementasi keamanan menggunakan otentikasi, enkripsi dan otorisasi ditampilkan. Perhatian diberikan pada otomatisasi tugas administrasi DBMS. Pembuatan salinan cadangan data dan implementasi pemulihan sistem dipertimbangkan. Menjelaskan Layanan Analisis Microsoft, Layanan Pelaporan Microsoft, dan alat intelijen bisnis lainnya. Teknologi bekerja dengan dokumen XML, manajemen data spasial, pencarian teks lengkap dan banyak lagi dipertimbangkan. Untuk programmer pemula.

Di dunia modern, informasi memiliki nilai tertinggi, tetapi sama pentingnya untuk dapat mengelola informasi ini. Buku ini adalah tentang bahasa query SQL dan manajemen database. Materi disajikan dimulai dengan deskripsi query dasar dan diakhiri dengan manipulasi kompleks menggunakan join, subquery dan transaksi. Jika Anda mencoba memahami organisasi dan manajemen basis data, buku ini akan menjadi panduan praktis yang sangat baik dan akan memberi Anda segalanya alat yang diperlukan. Keistimewaan edisi ini adalah cara penyajian materi yang unik, yang membedakan seri Head First O\'Reilly dari sejumlah buku pemrograman yang membosankan.

Buku ini akan mengajari Anda cara bekerja dengan perintah dan pernyataan SQL, membuat dan mengonfigurasi database relasional, memuat dan memodifikasi objek database, menjalankan kueri canggih, meningkatkan kinerja, dan membangun keamanan. Anda akan belajar cara menggunakan pernyataan DDL dan menerapkan API, mengintegrasikan skrip XML dan Java, menggunakan objek SQL, membuat server web, bekerja dengan akses jarak jauh, dan melakukan transaksi terdistribusi.
Dalam buku ini, Anda akan menemukan informasi seperti deskripsi bekerja dengan database dalam memori, database streaming dan tertanam, database untuk perangkat seluler dan genggam, dan banyak lagi.

SQL for Mortals adalah pengantar lengkap untuk Bahasa Kueri Terstruktur yang ditulis khusus untuk pemula.

Jika Anda baru mengenal manajemen basis data, buku ini akan mengajari Anda cara bekerja dengan SQL dengan mudah dan lancar, menggunakan kueri sederhana dan operasi kompleks. Untuk menguasai SQL:

- Memahami arti konsep manajemen basis data dengan pengenalan basis data relasional yang ringkas dan sederhana.
— Ikuti petunjuk ini untuk menggunakan perintah SQL dasar untuk menemukan dan bekerja dengan informasi yang ditempatkan di tabel data. Pelajari cara memilih dan meringkas data, serta mengelolanya dengan terampil.
- Bekerja secara efisien dengan tabel data komposit dengan menerapkan teknik kueri tingkat lanjut ke lebih dari satu tabel secara bersamaan, membuat kueri dan subkueri yang kompleks.
- Membuat tabel data baru untuk aplikasi bisnis retail. Pelajari prinsip-prinsip penting dari desain dan teknik database yang efektif untuk memastikan integritas dan perlindungan data.
- Belajar menggunakan SQL dengan bahasa pemrograman menggunakan bab khusus untuk programmer.

SQL lebih tua dari kebanyakan dari kita, jadi saya tidak bisa mengklaim menyampaikan beberapa hal yang luar biasa melalui buku ini. Yang membuat judul ini unik adalah ukurannya yang ramping. Jika Anda mencari panduan praktis yang ringkas tentang SQL, maka buku ini cocok untuk Anda. Untuk pemula, saya telah mencoba membatasi lautan ke ember untuk membekali mereka dengan pengetahuan SQL dalam waktu sesingkat mungkin. Bahasa SQL terlalu banyak dan pemaparan setiap aspek dari bahasa besar ini adalah tugas yang sangat membosankan. Mengesampingkan fitur yang paling jarang digunakan, buku ini diluncurkan untuk fokus pada area bahasa yang lebih operasional. Ini dimaksudkan untuk membantu Anda mempelajari SQL dengan cepat sendiri. Ini mengikuti pendekatan tutorial sementara ratusan latihan langsung disediakan, ditambah dengan ilustrasi, untuk mengajari Anda SQL dalam waktu singkat. Tanpa berlebihan, buku ini akan mengekspos SQL dalam waktu singkat. Buku ini secara eksplisit mencakup platform gratis DBMS nomor 1 di dunia untuk mengekspos SQL: Oracle Database Express Edition. Saya telah memilih Oracle XE karena gratis untuk dikembangkan, disebarkan, dan didistribusikan; cepat untuk mengunduh; dan sederhana untuk dikelola.

Memulai Oracle PL/SQL membuat Anda mulai menggunakan bahasa bawaan yang harus diketahui oleh setiap pengembang Oracle dan administrator database. Oracle Database penuh dengan fitur aplikasi bawaan yang gratis untuk digunakan, dan PL/SQL adalah tiket Anda untuk mempelajari dan menggunakan fitur tersebut dari kode Anda sendiri. dengan itu, kamu bisa memusatkan logika bisnis dalam database, Anda dapat membongkar logika aplikasi, dan Anda dapat mengotomatisasi tugas-tugas database dan administrasi aplikasi.

Penulis Don Bales menyediakan di Permulaan Oracle PL/SQL sebuah tutorial cepat dan penuh contoh. Belajar dari pengalaman ekstensif Don untuk menemukan aspek PL/SQL yang paling umum digunakan, tanpa membuang waktu untuk fitur yang tidak jelas dan usang.

Buku "SQL. User's Bible unik karena setiap bab membandingkan implementasi standar bahasa query SQL di tiga DBMS terkemuka. Hasilnya adalah referensi yang komprehensif dan praktis untuk pengguna database, dari pemula hingga profesional. Buku tentang SQL ini dengan mudah menggabungkan teori dengan praktik, berisi deskripsi teknologi baru dan akan memungkinkan Anda untuk memahami berbagai nuansa standar bahasa query SQL dan implementasinya. Ini dapat digunakan sebagai referensi - semacam manual desktop.
— Pelajari dasar-dasar bahasa kueri SQL dan database relasional
- Belajar bekerja dengan tabel, tampilan, urutan, dan objek database lainnya
- Pelajari cara menerapkan transaksi dan kunci di lingkungan multi-pengguna
- Kenali fitur-fitur yang ditawarkan oleh standar SQL dan tiga vendor database terkemuka
- Pelajari cara mengakses metadata dan menerapkan keamanan basis data
- Jelajahi topik tambahan: integrasi SQL ke XML, kecerdasan bisnis OLAP, dan lainnya

Jika Anda memiliki keterampilan HTML dasar, maka dengan bantuan buku yang ditulis oleh Robin Nixon, seorang pengembang berpengalaman dan penulis berbagai buku mastering web terlaris, Anda akan dengan mudah mempelajari cara membuat situs dinamis yang dicirikan oleh interaksi pengguna tingkat tinggi.
Temukan kombinasi PHP dan MySQL, pelajari bagaimana keduanya membuat pembuatan situs web modern menjadi lebih mudah, dan pelajari cara menambahkan kemampuan javascript ke teknologi ini, yang memungkinkan Anda membuat aplikasi berteknologi tinggi.
Tutorial ini membahas masing-masing teknologi secara terpisah, menunjukkan cara menggabungkan PHP, MySQL dan javascript menjadi satu kesatuan, dan memberikan pengenalan konsep pemrograman web terbaru. Dengan studi kasus dan kuis terperinci di setiap bab, Anda akan dapat mempraktikkan apa yang telah Anda pelajari.

Panduan ini akan membantu Anda:
— menguasai dasar-dasar PHP dan pemrograman berorientasi objek;
- mempelajari MySQL secara menyeluruh, dimulai dengan struktur basis data dan diakhiri dengan kompilasi kueri kompleks;
- membuat halaman web yang menggunakan PHP dan MySQL untuk menggabungkan formulir dan komponen HTML lainnya;
- belajar javascript, dimulai dengan fungsi dan penanganan event dan diakhiri dengan akses ke Document Object Model (DOM);
— menggunakan perpustakaan dan paket perangkat lunak, termasuk sistem Smarty, repositori perangkat lunak PEAR, dan Yahoo! antarmuka pengguna;
- lakukan panggilan Ajax dan ubah situs web Anda menjadi lingkungan informasi yang sangat dinamis;
- unggah file dan gambar ke situs web dan bekerja dengannya, periksa data yang dimasukkan oleh pengguna;
- Pastikan keamanan aplikasi Anda.

Kueri tidak berjalan cukup cepat? Ingin tahu tentang fitur database dalam memori di tahun 2014? Bosan dengan panggilan telepon dari pengguna yang frustrasi? Buku Grant Fritchey SQL Server Query Performance Tuning adalah jawaban untuk masalah kinerja kueri SQL Server Anda. Buku ini direvisi untuk mencakup fitur dan teknik pengoptimalan kinerja terbaru, terutama termasuk fitur database dalam memori yang baru ditambahkan yang sebelumnya dikenal dengan nama kode Project Hekaton. Buku ini menyediakan alat yang Anda butuhkan untuk mendekati pertanyaan Anda dengan mempertimbangkan kinerja.

Penyetelan Kinerja Kueri SQL Server memandu Anda memahami penyebab kinerja yang buruk, cara mengidentifikasinya, dan cara memperbaikinya. Anda akan belajar menjadi proaktif dalam menetapkan baseline kinerja menggunakan alat seperti Performance Monitor dan Extended Events. Anda akan belajar mengenali kemacetan dan meredakannya sebelum telepon berdering. Anda juga akan mempelajari beberapa solusi cepat, tetapi penekanannya adalah merancang kinerja dan melakukannya dengan benar, dan mengatasi masalah sebelum terjadi. Menyenangkan pengguna Anda. Diamkan telepon yang berdering itu. Praktikkan prinsip dan pelajaran dari Penyetelan Kinerja Kueri SQL Server hari ini.

Mencakup fitur dalam memori dari Project Hekaton
Membantu menetapkan baseline kinerja dan memantaunya
Panduan dalam pemecahan masalah dan menghilangkan kemacetan yang membuat pengguna frustrasi
Apa yang akan Anda pelajari?
— Tetapkan baseline kinerja dan pantau terhadapnya
— Mengenali dan menghilangkan kemacetan yang menyebabkan kinerja lambat
- Menyebarkan perbaikan cepat bila diperlukan, menindaklanjuti dengan solusi jangka panjang
— Menerapkan praktik terbaik dalam T-SQL untuk meminimalkan risiko kinerja
— Desain dalam performa yang Anda butuhkan melalui kueri dan desain indeks yang cermat
— Manfaatkan fitur pengoptimalan kinerja terbaru di SQL Server 2014
— Pahami fitur database dalam memori baru yang sebelumnya diberi nama kode sebagai Project Hekaton

Buku SQL dalam 10 menit menawarkan solusi sederhana dan praktis bagi mereka yang ingin mendapatkan hasil dengan cepat. Setelah mengerjakan semua 22 pelajaran, yang masing-masing akan memakan waktu tidak lebih dari 10 menit, Anda akan mempelajari semua yang diperlukan untuk aplikasi praktis SQL. Contoh dalam buku ini cocok untuk IBM DB2, Microsoft Access, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, SQLite, MariaDB, dan Apache OpenOffice Base. Contoh ilustratif akan membantu Anda memahami bagaimana pernyataan SQL disusun. Kiat akan mendorong jalan pintas ke solusi. Peringatan membantu Anda menghindari kesalahan umum. Catatan memberikan klarifikasi lebih lanjut.

Tutorial ini seperti "cap memori saya" dalam bahasa SQL (DDL, DML), mis. Ini adalah informasi yang telah terakumulasi di sepanjang jalan. aktivitas profesional dan terus tersimpan di kepalaku. Ini adalah minimum yang cukup bagi saya, yang paling sering digunakan ketika bekerja dengan database. Jika muncul kebutuhan untuk menggunakan konstruksi SQL yang lebih lengkap, maka saya biasanya meminta bantuan perpustakaan MSDN yang terletak di Internet. Menurut pendapat saya, menyimpan semuanya di kepala Anda sangat sulit, dan tidak ada kebutuhan khusus untuk ini. Tetapi mengetahui konstruksi dasar sangat berguna, karena. mereka dapat diterapkan hampir dalam bentuk yang sama di banyak database relasional seperti Oracle, MySQL, Firebird. Perbedaannya terutama pada tipe data, yang mungkin berbeda dalam detailnya. Tidak banyak konstruksi bahasa SQL dasar, dan dengan latihan terus-menerus mereka akan dengan cepat diingat. Misalnya, untuk membuat objek (tabel, batasan, indeks, dll.) cukup memiliki editor teks lingkungan (IDE) untuk bekerja dengan database, dan tidak perlu mempelajari toolkit visual yang dipertajam untuk bekerja dengan tipe database tertentu (MS SQL, Oracle, MySQL, Firebird, ...). Ini juga nyaman karena seluruh teks ada di depan mata Anda, dan Anda tidak perlu menjalankan banyak tab untuk membuat, misalnya, indeks atau batas. Ketika terus-menerus bekerja dengan database, membuat, memodifikasi, dan terutama membuat ulang objek menggunakan skrip berkali-kali lebih cepat daripada jika dilakukan dalam mode visual. Juga dalam mode skrip (masing-masing, dengan hati-hati), lebih mudah untuk mengatur dan mengontrol aturan untuk penamaan objek (pendapat subjektif saya). Selain itu, skrip nyaman digunakan ketika perubahan yang dibuat dalam satu basis data (misalnya, basis data uji) perlu ditransfer dalam bentuk yang sama ke basis data lain (produktif).

Bahasa SQL dibagi menjadi beberapa bagian, di sini saya akan mempertimbangkan 2 bagian terpentingnya:
  • DML - Bahasa Manipulasi Data (bahasa manipulasi data), yang berisi konstruksi berikut:
    • PILIH - pemilihan data
    • INSERT - memasukkan data baru
    • PEMBARUAN - pembaruan data
    • HAPUS - menghapus data
    • MERGE - penggabungan data
Karena Saya seorang praktisi, karena itu akan ada sedikit teori dalam buku teks ini, dan semua konstruksi akan dijelaskan dengan contoh-contoh praktis. Selain itu, saya percaya bahwa bahasa pemrograman, dan terutama SQL, hanya dapat dikuasai dalam praktik, dengan menyentuhnya sendiri dan memahami apa yang terjadi ketika Anda menjalankan konstruksi ini atau itu.

Tutorial ini dibuat berdasarkan prinsip Langkah demi Langkah, yaitu. perlu membacanya secara berurutan dan sebaiknya segera mengikuti contoh. Tetapi jika sepanjang jalan Anda perlu mempelajari perintah secara lebih rinci, maka gunakan pencarian khusus di Internet, misalnya, di perpustakaan MSDN.

Saat menulis tutorial ini, saya menggunakan database MS SQL Server versi 2014, dan saya menggunakan MS SQL Server Management Studio (SSMS) untuk menjalankan skrip.

Secara singkat tentang MS SQL Server Management Studio (SSMS)

SQL Server Management Studio (SSMS) adalah utilitas untuk Microsoft SQL Server untuk mengonfigurasi, mengelola, dan mengelola komponen basis data. Utilitas ini berisi editor skrip (yang terutama akan kita gunakan) dan program grafis yang bekerja dengan objek dan pengaturan server. Alat utama SQL Server Management Studio adalah Object Explorer, yang memungkinkan pengguna untuk melihat, mengambil, dan mengelola objek server. Teks ini sebagian dipinjam dari Wikipedia.

Untuk membuat editor skrip baru, gunakan tombol Kueri Baru:

Untuk mengubah database saat ini, Anda dapat menggunakan daftar drop-down:

Untuk menjalankan perintah tertentu (atau sekelompok perintah), pilih dan tekan tombol "Jalankan" atau tekan tombol "F5". Jika hanya ada satu perintah di editor saat ini, atau jika Anda perlu menjalankan semua perintah, maka Anda tidak perlu memilih apa pun.

Setelah menjalankan skrip, terutama yang membuat objek (tabel, kolom, indeks), untuk melihat perubahan, gunakan Refresh dari menu konteks, sorot grup yang sesuai (misalnya, Tabel), tabel itu sendiri, atau grup Kolom di dalamnya .

Sebenarnya, hanya ini yang perlu kita ketahui untuk melengkapi contoh yang diberikan di sini. Utilitas SSMS lainnya mudah dipelajari sendiri.

Sedikit teori

Database relasional (RDB, atau lebih jauh dalam konteks hanya database) adalah kumpulan tabel yang saling berhubungan. Secara kasar, database adalah file di mana data disimpan dalam bentuk terstruktur.

DBMS - Sistem untuk Mengelola Database ini, mis. ini adalah seperangkat alat untuk bekerja dengan tipe database tertentu (MS SQL, Oracle, MySQL, Firebird, ...).

Catatan
Karena dalam kehidupan, dalam percakapan sehari-hari, kita kebanyakan mengatakan: "Oracle DB", atau bahkan hanya "Oracle", sebenarnya berarti "Oracle DBMS", maka dalam konteks tutorial ini istilah DB kadang-kadang akan digunakan. Dari konteksnya, saya pikir akan jelas apa sebenarnya yang dipertaruhkan.

Tabel adalah kumpulan kolom. Kolom juga bisa disebut bidang atau kolom, semua kata ini akan digunakan sebagai sinonim, mengungkapkan hal yang sama.

Tabel adalah objek utama RDB, semua data RDB disimpan baris demi baris di kolom tabel. Garis, catatan juga sinonim.

Untuk setiap tabel, serta kolomnya, nama diberikan, yang kemudian dirujuk.
Nama objek (nama tabel, nama kolom, nama indeks, dll.) di MS SQL dapat memiliki panjang maksimum 128 karakter.

Sebagai referensi– dalam database ORACLE, nama objek dapat memiliki panjang maksimum 30 karakter. Oleh karena itu, untuk database tertentu, Anda perlu mengembangkan aturan Anda sendiri untuk penamaan objek agar memenuhi batas jumlah karakter.

SQL adalah bahasa yang memungkinkan Anda untuk melakukan query database melalui DBMS. Dalam DBMS tertentu, bahasa SQL mungkin memiliki implementasi tertentu (dialeknya sendiri).

DDL dan DML adalah bagian dari bahasa SQL:

  • Bahasa DDL digunakan untuk membuat dan memodifikasi struktur database, mis. untuk membuat/memodifikasi/menghapus tabel dan relasi.
  • Bahasa DML memungkinkan Anda untuk memanipulasi data tabel, mis. dengan garis-garisnya. Ini memungkinkan Anda untuk memilih data dari tabel, menambahkan data baru ke tabel, dan memperbarui dan menghapus data yang ada.

Dalam bahasa SQL, Anda dapat menggunakan 2 jenis komentar (baris tunggal dan multibaris):

Komentar satu baris
dan

/* komentar banyak baris */

Sebenarnya, semuanya untuk teori ini akan cukup.

DDL - Bahasa Definisi Data (bahasa deskripsi data)

Misalnya, pertimbangkan tabel dengan data tentang karyawan, dalam bentuk yang akrab bagi orang yang bukan programmer:

Dalam hal ini, kolom tabel memiliki nama berikut: Nomor personel, Nama lengkap, Tanggal lahir, Email, Jabatan, Departemen.

Masing-masing kolom ini dapat dicirikan oleh tipe data yang dikandungnya:

  • Nomor personel - bilangan bulat
  • nama lengkap - string
  • Tanggal lahir - tanggal
  • Email - string
  • Posisi - string
  • departemen - string
Jenis kolom adalah karakteristik yang menunjukkan jenis data yang dapat disimpan oleh kolom ini.

Untuk memulainya, cukup mengingat hanya tipe data dasar berikut yang digunakan dalam MS SQL:

Berarti Notasi dalam MS SQL Keterangan
String panjang variabel varchar(N)
dan
nvarchar(N)
Dengan angka N, kita dapat menentukan panjang string maksimum yang mungkin untuk kolom yang sesuai. Misalnya, jika kita ingin mengatakan bahwa nilai kolom "Nama" dapat berisi maksimal 30 karakter, maka kita perlu mengatur jenisnya ke nvarchar (30).
Perbedaan antara varchar dan nvarchar adalah bahwa varchar memungkinkan Anda untuk menyimpan string dalam format ASCII, di mana satu karakter menempati 1 byte, sedangkan nvarchar menyimpan string dalam format Unicode, di mana setiap karakter menempati 2 byte.
Jenis varchar hanya boleh digunakan jika Anda 100% yakin bahwa bidang tersebut tidak perlu menyimpan karakter Unicode. Misalnya, varchar dapat digunakan untuk menyimpan alamat email karena mereka biasanya hanya berisi karakter ASCII.
String panjang tetap karakter(N)
dan
nchar(N)
Tipe ini berbeda dari string panjang variabel jika panjang string kurang dari N karakter, maka selalu diisi di sebelah kanan hingga panjang N spasi dan disimpan dalam database dalam bentuk ini, yaitu. dalam database itu menempati persis N karakter (di mana satu karakter menempati 1 byte untuk char dan 2 byte untuk nchar). Dalam praktik saya, tipe ini sangat jarang digunakan, dan jika digunakan, maka digunakan terutama dalam format char (1), yaitu. ketika bidang didefinisikan oleh satu karakter.
Bilangan bulat ke dalam Tipe ini memungkinkan kita untuk menggunakan hanya bilangan bulat, baik positif maupun negatif, dalam kolom. Untuk referensi (ini tidak begitu relevan untuk kita sekarang) - rentang angka yang diizinkan oleh tipe int dari -2 147 483 648 hingga 2 147 483 647. Ini biasanya tipe utama yang digunakan untuk menyetel pengenal.
Bilangan asli atau nyata mengambang Dalam istilah sederhana, ini adalah angka di mana titik desimal (koma) mungkin ada.
tanggal tanggal Jika perlu untuk menyimpan hanya Tanggal di kolom, yang terdiri dari tiga komponen: Nomor, Bulan dan Tahun. Misalnya, 15/02/2014 (15 Februari 2014). Jenis ini dapat digunakan untuk kolom "Tanggal masuk", "Tanggal lahir", dll., mis. dalam kasus di mana penting bagi kami untuk hanya menetapkan tanggal, atau ketika komponen waktu tidak penting bagi kami dan dapat dibuang, atau jika tidak diketahui.
Waktu waktu Tipe ini dapat digunakan jika kolom hanya perlu menyimpan data waktu, mis. Jam, Menit, Detik dan Milidetik. Misalnya, 17:38:31.3231603
Misalnya, "Waktu Keberangkatan Penerbangan" harian.
tanggal dan waktu tanggal Waktu Jenis ini memungkinkan Anda untuk menyimpan Tanggal dan Waktu secara bersamaan. Misalnya, 15/02/2014 5:38:31.323 PM
Misalnya, ini bisa berupa tanggal dan waktu suatu acara.
Bendera sedikit Tipe ini berguna untuk menyimpan nilai Yes/No, dimana Yes akan disimpan sebagai 1 dan No akan disimpan sebagai 0.

Juga, nilai bidang, jika tidak dilarang, tidak dapat ditentukan, untuk tujuan ini kata kunci NULL digunakan.

Untuk menjalankan contoh, mari buat database pengujian bernama Test.

Database sederhana (tanpa menentukan parameter tambahan) dapat dibuat dengan menjalankan perintah berikut:

BUAT Tes Basis Data
Anda dapat menghapus database dengan perintah (Anda harus sangat berhati-hati dengan perintah ini):

DROP DATABASE Test
Untuk beralih ke database kami, Anda dapat menjalankan perintah:

Tes AS
Atau, pilih database Test dari daftar drop-down di area menu SSMS. Di tempat kerja, saya sering menggunakan metode peralihan antar database ini.

Sekarang di database kami, kami dapat membuat tabel menggunakan deskripsi apa adanya, menggunakan spasi dan karakter Cyrillic:

BUAT TABEL [Karyawan]([Nomor Personil] int, [Nama] nvarchar(30), [Tanggal Lahir] tanggal, nvarchar(30), [Posisi] nvarchar(30), [Departemen] nvarchar(30))
Dalam hal ini, kita harus menyertakan nama dalam tanda kurung siku […].

Tetapi dalam database, untuk kenyamanan yang lebih besar, lebih baik untuk menentukan semua nama objek dalam bahasa Latin dan tidak menggunakan spasi dalam namanya. Dalam MS SQL, biasanya dalam hal ini, setiap kata dimulai dengan huruf besar, misalnya untuk bidang "Nomor personel", kita dapat mengatur nama PersonnelNumber. Anda juga dapat menggunakan nomor dalam nama, misalnya, PhoneNumber1.

Pada catatan
Di beberapa DBMS, format nama "PHONE_NUMBER" berikut mungkin lebih disukai, misalnya, format ini sering digunakan dalam database ORACLE. Secara alami, ketika mengatur nama field, diinginkan agar tidak cocok dengan kata kunci yang digunakan dalam DBMS.

Untuk alasan ini, Anda dapat melupakan sintaks kurung siku dan menghapus tabel [Karyawan]:

DROP TABLE [Karyawan]
Misalnya, tabel dengan karyawan dapat diberi nama "Karyawan" dan bidangnya dapat diberi nama berikut:

  • ID - Nomor Personil (ID Karyawan)
  • Nama - nama lengkap
  • Ulang Tahun - Tanggal lahir
  • Surel
  • Posisi
  • Departemen - Departemen
Sangat sering, kata ID digunakan untuk menamai bidang pengenal.

Sekarang mari kita buat tabel kita:

CREATE TABLE Karyawan(ID int, Nama nvarchar(30), Tanggal lahir, Email nvarchar(30), Posisi nvarchar(30), Departemen nvarchar(30))
Anda dapat menggunakan opsi NOT NULL untuk menentukan kolom yang diperlukan.

Untuk tabel yang sudah ada, bidang dapat didefinisikan ulang menggunakan perintah berikut:

Perbarui bidang ID ALTER TABLE Employee ALTER COLUMN ID int NOT NULL -- perbarui Name field ALTER TABLE Employee ALTER COLUMN Nama nvarchar(30) NOT NULL

Pada catatan
Konsep umum bahasa SQL untuk sebagian besar DBMS tetap sama (setidaknya, saya dapat menilai ini dari DBMS yang saya gunakan untuk bekerja). Perbedaan antara DDL di DBMS yang berbeda terutama dalam tipe data (tidak hanya nama mereka, tetapi juga detail implementasinya mungkin berbeda di sini), spesifikasi implementasi bahasa SQL mungkin juga sedikit berbeda (yaitu esensi dari perintahnya sama, tetapi mungkin ada sedikit perbedaan dalam dialek, sayangnya, tetapi tidak ada satu standar). Mengetahui dasar-dasar SQL, Anda dapat dengan mudah beralih dari satu DBMS ke DBMS lainnya. dalam hal ini, Anda hanya perlu memahami detail implementasi perintah di DBMS baru, mis. dalam kebanyakan kasus, itu akan cukup hanya untuk menggambar analogi.

Membuat tabel CREATE TABLE Employee(ID int, -- di ORACLE ketik int sama dengan (wrapper) untuk nomor(38) Nama nvarchar2(30), -- nvarchar2 di ORACLE sama dengan nvarchar di MS SQL Tanggal ulang tahun, Email nvarchar2 (30), Posisi nvarchar2(30), Departemen nvarchar2(30)); -- memperbarui bidang ID dan Nama (di sini MODIFY(…) digunakan sebagai ganti ALTER COLUMN ALTER TABLE Employee MODIFY(ID int NOT NULL,Name nvarchar2(30) NOT NULL); -- menambahkan PK (dalam hal ini, konstruksinya terlihat seperti di MS SQL, akan ditampilkan di bawah) ALTER TABLE Employee ADD CONSTRAINT PK_Employees PRIMARY KEY(ID);
Untuk ORACLE, ada perbedaan dalam hal implementasi tipe varchar2, pengkodeannya tergantung pada pengaturan basis data dan teks dapat disimpan, misalnya, dalam pengkodean UTF-8. Selain itu, panjang bidang di ORACLE dapat diatur dalam byte dan karakter, untuk ini, opsi tambahan BYTE dan CHAR digunakan, yang ditentukan setelah panjang bidang, misalnya:

NAMA varchar2(30 BYTE) -- kapasitas bidang akan menjadi 30 byte NAMA varchar2(30 CHAR) -- kapasitas bidang akan menjadi 30 karakter
Opsi mana yang akan digunakan secara default BYTE atau CHAR, dalam kasus spesifikasi sederhana dari tipe varchar2(30) di ORACLE, tergantung pada pengaturan basis data, terkadang juga dapat diatur dalam pengaturan IDE. Secara umum, terkadang Anda dapat dengan mudah bingung, jadi dalam kasus ORACLE, jika tipe varchar2 digunakan (dan ini terkadang dibenarkan di sini, misalnya, saat menggunakan pengkodean UTF-8), saya lebih suka menulis CHAR secara eksplisit (karena biasanya lebih mudah untuk membaca panjang string dalam karakter).

Tetapi dalam hal ini, jika sudah ada beberapa data dalam tabel, maka untuk keberhasilan eksekusi perintah, kolom ID dan Nama di semua baris tabel harus diisi. Mari kita tunjukkan ini dengan contoh, masukkan data ke dalam tabel di bidang ID, Posisi dan Departemen, ini dapat dilakukan dengan skrip berikut:

INSERT Karyawan(ID,Posisi,Departemen) NILAI (1000,N"Direktur",N"Administrasi"), (1001,N"Programmer",N"IT"), (1002,N"Akuntan",N"Akuntansi" ), (1003,N"Programmer senior",N"IT")
Dalam hal ini, perintah INSERT juga akan menimbulkan kesalahan, karena saat memasukkan, kami tidak menentukan nilai bidang Nama yang diperlukan.
Jika kita sudah memiliki data ini di tabel asli, maka perintah "ALTER TABLE Employee ALTER COLUMN ID int NOT NULL" akan berhasil dijalankan, dan perintah "ALTER TABLE Employee ALTER COLUMN Name int NOT NULL" akan mengeluarkan kesalahan pesan, bahwa ada nilai NULL (tidak ditentukan) di bidang Nama.

Mari kita tambahkan nilai untuk bidang Nama dan isi kembali datanya:


Juga, opsi NOT NULL dapat digunakan secara langsung saat membuat tabel baru, mis. dalam konteks perintah CREATE TABLE.

Pertama, hapus tabel dengan perintah:

DROP TABLE Karyawan
Sekarang mari kita buat tabel dengan kolom ID dan Nama wajib:

CREATE TABLE Karyawan(ID int NOT NULL, Nama nvarchar(30) NOT NULL, Tanggal lahir, Email nvarchar(30), Posisi nvarchar(30), Departemen nvarchar(30))
Anda juga dapat menulis NULL setelah nama kolom, yang berarti bahwa nilai NULL (tidak ditentukan) akan diizinkan di dalamnya, tetapi ini tidak perlu, karena karakteristik ini tersirat secara default.

Sebaliknya, jika Anda ingin menjadikan kolom yang ada sebagai opsional, gunakan sintaks perintah berikut:

ALTER TABLE Karyawan ALTER COLUMN Nama nvarchar(30) NULL
Atau sederhananya:

ALTER TABLE Karyawan ALTER COLUMN Nama nvarchar(30)
Dengan perintah ini, kita juga dapat mengubah jenis bidang ke jenis lain yang kompatibel, atau mengubah panjangnya. Misalnya, mari kita perluas bidang Nama menjadi 50 karakter:

ALTER TABLE Karyawan ALTER COLUMN Nama nvarchar(50)

kunci utama

Saat membuat tabel, diinginkan bahwa ia memiliki kolom unik atau kumpulan kolom yang unik untuk setiap barisnya - catatan dapat diidentifikasi secara unik dengan nilai unik ini. Nilai ini disebut kunci utama tabel. Untuk tabel Karyawan kami, nilai unik ini dapat berupa kolom ID (yang berisi "Nomor Personil Karyawan" - meskipun dalam kasus kami nilai ini unik untuk setiap karyawan dan tidak dapat diulang).

Anda dapat membuat kunci utama ke tabel yang ada menggunakan perintah:

ALTER TABLE Karyawan ADD CONSTRAINT PK_Employee PRIMARY KEY(ID)
Di mana "PK_Employees" adalah nama kendala yang bertanggung jawab atas kunci utama. Biasanya, kunci utama diberi nama dengan awalan "PK_" diikuti dengan nama tabel.

Jika kunci utama terdiri dari beberapa bidang, maka bidang ini harus dicantumkan dalam tanda kurung yang dipisahkan dengan koma:

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY(field1,field2,…)
Perlu dicatat bahwa di MS SQL semua bidang yang termasuk dalam kunci utama harus memiliki karakteristik NOT NULL.

Juga, kunci utama dapat ditentukan secara langsung saat membuat tabel, mis. dalam konteks perintah CREATE TABLE. Mari kita hapus tabel:

DROP TABLE Karyawan
Dan kemudian buat menggunakan sintaks berikut:

CREATE TABLE Employee(ID int NOT NULL, Name nvarchar(30) NOT NULL, Tanggal lahir, Email nvarchar(30), Posisi nvarchar(30), Department nvarchar(30), CONSTRAINT PK_Employee PRIMARY KEY(ID) -- jelaskan PK setelahnya semua bidang sebagai kendala)
Setelah dibuat, isikan data tabel:

INSERT Karyawan(ID,Posisi,Departemen,Nama) NILAI (1000,N"Direktur",N"Administrasi",N"Ivanov II.), (1001,N"Programmer",N"IT",N" Petrov PP" ), (1002,N"Akuntan",N"Akuntansi",N"Sidorov SS"), (1003,N"Programmer Senior",N"IT",N"Andreev A.A.")
Jika kunci utama dalam tabel hanya terdiri dari nilai satu kolom, maka sintaks berikut dapat digunakan:

CREATE TABLE Employee(ID int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY, -- tentukan sebagai karakteristik bidang Nama nvarchar(30) NOT NULL, Tanggal ulang tahun, Email nvarchar(30), Posisi nvarchar(30), Departemen nvarchar(30))
Bahkan, nama kendala dapat dihilangkan, dalam hal ini akan diberikan nama sistem (seperti "PK__Employee__3214EC278DA42077"):

CREATE TABLE Karyawan(ID int NOT NULL, Nama nvarchar(30) NOT NULL, Tanggal lahir, Email nvarchar(30), Posisi nvarchar(30), Departemen nvarchar(30), PRIMARY KEY(ID))
Atau:

CREATE TABLE Karyawan(ID int NOT NULL PRIMARY KEY, Nama nvarchar(30) NOT NULL, Tanggal lahir, Email nvarchar(30), Posisi nvarchar(30), Departemen nvarchar(30))
Tetapi saya akan merekomendasikan agar Anda selalu secara eksplisit menetapkan nama batasan untuk tabel permanen, karena dengan nama yang diberikan dan dimengerti secara eksplisit, selanjutnya akan lebih mudah untuk memanipulasinya, misalnya, Anda dapat menghapusnya:

ALTER TABLE Karyawan DROP CONSTRAINT PK_Karyawan
Tetapi sintaks pendek seperti itu, tanpa menentukan nama batasan, nyaman digunakan saat membuat tabel database sementara (nama tabel sementara dimulai dengan # atau ##), yang akan dihapus setelah digunakan.

Mari kita rangkum

Sejauh ini kita telah membahas perintah berikut:
  • BUAT TABEL table_name (pencacahan bidang dan jenisnya, batasannya) - digunakan untuk membuat tabel baru di database saat ini;
  • DROP MEJA table_name - digunakan untuk menghapus tabel dari database saat ini;
  • ALTER TABEL nama_tabel ALTER COLUMN column_name … – digunakan untuk memperbarui jenis kolom atau mengubah pengaturannya (misalnya, untuk mengatur karakteristik NULL atau NOT NULL);
  • ALTER TABEL nama_tabel TAMBAHKAN KENDALA kendala_nama KUNCI UTAMA(field1, field2,…) – menambahkan kunci utama ke tabel yang ada;
  • ALTER TABEL nama_tabel JATUHKAN KENDALA constraint_name - hapus batasan dari tabel.

Sedikit tentang tabel sementara

Kliping dari MSDN. Ada dua jenis tabel sementara di MS SQL Server: lokal (#) dan global (##). Tabel sementara lokal hanya dapat dilihat oleh pembuatnya hingga sesi koneksi dengan instance SQL Server dihentikan setelah dibuat pertama kali. Tabel sementara lokal secara otomatis dihapus setelah pengguna terputus dari contoh SQL Server. Tabel sementara global terlihat oleh semua pengguna selama sesi koneksi apa pun setelah tabel ini dibuat dan dihapus saat semua pengguna yang merujuk tabel ini memutuskan sambungan dari contoh SQL Server.

Tabel sementara dibuat dalam database sistem tempdb, mis. membuatnya, kami tidak menyumbat database utama, jika tidak, tabel sementara benar-benar identik dengan tabel biasa, mereka juga dapat dihapus menggunakan perintah DROP TABLE. Tabel sementara lokal (#) lebih umum digunakan.

Untuk membuat tabel sementara, Anda dapat menggunakan perintah CREATE TABLE:

BUAT TABEL #Temp(ID int, Nama nvarchar(30))
Karena tabel sementara di MS SQL mirip dengan tabel biasa, Anda juga dapat menghapusnya sesuai dengan perintah DROP TABLE:

DROP TABLE #Temp

Anda juga dapat membuat tabel sementara (juga tabel biasa) dan segera mengisinya dengan data yang dikembalikan oleh kueri menggunakan sintaks SELECT ... INTO:

PILIH ID,Nama INTO #Temp FROM Karyawan

Pada catatan
Dalam DBMS yang berbeda, implementasi tabel sementara mungkin berbeda. Misalnya, dalam ORACLE dan Firebird DBMS, struktur tabel sementara harus ditentukan terlebih dahulu oleh perintah CREATE GLOBAL TEMPORARY TABLE, yang menunjukkan spesifikasi penyimpanan data di dalamnya, kemudian pengguna melihatnya di antara tabel utama dan bekerja dengannya seperti meja biasa.

Normalisasi database - membelah menjadi sub-tabel (direktori) dan menentukan hubungan

Tabel Karyawan kami saat ini memiliki kelemahan bahwa pengguna dapat memasukkan teks apa pun di bidang Posisi dan Departemen, yang terutama penuh dengan kesalahan, karena untuk satu karyawan dia cukup menunjukkan "TI" sebagai departemen, dan untuk karyawan kedua, untuk contoh , masukkan "departemen TI", memiliki "IT" ketiga. Akibatnya, tidak akan jelas apa yang dimaksud pengguna, mis. Apakah karyawan ini karyawan dari departemen yang sama, atau apakah pengguna menggambarkan dirinya sendiri dan ini adalah 3 departemen yang berbeda? Dan terlebih lagi, dalam hal ini, kami tidak akan dapat mengelompokkan data dengan benar untuk beberapa laporan, di mana mungkin diperlukan untuk menunjukkan jumlah karyawan dalam konteks setiap departemen.

Kelemahan kedua adalah jumlah penyimpanan informasi ini dan duplikasinya, mis. untuk setiap karyawan, nama lengkap departemen ditunjukkan, yang membutuhkan tempat di database untuk menyimpan setiap karakter dari nama departemen.

Kelemahan ketiga adalah sulitnya memperbarui bidang ini jika nama posisi berubah, misalnya, jika Anda perlu mengganti nama posisi “Programmer” menjadi “Programmer junior”. Dalam hal ini, kita harus membuat perubahan pada setiap baris tabel, di mana Posisinya sama dengan "Programmer".

Untuk menghindari kekurangan ini, apa yang disebut normalisasi database digunakan - membaginya menjadi sub-tabel, tabel referensi. Tidak perlu masuk ke hutan teori dan mempelajari apa itu bentuk normal, cukup memahami esensi normalisasi.

Mari buat 2 tabel referensi "Posisi" dan "Departemen", yang pertama akan disebut Posisi, dan yang kedua, masing-masing, Departemen:

CREATE TABLE Positions(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Nama nvarchar(30) NOT NULL) CREATE TABLE Departments(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY KEY, Nama nvarchar(30 ) TIDAK NULL)
Perhatikan bahwa di sini kami menggunakan opsi IDENTITAS baru, yang berarti bahwa data di kolom ID akan diberi nomor secara otomatis, mulai dari 1, dengan langkah 1, yaitu. ketika catatan baru ditambahkan, mereka akan diberi nilai 1, 2, 3, dan seterusnya secara berurutan. Bidang seperti itu biasanya disebut peningkatan otomatis. Hanya satu bidang dengan properti IDENTITY yang dapat ditentukan dalam tabel, dan biasanya, tetapi tidak harus, bidang seperti itu adalah kunci utama untuk tabel itu.

Pada catatan
Dalam DBMS yang berbeda, implementasi bidang dengan penghitung dapat dilakukan secara berbeda. Di MySQL, misalnya, bidang seperti itu ditentukan menggunakan opsi AUTO_INCREMENT. Di ORACLE dan Firebird, fungsi ini sebelumnya dapat diemulasi menggunakan SEQUENCEs. Tapi sejauh yang saya tahu, ORACLE sekarang telah menambahkan opsi GENERATED AS IDENTITY.

Mari kita isi tabel-tabel ini secara otomatis, berdasarkan data saat ini yang tercatat di bidang Jabatan dan Departemen pada tabel Karyawan:

Isi bidang Nama tabel Posisi dengan nilai unik dari bidang Posisi tabel Karyawan INSERT Positions(Name) SELECT DISTINCT Position FROM Employee WHERE Position IS NOT NULL -- buang catatan tanpa posisi yang ditentukan
Kami akan melakukan hal yang sama untuk tabel Departemen:

INSERT Departments(Name) SELECT DISTINCT Department FROM Employee MANA Departemen TIDAK NULL
Jika sekarang kita membuka tabel Posisi dan Departemen, kita akan melihat kumpulan nilai bernomor menurut kolom ID:

PILIH * DARI Posisi

PILIH * DARI Departemen

Tabel ini sekarang akan memainkan peran direktori untuk menetapkan posisi dan departemen. Sekarang kita akan mengacu pada ID pekerjaan dan departemen. Pertama-tama, mari kita buat bidang baru di tabel Karyawan untuk menyimpan data ID:

Tambahkan field untuk ID posisi ALTER TABLE Karyawan ADD int PositionID -- tambahkan field untuk ID departemen ALTER TABLE Karyawan ADD DepartmentID int
Jenis bidang referensi harus sama seperti di direktori, dalam hal ini adalah int.

Anda juga dapat menambahkan beberapa bidang ke tabel sekaligus dengan satu perintah, mencantumkan bidang yang dipisahkan dengan koma:

ALTER TABLE Karyawan ADD PositionID int, DepartmentID ke
Sekarang mari kita tulis tautan (batasan referensi - KUNCI ASING) untuk bidang ini, sehingga pengguna tidak memiliki kesempatan untuk menulis ke bidang ini, nilai yang tidak termasuk di antara nilai ID dalam direktori.

ALTER TABLE Karyawan ADD CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENSI Posisi(ID)
Dan kami akan melakukan hal yang sama untuk bidang kedua:

ALTER TABLE Karyawan ADD CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENSI Departemen(ID)
Sekarang pengguna hanya dapat memasukkan nilai ID dari buku referensi yang sesuai ke dalam bidang ini. Oleh karena itu, untuk menggunakan departemen atau posisi baru, pertama-tama ia harus menambahkan entri baru ke direktori yang sesuai. Karena posisi dan departemen sekarang disimpan dalam direktori dalam satu salinan, kemudian untuk mengubah nama, cukup untuk mengubahnya hanya di direktori.

Nama batasan referensial biasanya majemuk, terdiri dari awalan "FK_", diikuti dengan nama tabel, dan setelah garis bawah, muncul nama bidang yang merujuk pada pengidentifikasi tabel pencarian.

Pengidentifikasi (ID) biasanya merupakan nilai internal yang digunakan hanya untuk hubungan dan nilai apa yang disimpan di sana benar-benar acuh tak acuh dalam banyak kasus, jadi tidak perlu mencoba menghilangkan lubang pada urutan angka yang muncul di kursus bekerja dengan tabel, misalnya, setelah menghapus catatan dari buku pegangan.

ALTER TABLE table ADD CONSTRAINT constraint_name FOREIGN KEY(field1,field2,…) REFERENCES lookup table(field1,field2,…)
Dalam hal ini, dalam tabel "tabel_referensi", kunci utama diwakili oleh kombinasi beberapa bidang (bidang1, bidang2, ...).

Sebenarnya, sekarang mari kita perbarui bidang PositionID dan DepartmentID dengan nilai ID dari direktori. Mari kita gunakan perintah UPDATE DML untuk tujuan ini:

UPDATE e SET PositionID=(SELECT ID FROM Positions WHERE Name=e.Position), DepartmentID=(SELECT ID FROM Departments WHERE Name=e.Department) FROM Employee e
Mari kita lihat apa yang terjadi dengan menjalankan kueri:

PILIH * DARI Karyawan

Itu saja, bidang PositionID dan DepartmentID diisi dengan posisi dan departemen yang sesuai dengan ID kebutuhan di bidang Posisi dan Departemen di tabel Karyawan sekarang, Anda dapat menghapus bidang ini:

ALTER TABLE Karyawan DROP COLUMN Posisi, Departemen
Tabel sekarang terlihat seperti ini:

PILIH * DARI Karyawan

Indo Nama hari ulang tahun Surel ID posisi ID Departemen
1000 Ivanov I.I. BATAL BATAL 2 1
1001 Petrov P.P. BATAL BATAL 3 3
1002 Sidorov S.S. BATAL BATAL 1 2
1003 Andreev A.A. BATAL BATAL 4 3

Itu. kami akhirnya menyingkirkan penyimpanan informasi yang berlebihan. Sekarang, berdasarkan posisi dan nomor departemen, kita dapat menentukan nama mereka secara unik menggunakan nilai di tabel pencarian:

SELECT e.ID,e.Name,p.Name PositionName,d.Name DepartmentName FROM Employee e LEFT JOIN Departments d ON d.ID=e.DepartmentID LEFT JOIN Positions p ON p.ID=e.PositionID

Di Object Inspector, kita bisa melihat semua objek yang dibuat untuk tabel tertentu. Dari sini Anda juga dapat melakukan berbagai manipulasi dengan objek ini - misalnya, mengganti nama atau menghapus objek.

Perlu juga dicatat bahwa sebuah tabel dapat merujuk ke dirinya sendiri, mis. Anda dapat membuat tautan rekursif. Misalnya, mari tambahkan field ManagerID lain ke tabel kita dengan karyawan, yang akan menunjukkan karyawan yang menjadi laporan karyawan ini. Mari kita buat bidang:

ALTER TABLE Karyawan TAMBAHKAN ManagerID ke
Nilai NULL diperbolehkan di bidang ini, bidang ini akan kosong jika, misalnya, tidak ada atasan di atas karyawan.

Sekarang mari kita buat KUNCI ASING pada tabel Karyawan:

ALTER TABLE Karyawan ADD CONSTRAINT FK_Employees_ManagerID REFERENSI FOREIGN KEY (ManagerID) Employee(ID)
Sekarang mari kita buat diagram dan lihat bagaimana hubungan antara tabel kita terlihat di atasnya:

Hasilnya, kita akan melihat gambar berikut (tabel Karyawan terkait dengan tabel Jabatan dan Departemen, dan juga mengacu pada dirinya sendiri):

Akhirnya, perlu disebutkan bahwa kunci referensi dapat menyertakan opsi tambahan ON DELETE CASCADE dan ON UPDATE CASCADE, yang memberi tahu bagaimana berperilaku saat menghapus atau memperbarui catatan yang dirujuk dalam tabel pencarian. Jika opsi ini tidak ditentukan, maka kami tidak dapat mengubah ID di tabel direktori entri yang memiliki tautan dari tabel lain, kami juga tidak dapat menghapus entri tersebut dari direktori sampai kami menghapus semua baris yang merujuk ke entri ini atau, Mari perbarui baris referensi ini ke nilai lain.

Misalnya, mari buat ulang tabel dengan opsi ON DELETE CASCADE untuk FK_Employees_DepartmentID:

DROP TABLE Karyawan CREATE TABLE Karyawan(ID int NOT NULL, Nama nvarchar(30), Tanggal lahir, Email nvarchar(30), int PositionID, int DepartmentID, int ManagerID, CONSTRAINT PK_Karyawan PRIMARY KEY (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY ) REFERENCES Departments(ID) ON DELETE CASCADE, CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES,INSERTIDKaryawan,INSERTPosisi(ID) ) NILAI (1000,N"Ivanov II",,"19550219",2,1,NULL), (1001,N"Petrov PP",,"19831203",3,3,1003), (1002,N"Sidorov SS" ,"19760607",1,2,1000), (1003,N"Andreev AA",,"19820417",4,3,1000)
Mari kita hapus departemen dengan ID 3 dari tabel Departemen:

HAPUS Departemen WHERE ID=3
Mari kita lihat data pada tabel Karyawan:

PILIH * DARI Karyawan

Indo Nama hari ulang tahun Surel ID posisi ID Departemen ID Manajer
1000 Ivanov I.I. 1955-02-19 BATAL 2 1 BATAL
1002 Sidorov S.S. 1976-06-07 BATAL 1 2 1000

Seperti yang Anda lihat, data untuk departemen 3 juga telah dihapus dari tabel Karyawan.

Opsi ON UPDATE CASCADE berperilaku serupa, tetapi ini berlaku saat memperbarui nilai ID di direktori. Misalnya, jika kita mengubah ID posisi di direktori posisi, maka dalam hal ini DepartmentID di tabel Karyawan akan diperbarui ke nilai ID baru yang kita tetapkan di direktori. Tetapi dalam kasus ini, tidak mungkin untuk mendemonstrasikan ini, karena. kolom ID di tabel Departemen memiliki opsi IDENTITAS, yang akan mencegah kita mengeksekusi kueri berikut (ubah ID departemen 3 menjadi 30):

UPDATE Departemen SET ID=30 WHERE ID=3
Hal utama adalah memahami esensi dari 2 opsi ini ON DELETE CASCADE dan ON UPDATE CASCADE. Saya menggunakan opsi ini pada kesempatan yang sangat jarang, dan saya menyarankan Anda untuk berpikir dengan hati-hati sebelum menentukannya dalam batasan referensial. jika Anda tidak sengaja menghapus catatan dari tabel referensi, ini dapat menyebabkan masalah besar dan membuat reaksi berantai.

Mari kita pulihkan departemen 3:

Berikan izin untuk menambah/mengubah nilai IDENTITY ​​SET IDENTITY_INSERT Departments ON INSERT Departments(ID,Name) VALUES(3,N"IT") -- tolak penambahan/perubahan nilai IDENTITY ​​SET IDENTITY_INSERT Departments OFF
Hapus sepenuhnya tabel Karyawan menggunakan perintah TRUNCATE TABLE:

Karyawan TABEL TRUNCATE
Dan lagi, muat ulang data ke dalamnya menggunakan perintah INSERT sebelumnya:

INSERT Karyawan (ID,Nama,Ulang Tahun,PositionID,DepartmentID,ManagerID)VALUES (1000,N"Ivanov II","19550219",2,1,NULL), (1001,N"Petrov P.P." ,"19831203",3 ,3,1003), (1002,N"Sidorov SS",,"19760607",1,2,1000), (1003,N"Andreev AA",,"19820417", 4,3,1000)

Mari kita rangkum

Saat ini, beberapa perintah DDL telah ditambahkan ke pengetahuan kita:
  • Menambahkan properti IDENTITY ke bidang - memungkinkan Anda membuat bidang ini terisi secara otomatis (bidang penghitung) untuk tabel;
  • ALTER TABEL nama_tabel MENAMBAHKAN list_of_fields_with_characteristics – memungkinkan Anda menambahkan bidang baru ke tabel;
  • ALTER TABEL nama_tabel JATUHKAN KOLOM list_of_fields - memungkinkan Anda untuk menghapus bidang dari tabel;
  • ALTER TABEL nama_tabel TAMBAHKAN KENDALA kendala_nama KUNCI ASING(bidang) REFERENSI lookup_table(fields) – memungkinkan Anda untuk menentukan hubungan antara tabel dan tabel pencarian.

Batasan lainnya - UNIK, DEFAULT, PERIKSA

Dengan batasan UNIQUE, Anda dapat mengatakan bahwa nilai untuk setiap baris dalam bidang tertentu atau kumpulan bidang harus unik. Dalam kasus tabel Karyawan, kami dapat menerapkan pembatasan seperti itu pada bidang Email. Cukup isi Email terlebih dahulu dengan nilai jika belum ditentukan:

UPDATE Karyawan SET Email=" [dilindungi email]"WHERE ID=1000 UPDATE Karyawan SET Email=" [dilindungi email]" WHERE ID=1001 UPDATE Karyawan SET Email=" [dilindungi email]"WHERE ID=1002 UPDATE Karyawan SET Email=" [dilindungi email]" DIMANA ID = 1003
Dan sekarang Anda dapat menerapkan batasan unik pada bidang ini:

ALTER TABLE Karyawan ADD CONSTRAINT UQ_Employees_Email UNIK(Email)
Sekarang pengguna tidak akan dapat memasukkan E-Mail yang sama untuk beberapa karyawan.

Batasan keunikan biasanya dinamai sebagai berikut - pertama muncul awalan "UQ_", lalu nama tabel, dan setelah garis bawah adalah nama bidang tempat batasan ini diterapkan.

Oleh karena itu, jika kombinasi bidang harus unik dalam konteks baris tabel, maka kami mencantumkannya dipisahkan dengan koma:

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIK(bidang1,bidang2,…)
Dengan menambahkan batasan DEFAULT ke bidang, kita dapat menetapkan nilai default yang akan diganti jika bidang tidak tercantum dalam daftar bidang perintah INSERT saat catatan baru dimasukkan. Pembatasan ini dapat diatur secara langsung saat membuat tabel.

Mari tambahkan bidang baru "Tanggal Perekrutan" ke tabel Karyawan dan beri nama HireDate dan katakan bahwa nilai default untuk bidang ini adalah tanggal saat ini:

ALTER TABLE Karyawan TAMBAHKAN tanggal HireDate NOT NULL DEFAULT SYSDATETIME()
Atau jika kolom HireDate sudah ada, maka sintaks berikut dapat digunakan:

ALTER TABLE Karyawan TAMBAHKAN DEFAULT SYSDATETIME() UNTUK HireDate
Di sini saya tidak menentukan nama kendalanya, karena dalam kasus DEFAULT, saya berpendapat bahwa ini tidak terlalu kritis. Tetapi jika Anda melakukannya dengan cara yang baik, maka menurut saya, Anda tidak perlu bermalas-malasan dan Anda harus menetapkan nama yang normal. Ini dilakukan sebagai berikut:

ALTER TABLE Karyawan TAMBAHKAN CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME() UNTUK HireDate
Karena kolom ini tidak ada sebelumnya, ketika ditambahkan ke setiap catatan, nilai tanggal saat ini akan dimasukkan ke dalam bidang HireDate.

Saat menambahkan entri baru, tanggal saat ini juga akan dimasukkan secara otomatis, tentu saja, jika kita tidak mengaturnya secara eksplisit, mis. tidak ditentukan dalam daftar kolom. Mari kita tunjukkan ini dengan contoh tanpa menentukan bidang HireDate dalam daftar nilai tambah:

MASUKKAN Karyawan(ID,Nama,Email)VALUES(1004,N"Sergeev S.S."," [dilindungi email]")
Mari kita lihat apa yang terjadi:

PILIH * DARI Karyawan

Indo Nama hari ulang tahun Surel ID posisi ID Departemen ID Manajer Tanggal perekrutan
1000 Ivanov I.I. 1955-02-19 [dilindungi email] 2 1 BATAL 2015-04-08
1001 Petrov P.P. 1983-12-03 [dilindungi email] 3 4 1003 2015-04-08
1002 Sidorov S.S. 1976-06-07 [dilindungi email] 1 2 1000 2015-04-08
1003 Andreev A.A. 1982-04-17 [dilindungi email] 4 3 1000 2015-04-08
1004 Sergeev S.S. BATAL [dilindungi email] BATAL BATAL BATAL 2015-04-08

Check constraint CHECK digunakan ketika diperlukan untuk memeriksa nilai yang dimasukkan ke dalam bidang. Misalnya, mari kita terapkan batasan ini pada bidang nomor personel, yang merupakan pengenal (ID) karyawan kita. Dengan menggunakan batasan ini, misalkan nomor personel harus memiliki nilai dari 1000 hingga 1999:

ALTER TABLE Karyawan ADD CONSTRAINT CK_Employees_ID CHECK (ID ANTARA 1000 DAN 1999)
Batasan biasanya diberi nama yang sama, pertama dengan awalan "CK_", kemudian nama tabel dan nama bidang tempat batasan diterapkan.

Mari kita coba memasukkan entri yang tidak valid untuk memeriksa apakah pembatasan berfungsi (kita seharusnya mendapatkan kesalahan yang sesuai):

MASUKKAN Karyawan(ID,Email) NILAI(2000," [dilindungi email]")
Sekarang mari kita ubah nilai yang akan disisipkan menjadi 1500 dan pastikan record sudah dimasukkan:

MASUKKAN Karyawan(ID,Email) VALUES(1500," [dilindungi email]")
Anda juga dapat membuat batasan UNIK dan PERIKSA tanpa menentukan nama:

ALTER TABLE Karyawan TAMBAHKAN UNIK(Email) ALTER TABLE Karyawan TAMBAHKAN CEK (ID ANTARA 1000 DAN 1999)
Tapi ini bukan praktik yang baik dan lebih baik untuk menentukan nama kendala secara eksplisit, karena untuk mencari tahu nanti apa yang akan lebih sulit, Anda perlu membuka objek dan melihat apa yang menjadi tanggung jawabnya.

Dengan nama yang baik, banyak informasi tentang suatu kendala dapat dipelajari langsung dari namanya.

Dan, karenanya, semua batasan ini dapat dibuat segera saat membuat tabel, jika belum ada. Mari kita hapus tabel:

DROP TABLE Karyawan
Dan buat ulang dengan semua batasan yang dibuat dengan satu perintah CREATE TABLE:

CREATE TABLE Employee(ID int NOT NULL, Name nvarchar(30), Tanggal lahir, Email nvarchar(30), PositionID int, DepartmentID int, HireDate date NOT NULL DEFAULT SYSDATETIME(), -- untuk DEFAULT saya akan melempar CONSTRAINT PK_Employees PRIMARY KEY exception (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Posisi(ID), CONSTRAINT UQ_Employees_Employees_Email CONSTRAINT (PERIKSA KARYAWAN_Email) CONSTRAINT UNIKEmployees_Email

INSERT Karyawan (ID,Nama,Ulang Tahun,Email,PositionID,DepartmentID)VALUES (1000,N"Ivanov I.I.","19550219"," [dilindungi email]",2,1), (1001,N"Petrov P.P.","19831203"," [dilindungi email]",3,3), (1002,N"Sidorov S.S.","19760607"," [dilindungi email]",1,2), (1003,N"Andreev A.A.","19820417"," [dilindungi email]",4,3)

Sedikit tentang indeks yang dibuat saat membuat KUNCI UTAMA dan batasan UNIK

Seperti yang Anda lihat pada tangkapan layar di atas, saat membuat KUNCI UTAMA dan batasan UNIK, indeks dengan nama yang sama (PK_Employees dan UQ_Employees_Email) dibuat secara otomatis. Secara default, indeks untuk kunci utama dibuat sebagai CLUSTERED, dan untuk semua indeks lainnya sebagai NONCLUSTERED. Perlu dikatakan bahwa konsep indeks berkerumun tidak tersedia di semua DBMS. Sebuah tabel hanya dapat memiliki satu indeks CLUSTERED. CLUSTERED - artinya record tabel akan diurutkan berdasarkan indeks ini, bisa juga dikatakan bahwa indeks ini memiliki akses langsung ke semua data tabel. Bisa dikatakan indeks utama dari tabel. Untuk membuatnya lebih kasar, itu adalah indeks yang disekrup ke meja. Indeks berkerumun adalah alat yang sangat kuat yang dapat membantu dengan pengoptimalan kueri, ingatlah itu. Jika kita ingin mengatakan bahwa indeks berkerumun tidak digunakan di kunci utama, tetapi untuk indeks lain, maka saat membuat kunci utama, kita harus menentukan opsi NONCLUSTERED:

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY NONCLUSTERED(field1,field2,…)
Misalnya, mari kita buat indeks kendala PK_Employees non-clustered, dan indeks kendala UQ_Employees_Email dikelompokkan. Pertama-tama, mari kita hapus batasan ini:

ALTER TABLE Karyawan DROP CONSTRAINT PK_Karyawan ALTER TABLE Karyawan DROP CONSTRAINT UQ_Employees_Email
Dan sekarang mari kita buat dengan opsi CLUSTERED dan NONCLUSTERED:

ALTER TABLE Karyawan TAMBAHKAN CONSTRAINT PK_Karyawan PRIMARY KEY TIDAK TERMASUK (ID) ALTER TABLE Karyawan TAMBAHKAN CONSTRAINT UQ_Employees_Email UNIQUE CLUSTERED (Email)
Sekarang, ketika kita memilih dari tabel Karyawan, kita dapat melihat bahwa catatan diurutkan berdasarkan indeks berkerumun UQ_Employees_Email:

PILIH * DARI Karyawan

Indo Nama hari ulang tahun Surel ID posisi ID Departemen Tanggal perekrutan
1003 Andreev A.A. 1982-04-17 [dilindungi email] 4 3 2015-04-08
1000 Ivanov I.I. 1955-02-19 [dilindungi email] 2 1 2015-04-08
1001 Petrov P.P. 1983-12-03 [dilindungi email] 3 3 2015-04-08
1002 Sidorov S.S. 1976-06-07 [dilindungi email] 1 2 2015-04-08

Sebelum ini, ketika indeks berkerumun adalah indeks PK_Employees, catatan secara default diurutkan berdasarkan bidang ID.

Namun dalam hal ini, ini hanyalah sebuah contoh yang menunjukkan esensi dari indeks berkerumun, karena. kemungkinan besar, kueri akan dibuat ke tabel Karyawan oleh bidang ID, dan dalam beberapa kasus, itu sendiri dapat bertindak sebagai referensi.

Untuk direktori, biasanya disarankan agar indeks berkerumun dibangun di atas kunci utama, karena dalam permintaan, kami sering merujuk ke pengidentifikasi direktori untuk mendapatkan, misalnya, nama (Posisi, Departemen). Di sini kita mengingat apa yang saya tulis di atas, bahwa indeks berkerumun memiliki akses langsung ke baris tabel, dan selanjutnya kita bisa mendapatkan nilai kolom apa pun tanpa biaya tambahan.

Indeks berkerumun bermanfaat untuk diterapkan pada bidang yang paling sering dipilih.

Terkadang tabel membuat kunci dengan bidang pengganti, dalam hal ini akan berguna untuk menyimpan opsi indeks CLUSTERED untuk indeks yang lebih tepat dan menentukan opsi NONCLUSTERED saat membuat kunci utama pengganti.

Mari kita rangkum

Pada tahap ini, kami berkenalan dengan semua jenis batasan, dalam bentuk paling sederhana, yang dibuat oleh perintah seperti "ALTER TABLE table_name ADD CONSTRAINT constraint_name ...":
  • KUNCI UTAMA- kunci utama;
  • KUNCI ASING- menyiapkan tautan dan memantau integritas referensial data;
  • UNIK- memungkinkan Anda untuk membuat keunikan;
  • MEMERIKSA- memungkinkan Anda untuk melakukan kebenaran data yang dimasukkan;
  • BAWAAN– memungkinkan Anda untuk mengatur nilai default;
  • Perlu juga dicatat bahwa semua batasan dapat dihapus menggunakan perintah " ALTER TABEL nama_tabel JATUHKAN KENDALA kendala_nama".
Kami juga sebagian menyentuh topik indeks dan menganalisis konsep cluster ( BERKELUM) dan tidak berkelompok ( TIDAK TERMASUK) indeks.

Membuat indeks mandiri

Swasembada di sini mengacu pada indeks yang tidak dibuat untuk KUNCI UTAMA atau batasan UNIK.

Indeks pada bidang atau bidang dapat dibuat dengan perintah berikut:

CREATE INDEX IDX_Employeees_Name PADA Karyawan(Nama)
Anda juga dapat menentukan opsi CLUSTERED, NONCLUSTERED, UNIQUE di sini, dan Anda juga dapat menentukan arah pengurutan untuk masing-masing bidang ASC (default) atau DESC:

BUAT INDEKS NONCLUSTERED UNIK UQ_Employees_EmailDesc PADA Karyawan(Email DESC)
Saat membuat indeks non-cluster, opsi NONCLUSTERED dapat dihilangkan, karena itu tersirat secara default, ini ditampilkan di sini hanya untuk menunjukkan posisi opsi CLUSTERED atau NONCLUSTERED dalam perintah.

Anda dapat menghapus indeks dengan perintah berikut:

DROP INDEX IDX_Employeees_Name PADA Karyawan
Indeks sederhana, seperti halnya batasan, dapat dibuat dalam konteks perintah CREATE TABLE.

Misalnya, mari kita hapus tabel lagi:

DROP TABLE Karyawan
Dan buat ulang dengan semua batasan dan indeks yang dibuat dengan satu perintah CREATE TABLE:

BUAT TABEL Karyawan(ID int NOT NULL, Nama nvarchar(30), Tanggal lahir, Email nvarchar(30), int PositionID, int DepartmentID, tanggal HireDate NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME(), ManagerID int, CONSTRAINT PKIMARY KEY ), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Posisi(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Posisi(ID), CONSTRAINT FK_Employees_Employees_ManagerID ULE 1999), INDEX IDX_Nama_Karyawan(Nama))
Terakhir, masukkan ke dalam tabel karyawan kami:

INSERT Karyawan (ID,Nama,Ulang Tahun,Email,PositionID,DepartmentID,ManagerID)VALUES (1000,N"Ivanov II",,"19550219"," [dilindungi email]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [dilindungi email]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [dilindungi email]",1,2,1000), (1003,N"Andreev A.A.","19820417"," [dilindungi email]",4,3,1000)
Selain itu, perlu dicatat bahwa nilai dapat dimasukkan dalam indeks non-cluster dengan menentukannya di INCLUDE. Itu. dalam hal ini, indeks TERMASUK akan agak menyerupai indeks berkerumun, hanya sekarang indeks tidak dilampirkan ke tabel, tetapi nilai yang diperlukan dilampirkan ke indeks. Dengan demikian, indeks semacam itu dapat sangat meningkatkan kinerja kueri pemilihan (SELECT), jika semua bidang yang terdaftar ada dalam indeks, maka ada kemungkinan bahwa tidak perlu mengakses tabel sama sekali. Tapi ini secara alami meningkatkan ukuran indeks, karena nilai bidang yang terdaftar diduplikasi dalam indeks.

Kliping dari MSDN. Sintaks Perintah Umum untuk Membuat Indeks

BUAT [UNIK] [BERKUMPULAN | TIDAK TERMASUK ] INDEX index_name AKTIF (kolom [ ASC | DESC ] [ ,...n ]) [ TERMASUK (nama_kolom [ ,...n ]) ]

Mari kita rangkum

Indeks dapat meningkatkan kecepatan pengambilan data (SELECT), tetapi indeks mengurangi kecepatan memperbarui data tabel, karena setelah setiap modifikasi, sistem perlu membangun kembali semua indeks untuk tabel tertentu.

Hal ini diinginkan dalam setiap kasus untuk menemukan solusi optimal, mean emas, sehingga baik kinerja sampling dan modifikasi data berada pada tingkat yang tepat. Strategi untuk membuat indeks dan jumlahnya dapat bergantung pada banyak faktor, seperti seberapa sering data dalam tabel berubah.

Kesimpulan tentang DDL

Seperti yang Anda lihat, bahasa DDL tidak serumit kelihatannya pada pandangan pertama. Di sini saya dapat menunjukkan hampir semua desain utamanya, hanya menggunakan tiga tabel.

Hal utama adalah memahami esensi, dan sisanya adalah masalah latihan.

Semoga berhasil dalam menguasai bahasa indah yang disebut SQL ini.

Structured Query Language (bahasa query terstruktur) atau SQL- adalah bahasa pemrograman deklaratif untuk digunakan dalam database kuasi-relasional. Banyak fitur asli SQL diambil alih oleh tuple calculi, tetapi ekstensi terbaru ke SQL menyertakan lebih banyak aljabar relasional.
SQL awalnya dibuat oleh IBM, tetapi banyak vendor telah mengembangkan dialek mereka sendiri. Itu diadopsi sebagai standar oleh American National Standards Institute (ANSI) pada tahun 1986 dan oleh ISO pada tahun 1987. Dalam Standar Bahasa Pemrograman SQL, ANSI menyatakan bahwa pengucapan resmi SQL adalah "es cue el". Namun, banyak spesialis database menggunakan pengucapan "slang" "Sequel", yang mencerminkan nama asli bahasa tersebut, Sequel, yang kemudian diubah karena konflik merek dagang dan penamaan di IBM. Pemrograman untuk pemula.
bahasa pemrograman SQL direvisi pada tahun 1992 dan versi ini dikenal sebagai SQL-92's. Kemudian 1999 direvisi lagi menjadi SQL: 1999 (AKA SQL3). Pemrograman untuk boneka. SQL 1999 mendukung objek yang sebelumnya tidak didukung di versi lain, tetapi hanya pada akhir tahun 2001, hanya beberapa sistem manajemen basis data yang mendukung implementasi SQL: 1999.
SQL, meskipun didefinisikan sebagai ANSI dan ISO, memiliki banyak variasi dan ekstensi, yang sebagian besar memiliki karakteristiknya sendiri, seperti implementasi "PL/SQL" perusahaan Oracle, atau implementasi Sybase dan Microsoft yang disebut "Transact-SQL", yang dapat membingungkan pengguna. dasar-dasar pemrograman. Hal ini juga tidak biasa untuk implementasi komersial untuk menghilangkan dukungan untuk fitur utama dari standar, seperti tipe data seperti tanggal dan waktu, mendukung beberapa dari mereka sendiri. Akibatnya, tidak seperti ANSI C atau ANSI Fortran, yang biasanya dapat di-porting dari platform ke platform tanpa perubahan struktural besar, kueri bahasa pemrograman SQL jarang dapat di-porting antara sistem database yang berbeda tanpa modifikasi besar. Kebanyakan orang di bidang basis data percaya bahwa kurangnya interoperabilitas ini disengaja untuk menyediakan sistem manajemen basis data mereka sendiri bagi setiap pengembang dan mengikat pelanggan ke basis data tertentu.
Seperti namanya, bahasa pemrograman SQL dirancang untuk tujuan tertentu yang terbatas - menanyakan data yang terkandung dalam database relasional. Dengan demikian, ini adalah satu set instruksi bahasa pemrograman untuk membuat sampel data, daripada bahasa prosedural seperti C atau BASIC, yang dirancang untuk memecahkan masalah yang jauh lebih luas. Ekstensi bahasa seperti "PL/SQL" dirancang untuk mengatasi keterbatasan ini dengan menambahkan elemen prosedural ke SQL sambil mempertahankan manfaat SQL. Pendekatan lain adalah untuk memungkinkan query SQL untuk menanamkan perintah bahasa pemrograman prosedural dan berinteraksi dengan database. Misalnya, Oracle dan lainnya mendukung bahasa Java dalam database, sedangkan PostgreSQL memungkinkan fungsi ditulis dalam Perl, Tcl, atau C.
Satu lelucon SQL: "SQL tidak terstruktur atau bahasa." Inti dari leluconnya adalah bahwa SQL bukanlah bahasa Turing. .

Pilih * dari T
C1 C2
1 sebuah
2 B
C1 C2
1 sebuah
2 B
Pilih C1 dari T
C1
1
2
C1 C2
1 sebuah
2 B
Pilih * dari T di mana C1=1
C1 C2
1 sebuah

Diberikan tabel T, kueri Select * from T akan menampilkan semua elemen dari semua baris dalam tabel.
Dari tabel yang sama, kueri Pilih C1 dari T akan menampilkan elemen dari kolom C1 dari semua baris dalam tabel.
Dari tabel yang sama, query Select * from T dimana C1=1 akan menampilkan semua elemen dari semua baris dimana nilai kolom C1 adalah "1".

kata kunci SQL

Kata-kata SQL dibagi menjadi beberapa kelompok.

Yang pertama adalah Bahasa Manipulasi Data atau DML(bahasa manajemen data). DML adalah subset dari bahasa yang digunakan untuk query database, menambah, memperbarui, dan menghapus data.

  • SELECT adalah salah satu perintah DML yang paling umum digunakan dan memungkinkan pengguna untuk menentukan kueri sebagai deskripsi hasil yang diinginkan sebagai satu set. Kueri tidak menentukan bagaimana hasil harus diatur - menerjemahkan kueri ke dalam bentuk yang dapat dilakukan di database adalah tugas sistem database, lebih khusus pengoptimal kueri.
  • INSERT digunakan untuk menambahkan baris (formal set) ke tabel yang sudah ada.
  • UPDATE digunakan untuk mengubah nilai data pada baris tabel yang ada.
  • DELETE menentukan baris yang ada untuk dihapus dari tabel.

Tiga kata kunci lainnya bisa dikatakan masuk dalam kelompok DML:

  • BEGIN WORK (atau MULAI TRANSAKSI, tergantung pada dialek SQL) dapat digunakan untuk menandai dimulainya transaksi database yang akan berjalan sepenuhnya atau tidak berjalan sama sekali.
  • COMMIT menyatakan bahwa semua perubahan data setelah operasi dilakukan disimpan.
  • ROLLBACK menetapkan bahwa semua perubahan data sejak komit atau rollback terakhir harus dimusnahkan, hingga titik yang dikomit ke database sebagai "rollback".

COMMIT dan ROLLBACK digunakan di area seperti kontrol transaksi dan penguncian. Kedua instruksi menyelesaikan semua transaksi saat ini (set operasi database) dan melepaskan semua kunci pada perubahan data dalam tabel. Ada atau tidak adanya BEGIN WORK atau pernyataan serupa tergantung pada implementasi SQL tertentu.

Kelompok kata kunci kedua mengacu pada grup Bahasa Definisi Data atau DDL (Data Definition Language). DDL memungkinkan pengguna untuk mendefinisikan tabel baru dan elemen terkait. Sebagian besar database SQL komersial memiliki ekstensi DDL mereka sendiri yang memungkinkan kontrol atas elemen non-standar tetapi biasanya vital dari sistem tertentu.
Poin utama DDL adalah membuat dan menghapus perintah.

  • CREATE menentukan objek (seperti tabel) yang akan dibuat dalam database.
  • DROP menentukan objek mana yang ada dalam database yang akan dihapus, biasanya secara permanen.
  • Beberapa sistem database juga mendukung perintah ALTER, yang memungkinkan pengguna untuk memodifikasi objek yang ada dengan cara yang berbeda, seperti menambahkan kolom ke tabel yang ada.

Kelompok ketiga dari kata kunci SQL adalah Bahasa Kontrol Data atau DCL (Bahasa Kontrol Data). DCL bertanggung jawab atas hak akses data dan memungkinkan pengguna untuk mengontrol siapa yang memiliki akses untuk melihat atau memanipulasi data dalam database. Ada dua kata kunci utama di sini.

Selamat datang di ranah pengembangan basis data yang dilakukan dengan bahasa kueri SQL standar. Sistem manajemen basis data (DBMS) memiliki banyak alat yang berjalan di berbagai platform perangkat keras.

  • Dasar-dasar basis data relasional

    Dalam bab ini... | Organisasi informasi | Apa itu basis data | Apa itu DBMS | Perbandingan model database | Apa itu basis data relasional?

  • Dasar-dasar SQL

    Dalam bab ini... | Apa itu SQL | Kesalahpahaman SQL | Sekilas tentang standar SQL yang berbeda | Pengantar Perintah Standar SQL dan Kata Cadangan | Representasi angka, simbol, tanggal, waktu dan tipe data lainnya | Nilai dan batasan nol

  • Komponen SQL

    Dalam bab ini... | Pembuatan basis data | Pemrosesan data | Perlindungan basis data | SQL adalah bahasa yang dirancang khusus untuk membuat dan memelihara data dalam database relasional. Meskipun perusahaan yang menyediakan sistem untuk mengelola database tersebut menawarkan implementasi SQL mereka sendiri, pengembangan bahasa itu sendiri ditentukan dan dikendalikan oleh standar ISO / ANSI.

  • Membangun dan Memelihara Database Sederhana

    Dalam bab ini... | Membuat, memodifikasi, dan menghapus tabel dari database menggunakan alat RAD. | Membuat, memodifikasi dan menghapus tabel dari database menggunakan SQL. | Mentransfer database ke DBMS lain.

  • Membuat database relasional multi-tabel

    Dalam bab ini… | Apa yang harus ada di database | Mendefinisikan hubungan antar elemen database | Menautkan tabel menggunakan kunci | Desain Integritas Data | Normalisasi basis data | Bab ini akan menyajikan contoh pembuatan database multi-tabel.

  • Memanipulasi data dari database

    Dalam bab ini... | Bekerja dengan data | Mendapatkan data yang diperlukan dari tabel | Menampilkan informasi yang dipilih dari satu atau lebih tabel | Perbarui informasi dalam tabel dan tampilan | Menambahkan baris baru ke tabel

  • Definisi nilai

    Dalam bab ini... | Menggunakan variabel untuk mengurangi pengkodean yang berlebihan | Mendapatkan informasi yang sering diminta dalam bidang tabel database | Menggabungkan nilai sederhana untuk membuat ekspresi majemuk | Buku ini terus-menerus menekankan betapa pentingnya struktur database untuk menjaga integritas database.

  • Ekspresi kompleks dengan makna

    Dalam bab ini... | Menggunakan ekspresi kondisional kasus | Mengonversi elemen data dari satu tipe data ke tipe data lainnya | Hemat waktu entri data dengan ekspresi dengan nilai rekor | Dalam Bab 2, SQL disebut sebagai subbahasa data.

  • "Menembak" ke data yang tepat

    Dalam bab ini... | Menentukan tabel yang diperlukan | Pemisahan garis yang diperlukan dari yang lainnya | Membuat klausa where yang efektif | Cara bekerja dengan nilai nol | Membuat ekspresi majemuk dengan penghubung logis | Mengelompokkan hasil kueri menurut kolom

  • Operator relasional

    Dalam bab ini... | Menggabungkan tabel dengan struktur serupa | Menggabungkan tabel dengan struktur berbeda | Mendapatkan data yang benar dari beberapa tabel | SQL adalah bahasa query yang digunakan dalam database relasional.

  • Menggunakan kueri bersarang

    Dalam bab ini... | Mengambil data dari beberapa tabel dengan satu pernyataan SQL | Menemukan item data dengan membandingkan nilai dari satu tabel dengan sekumpulan nilai dari tabel lain | Menemukan item data dengan membandingkan nilai dari satu tabel dengan satu nilai yang dipilih menggunakan pernyataan pilih dari yang lain

  • Query Rekursif

  • Keamanan basis data

    Dalam bab ini... | Kontrol akses tabel database | Membuat keputusan untuk memberikan akses | Memberikan Izin Akses | Pencabutan Otorisasi Akses | Pencegahan upaya akses yang tidak sah

  • Perlindungan data

    Dalam bab ini... | Bagaimana menghindari korupsi basis data | Masalah yang Disebabkan oleh Operasi Konkuren | Memecahkan masalah ini dengan mekanisme SQL | Mengatur tingkat keamanan yang diperlukan dengan perintah set transaksi

  • Menggunakan SQL dalam Aplikasi

    Dalam bab ini... | SQL dalam Aplikasi | Berbagi SQL dengan bahasa prosedur | Bagaimana menghindari ketidakcocokan | Kode SQL tertanam dalam kode prosedur | Memanggil modul SQL dari kode prosedural | Panggilan SQL dari alat RAD | Dalam bab-bab sebelumnya, kita sebagian besar telah melihat perintah SQL secara terpisah, mis. tugas pemrosesan data dirumuskan, dan kueri SQL dibuat untuk itu.

  • ODBC dan JDBC

    Dalam bab ini… | Definisi ODBC | Deskripsi Bagian ODBC | Menggunakan ODBC di Lingkungan Klien/Server | Menggunakan ODBC di Internet | Menggunakan ODBC di Jaringan Area Lokal | Menggunakan JDBC | Setiap tahun, komputer dari satu organisasi atau beberapa organisasi yang berbeda semakin terhubung satu sama lain. Oleh karena itu, ada kebutuhan untuk membangun akses bersama ke database melalui jaringan.

  • SQL: 2003 dan XML

    Dalam bab ini… | Menggunakan SQL dengan XML | XML, database, dan Internet | Salah satu fitur baru yang paling signifikan dari bahasa SQL:2003 adalah dukungan untuk file Extensible Markup Language (XML), yang semakin menjadi standar universal untuk pertukaran data antar platform heterogen.

  • kursor

    Dalam bab ini... | Lingkup kursor dalam pernyataan pernyataan | Pembukaan kursor | Pengambilan sampel data baris | Kursor tutup | SQL berbeda dari sebagian besar bahasa pemrograman paling populer dalam hal ia melakukan operasi secara bersamaan pada data semua baris tabel, sementara bahasa prosedural memproses data baris demi baris.

  • Sebagian besar aplikasi web modern berinteraksi dengan database, biasanya menggunakan bahasa yang disebut SQL. Beruntung bagi kami, bahasa ini sangat mudah dipelajari. Pada artikel ini, kita akan melihat secara sederhana SQL permintaan dan pelajari cara menggunakannya untuk berinteraksi dengan database MySQL.

    Apa yang kamu butuhkan?

    SQL (Bahasa Kueri Terstruktur) bahasa yang dirancang khusus untuk berinteraksi dengan sistem manajemen basis data seperti: MySQL, Oracle, Sqlite dan lain-lain ... Untuk melakukan SQL permintaan dalam artikel ini, saya menyarankan Anda untuk menginstal MySQL ke komputer lokal. Saya juga merekomendasikan menggunakan phpMyAdmin sebagai antarmuka visual.

    Semua ini tersedia di Denver favorit semua orang. Saya pikir semua orang harus tahu apa itu dan di mana mendapatkannya :). Bisa lain menggunakan WAMP atau MAMP.

    Denver memiliki bawaan MySQL menghibur. Kami akan menggunakannya.

    BUAT DATABASE:pembuatan basis data

    Ini permintaan pertama kami. Kami akan membuat database pertama kami untuk pekerjaan lebih lanjut.

    Untuk memulai, buka MySQL konsol dan login. Untuk WAMP kata sandi default kosong. Itu bukan apa-apa :). Untuk MAMP - "akar". Denver perlu diklarifikasi.

    Setelah login, masukkan baris berikut dan klik Memasuki:

    BUAT DATABASE my_first_db;

    Perhatikan bahwa titik koma (;) ditambahkan di akhir kueri, sama seperti dalam bahasa lain.

    Juga perintah dalam SQL hal - hal sensitif. Kami menulisnya dengan huruf kapital.

    Pilihan hanya: set karakterdan Pemeriksaan

    Jika Anda ingin menginstal kumpulan karakter (character set) dan collation (perbandingan) dapat tulis perintah berikut:

    BUAT DATABASE my_first_db SET KARAKTER DEFAULT utf8 COLLATE utf8_general_ci;

    Temukan daftar set karakter yang didukung di MySQL.

    TAMPILKAN DATABAS:daftar semua database

    Perintah ini digunakan untuk menampilkan semua database yang tersedia.

    JATUHKAN DATABASE:menghapus database

    Anda dapat menghapus db yang ada dengan kueri ini.

    Hati-hati dengan perintah ini karena berjalan tanpa peringatan. Jika ada data di database Anda, semuanya akan dihapus.

    MENGGUNAKAN:Pemilihan basis data

    Secara teknis, ini bukan kueri, tetapi operator, dan tidak memerlukan titik koma di akhir.

    Ini memberitahu MySQL pilih database untuk bekerja secara default untuk sesi saat ini. Sekarang kita siap untuk membuat tabel dan melakukan hal lain dengan database.

    Apa itu tabel dalam database?

    Anda dapat merepresentasikan tabel dalam database sebagai berkas Excel.

    Seperti pada gambar, tabel memiliki nama kolom, baris, dan informasi. Melalui SQL query kita bisa membuat tabel tersebut. Kami juga dapat menambah, membaca, memperbarui, dan menghapus informasi.

    BUAT TABEL: Buat tabel

    C Dengan query ini, kita bisa membuat tabel di database. Sayangnya dokumentasi MySQL tidak terlalu jelas untuk pemula tentang hal ini. Struktur jenis permintaan ini bisa sangat kompleks, tetapi kita akan mulai dengan yang mudah.

    Query berikut akan membuat tabel dengan 2 kolom.

    CREATE TABLE pengguna (nama pengguna VARCHAR (20), create_date DATE);

    Perhatikan bahwa kita dapat menulis kueri kita pada beberapa baris dan dengan tab untuk indentasi.

    Baris pertama sederhana. Kami cukup membuat tabel yang disebut "pengguna". Selanjutnya, dalam tanda kurung, dipisahkan dengan koma, adalah daftar semua kolom. Setelah setiap nama kolom, kami memiliki tipe informasi seperti VARCHAR atau DATE.

    VARCHAR(20) berarti kolom tersebut bertipe string dan panjangnya maksimal 20 karakter. DATE juga merupakan tipe informasi yang digunakan untuk menyimpan tanggal dalam format ini: "YYYY - MM-DD".

    KUNCI UTAMA ( kunci utamaH)

    Sebelum kita mengeksekusi query berikutnya, kita juga perlu menyertakan kolom untuk "user_id", yang akan menjadi kunci utama kita. Anda dapat menganggap PRIMARY KEY sebagai informasi yang digunakan untuk mengidentifikasi setiap baris dalam tabel.

    CREATE TABLE pengguna (user_id INT AUTO_INCREMENT PRIMARY KEY, nama pengguna VARCHAR(20), create_date DATE);

    INT membuat tipe integer 32 bit (seperti angka). AUTO_INCREMENT secara otomatis menghasilkan nilai baru Indo setiap kali kami menambahkan baris informasi baru. Ini tidak diperlukan, tetapi membuat seluruh proses lebih mudah.

    Kolom ini tidak harus berupa nilai integer, tetapi paling sering digunakan. Memiliki Kunci Utama juga opsional, tetapi disarankan untuk arsitektur dan kinerja basis data.

    Mari kita jalankan kueri:

    TAMPILKAN TABEL:tampilkan semua tabel

    Kueri ini memungkinkan Anda untuk mendapatkan daftar tabel yang ada di database.

    MENJELASKAN:Tampilkan struktur tabel

    Anda bisa menggunakan kueri ini untuk memperlihatkan struktur tabel yang sudah ada.

    Kolom ditampilkan dengan semua properti.

    DROP TABEL:hapus tabel

    Sama seperti DROP DATABASES, kueri ini menjatuhkan tabel dan isinya tanpa peringatan.

    ALTER TABEL: ganti meja

    Kueri ini juga dapat berisi struktur yang kompleks karena semakin banyak perubahan yang dapat dilakukan pada tabel. Mari kita lihat contoh.

    (jika Anda menghapus tabel pada langkah terakhir, buat lagi untuk pengujian)

    MENAMBAHKAN KOLOM

    ALTER TABLE pengguna ADD email VARCHAR(100) SETELAH nama pengguna;

    Karena keterbacaan SQL yang baik, saya pikir tidak ada gunanya menjelaskannya secara rinci. Kami menambahkan kolom baru "email" setelah "nama pengguna".

    MENGHAPUS KOLOM

    Itu juga sangat mudah. Harap gunakan kueri ini dengan hati-hati karena data dapat dihapus tanpa peringatan.

    Pulihkan kolom yang baru saja Anda hapus untuk eksperimen lebih lanjut.

    LAKUKAN PERUBAHAN PADA KOLOM

    Terkadang Anda mungkin ingin membuat perubahan pada properti kolom, dan Anda tidak perlu menghapusnya seluruhnya untuk melakukannya.

    Kueri ini mengganti nama kolom pengguna menjadi "nama_pengguna" dan mengubah jenisnya dari VARCHAR(20) menjadi VARCHAR(30). Perubahan seperti itu seharusnya tidak mengubah data dalam tabel.

    MENYISIPKAN: Menambahkan informasi ke tabel

    Mari tambahkan beberapa informasi ke tabel menggunakan kueri berikut.

    Seperti yang Anda lihat, VALUES() berisi daftar nilai yang dipisahkan koma. Semua nilai diapit dalam satu kolom. Dan nilainya harus dalam urutan kolom yang ditentukan saat tabel dibuat.

    Perhatikan bahwa nilai pertama adalah NULL untuk bidang KUNCI UTAMA yang disebut "user_id". Kami melakukan ini agar ID dibuat secara otomatis, karena kolom memiliki properti AUTO_INCREMENT. Ketika informasi ditambahkan untuk pertama kalinya, ID akan menjadi 1. Baris berikutnya akan menjadi 2, dan seterusnya...

    PILIHAN ALTERNATIF

    Ada opsi kueri lain untuk menambahkan baris.

    Kali ini kami menggunakan kata kunci SET alih-alih VALUES dan tidak memiliki tanda kurung. Ada beberapa nuansa:

    Kolom dapat dilewati. Misalnya, kami tidak menetapkan nilai ke "user_id", yang akan mendapatkan nilai AUTO_INCREMENT secara default. Jika Anda menghilangkan kolom VARCHAR, maka string kosong akan ditambahkan.

    Setiap kolom harus dirujuk dengan nama. Karena itu, mereka dapat disebutkan dalam urutan apa pun, tidak seperti versi sebelumnya.

    ALTERNATIF 2

    Berikut pilihan lain.

    Sekali lagi, karena ada referensi ke nama kolom, Anda dapat menentukan nilai dalam urutan apa pun.

    LAST_INSERT_ID()

    Anda dapat menggunakan kueri ini untuk mendapatkan ID yang AUTO_INCREMENT untuk baris terakhir sesi saat ini.

    SEKARANG()

    Sekarang saatnya untuk menunjukkan kepada Anda bagaimana Anda dapat menggunakan fungsi MySQL dalam kueri.

    Fungsi SEKARANG() mengembalikan tanggal saat ini. Jadi Anda dapat menggunakannya untuk secara otomatis mengatur tanggal kolom ke kolom saat ini saat Anda menyisipkan baris baru.

    Perhatikan bahwa kami menerima 1 peringatan, tetapi abaikan saja. Alasan untuk ini adalah bahwa SEKARANG () juga berfungsi untuk menampilkan informasi sementara.

    PILIH: Membaca data dari tabel

    Jika kita menambahkan informasi ke tabel, maka akan logis untuk mempelajari cara membacanya dari sana. Di sinilah kueri SELECT akan membantu kita.

    Di bawah ini adalah kueri SELECT yang paling sederhana untuk membaca tabel.

    Dalam hal ini, tanda bintang (*) berarti bahwa kami telah meminta semua bidang dari tabel. Jika Anda hanya menginginkan kolom tertentu, kueri akan terlihat seperti ini.

    KondisiDI MANA

    Paling sering, kami tidak tertarik pada semua kolom, tetapi hanya di beberapa. Sebagai contoh, mari kita asumsikan bahwa kita hanya memerlukan alamat email untuk pengguna "nettuts".

    WHERE memungkinkan Anda untuk mengatur kondisi dalam kueri dan membuat pilihan terperinci.

    Perhatikan bahwa kesetaraan menggunakan satu tanda sama dengan (=) alih-alih dua seperti dalam pemrograman.

    Anda juga dapat menggunakan perbandingan.

    AND atau OR dapat digunakan untuk menggabungkan kondisi:

    Perhatikan bahwa nilai numerik tidak boleh dalam tanda kutip.

    DI()

    Ini berguna untuk pengambilan sampel pada beberapa nilai.

    SUKA

    Memungkinkan Anda membuat permintaan "wildcard"

    Tanda % digunakan sebagai "wildcard". Artinya, di tempatnya bisa apa saja.

    KondisiDIPESAN OLEH

    Jika Anda ingin mendapatkan hasil dalam bentuk yang dipesan dengan beberapa kriteria

    Urutan default adalah ASC (dari terkecil ke terbesar). Untuk kebalikannya, DESC digunakan.

    BATAS ... OFFSET ...

    Anda dapat membatasi jumlah hasil yang Anda terima.

    LIMIT 2 hanya membutuhkan 2 hasil pertama. LIMIT 1 OFFSET 2 mendapatkan 1 hasil setelah 2 yang pertama. LIMIT 2, 1 artinya sama (perhatikan bahwa offset didahulukan dan kemudian limit ).

    MEMPERBARUI: Buat perubahan pada informasi di tabel

    Query ini digunakan untuk mengubah informasi dalam tabel.

    Dalam kebanyakan kasus, ini digunakan bersama dengan klausa WHERE, karena kemungkinan besar Anda ingin membuat perubahan pada kolom tertentu. Jika tidak ada klausa WHERE, perubahan akan mempengaruhi semua baris.

    Anda juga dapat menggunakan LIMIT untuk membatasi jumlah baris yang perlu diubah.

    MENGHAPUS: Menghapus informasi dari tabel

    Sama seperti UPDATE, kueri ini digunakan dengan WHERE:

    Untuk menghapus konten tabel, Anda cukup melakukan ini:

    HAPUS DARI pengguna;

    Tapi lebih baik menggunakan MEMOTONG

    Selain menghapus, kueri ini juga menyetel ulang nilainya AUTO_INCREMENT dan saat menambahkan baris lagi, hitungan mundur akan dimulai dari nol. MENGHAPUS tidak melakukan ini dan hitungan mundur berlanjut.

    Menonaktifkan Nilai String dan Kata Khusus

    nilai string

    Beberapa karakter perlu dinonaktifkan ( melarikan diri ), atau mungkin ada masalah.

    Untuk ini, garis miring terbalik digunakan.(\).

    Kata-kata khusus

    Karena di MySQL ada banyak kata-kata khusus PILIH atau PERBARUI ), untuk menghindari kesalahan saat menggunakannya, tanda kutip harus digunakan. Tapi bukan kutipan biasa, tapi ini(`).

    Artinya, Anda perlu menambahkan kolom bernama " menghapus ", Anda perlu melakukannya seperti ini:

    Kesimpulan

    Terima kasih telah membaca sampai akhir. Saya harap artikel ini bermanfaat bagi Anda. Ini belum selesai! Bersambung:).