ฐานข้อมูล H2 - คู่มือฉบับย่อ

H2 เป็นฐานข้อมูล Java น้ำหนักเบาแบบโอเพนซอร์ส สามารถฝังอยู่ในแอ็พพลิเคชัน Java หรือรันในโหมดไคลเอนต์เซิร์ฟเวอร์ โดยทั่วไปฐานข้อมูล H2 สามารถกำหนดค่าให้ทำงานเป็นฐานข้อมูลในหน่วยความจำซึ่งหมายความว่าข้อมูลจะไม่อยู่ในดิสก์ เนื่องจากฐานข้อมูลแบบฝังจึงไม่ได้ใช้สำหรับการพัฒนาการผลิต แต่ส่วนใหญ่ใช้สำหรับการพัฒนาและการทดสอบ

ฐานข้อมูลนี้สามารถใช้ในโหมดฝังตัวหรือในโหมดเซิร์ฟเวอร์ ต่อไปนี้เป็นคุณสมบัติหลักของฐานข้อมูล H2 -

  • JDBC API แบบโอเพ่นซอร์สที่รวดเร็วมาก
  • พร้อมใช้งานในโหมดฝังตัวและเซิร์ฟเวอร์ ฐานข้อมูลในหน่วยความจำ
  • แอปพลิเคชันคอนโซลบนเบราว์เซอร์
  • ขนาดเล็ก - ขนาดไฟล์ jar ประมาณ 1.5MB

คุณสมบัติของฐานข้อมูล H2

คุณสมบัติหลักของ H2 Database มีดังนี้ -

  • เป็นเครื่องมือฐานข้อมูลที่รวดเร็วมาก

  • H2 เป็นโอเพ่นซอร์สและเขียนด้วย Java

  • รองรับ SQL มาตรฐานและ JDBC API สามารถใช้ไดรเวอร์ PostgreSQL ODBC ได้เช่นกัน

  • มีโหมดฝังตัวและเซิร์ฟเวอร์

  • H2 รองรับ clustering และ multi-version concurrency.

  • มีคุณสมบัติด้านความปลอดภัยที่แข็งแกร่ง

คุณลักษณะเพิ่มเติม

ต่อไปนี้เป็นคุณสมบัติเพิ่มเติมของ H2 Database -

  • H2 เป็นฐานข้อมูลและตารางที่ใช้ดิสก์หรือในหน่วยความจำสนับสนุนฐานข้อมูลแบบอ่านอย่างเดียวตารางชั่วคราว

  • H2 ให้การสนับสนุนธุรกรรม (อ่านคอมมิต) การเชื่อมต่อหลายเฟสคอมมิต 2 เฟสการล็อกระดับตาราง

  • H2 เป็นเครื่องมือเพิ่มประสิทธิภาพตามต้นทุนโดยใช้อัลกอริธึมทางพันธุกรรมสำหรับการสืบค้นที่ซับซ้อนการดูแลระบบเป็นศูนย์

  • H2 ประกอบด้วยการสนับสนุนชุดผลลัพธ์ที่เลื่อนได้และอัปเดตได้ชุดผลลัพธ์ขนาดใหญ่การเรียงลำดับผลลัพธ์ภายนอกฟังก์ชันสามารถส่งคืนชุดผลลัพธ์

  • H2 รองรับฐานข้อมูลที่เข้ารหัส (AES), การเข้ารหัสรหัสผ่าน SHA-256, ฟังก์ชันการเข้ารหัสและ SSL

ส่วนประกอบในฐานข้อมูล H2

ในการใช้ฐานข้อมูล H2 คุณต้องมีส่วนประกอบดังต่อไปนี้ -

  • เว็บเบราว์เซอร์
  • เซิร์ฟเวอร์คอนโซล H2

นี่คือแอปพลิเคชันไคลเอนต์ / เซิร์ฟเวอร์ดังนั้นทั้งเซิร์ฟเวอร์และไคลเอนต์ (เบราว์เซอร์) จึงจำเป็นต้องเรียกใช้

H2 เป็นฐานข้อมูลที่เขียนด้วยภาษาจาวา เราสามารถฝังฐานข้อมูลนี้ลงในแอปพลิเคชันของเราได้อย่างง่ายดายโดยใช้ JDBC เราสามารถเรียกใช้สิ่งนี้บนแพลตฟอร์มต่างๆหรือ Java Runtime Environment เวอร์ชันใดก็ได้ อย่างไรก็ตามก่อนการติดตั้งฐานข้อมูลควรมี Java ติดตั้งอยู่ในระบบ

ตรวจสอบการติดตั้ง Java

หากติดตั้ง JDK ในระบบให้ลองใช้คำสั่งต่อไปนี้เพื่อตรวจสอบเวอร์ชัน Java

java –version

หากติดตั้ง JDk ในระบบสำเร็จเราจะได้ผลลัพธ์ดังต่อไปนี้

java version "1.8.0_91" 
Java(TM) SE Runtime Environment (build 1.8.0_91-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

หาก JDK ไม่ได้ติดตั้งในระบบแล้วไปที่ลิงก์ต่อไปนี้เพื่อติดตั้ง JDK

ติดตั้งฐานข้อมูล H2

เราสามารถเรียกใช้ฐานข้อมูลนี้บนแพลตฟอร์มต่างๆมากมาย ในบทนี้เราจะเรียนรู้เกี่ยวกับการติดตั้งฐานข้อมูล H2 บน Windows

ต่อไปนี้เป็นขั้นตอนในการติดตั้ง H2 Database บนระบบปฏิบัติการ Windows

ขั้นตอนที่ 1: ดาวน์โหลด H2 Setup File

ดาวน์โหลดH2 Databaseเวอร์ชันล่าสุดจากลิงค์ที่ระบุ ในลิงค์นี้คุณจะได้รับฐานข้อมูล H2 เวอร์ชันล่าสุดในสองประเภท หนึ่งคือประเภท Windows Installer (นั่นคือไฟล์. exe) และที่สองคือไฟล์ zip ที่ไม่ขึ้นกับแพลตฟอร์มสำหรับระบบปฏิบัติการอื่น

คลิกตัวติดตั้ง Windows เพื่อดาวน์โหลดฐานข้อมูล H2 ที่รองรับ Windows หลังจากดาวน์โหลดไฟล์. exe ในกรณีนี้เรากำลังใช้ H2 Database กับเวอร์ชัน 1.4.192

ขั้นตอนที่ 2: ติดตั้งฐานข้อมูล H2

หลังจากดาวน์โหลดเราจะได้ไฟล์ตัวติดตั้ง H2 Windows (เช่น h2-setup-yyyy-mm-dd.exe) ในไดเร็กทอรีดาวน์โหลด ในการเริ่มกระบวนการติดตั้งฐานข้อมูล H2 ให้ดับเบิลคลิกที่ไฟล์ตัวติดตั้ง

หน้าจอต่อไปนี้เป็นขั้นตอนแรกในกระบวนการติดตั้ง ระบุเส้นทางที่เราต้องการติดตั้งเซิร์ฟเวอร์ฐานข้อมูล H2 ดังที่แสดงในภาพหน้าจอต่อไปนี้

ตามที่เห็นในภาพหน้าจอด้านบนโดยค่าเริ่มต้นจะใช้เวลา C:\ProgramFiles (x86)\H2เป็นโฟลเดอร์ปลายทาง คลิกถัดไปเพื่อดำเนินการขั้นต่อไป หน้าจอต่อไปนี้จะปรากฏขึ้น

ในภาพหน้าจอด้านบนคลิกปุ่มติดตั้งเพื่อเริ่มกระบวนการติดตั้ง หลังจากการติดตั้งเราจะได้ภาพหน้าจอต่อไปนี้

คลิกเสร็จสิ้นเพื่อเสร็จสิ้นกระบวนการติดตั้ง

ขั้นตอนที่ 3: ตรวจสอบการติดตั้งฐานข้อมูล H2

หลังจากการติดตั้งให้เราตรวจสอบการติดตั้งฐานข้อมูลในระบบ คลิก Windows →พิมพ์ H2 Console →คลิกไอคอน H2 console เชื่อมต่อกับ URLhttp://localhost:8082. ในขณะเชื่อมต่อฐานข้อมูล H2 จะขอการลงทะเบียนฐานข้อมูลดังที่แสดงในภาพหน้าจอต่อไปนี้

กรอกรายละเอียดทั้งหมดในกล่องโต้ตอบด้านบนเช่นการตั้งค่าที่บันทึกชื่อการตั้งค่าคลาสไดรเวอร์ URL JDBC ชื่อผู้ใช้และรหัสผ่าน ใน JDBC URL ระบุฐานข้อมูลที่อยู่และชื่อฐานข้อมูล ชื่อผู้ใช้และรหัสผ่านเป็นฟิลด์สำหรับชื่อผู้ใช้และรหัสผ่านของฐานข้อมูล คลิกเชื่อมต่อ

หน้ายินดีต้อนรับฐานข้อมูลจะปรากฏขึ้นตามที่แสดงในภาพหน้าจอต่อไปนี้

คำสั่ง Select ใช้เพื่อดึงข้อมูลบันทึกจากตารางหรือหลายตาราง หากเราออกแบบคิวรีแบบเลือกระบบจะส่งคืนข้อมูลในรูปแบบของตารางผลลัพธ์ที่เรียกว่าresult sets.

ไวยากรณ์

ไวยากรณ์พื้นฐานของคำสั่ง SELECT มีดังนี้ -

SELECT [ TOP term ] [ DISTINCT | ALL ] selectExpression [,...] 
FROM tableExpression [,...] [ WHERE expression ] 
[ GROUP BY expression [,...] ] [ HAVING expression ] 
[ { UNION [ ALL ] | MINUS | EXCEPT | INTERSECT } select ] [ ORDER BY order [,...] ] 
[ [ LIMIT expression ] [ OFFSET expression ] [ SAMPLE_SIZE rowCountInt ] ] 
[ FOR UPDATE ]

ในการดึงข้อมูลฟิลด์ที่มีทั้งหมดให้ใช้ไวยากรณ์ต่อไปนี้

SELECT * FROM table_name;

ตัวอย่าง

พิจารณาตารางลูกค้าที่มีบันทึกต่อไปนี้ -

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
|  7 | Muffy    |  24 | Indore    | 10000.00 | 
+----+----------+-----+-----------+----------+

ในการรับตารางลูกค้าพร้อมกับข้อมูลที่กำหนดให้ดำเนินการค้นหาต่อไปนี้

CREATE TABLE CUSTOMER (id number, name varchar(20), age number, address varchar(20), 
salary number);  

INSERT into CUSTOMER values (1, 'Ramesh', 32, 'Ahmedabad', 2000); 
INSERT into CUSTOMER values (2, 'Khilan', 25, 'Delhi', 1500); 
INSERT into CUSTOMER values (3, 'kaushik', 23, 'Kota', 2000); 
INSERT into CUSTOMER values (4, 'Chaitali', 25, 'Mumbai', 6500); 
INSERT into CUSTOMER values (5, 'Hardik', 27, 'Bhopal', 8500); 
INSERT into CUSTOMER values (6, 'Komal', 22, 'MP', 4500); 
INSERT into CUSTOMER values (7, 'Muffy', 24, 'Indore', 10000);

คำสั่งต่อไปนี้เป็นตัวอย่างซึ่งจะดึงฟิลด์ ID ชื่อและเงินเดือนของลูกค้าที่มีอยู่ในตาราง CUSTOMER

SELECT ID, NAME, SALARY FROM CUSTOMERS;

คำสั่งดังกล่าวก่อให้เกิดผลลัพธ์ต่อไปนี้

+----+----------+----------+ 
| ID | NAME     | SALARY   | 
+----+----------+----------+ 
|  1 | Ramesh   |  2000.00 | 
|  2 | Khilan   |  1500.00 | 
|  3 | kaushik  |  2000.00 | 
|  4 | Chaitali |  6500.00 | 
|  5 | Hardik   |  8500.00 | 
|  6 | Komal    |  4500.00 | 
|  7 | Muffy    | 10000.00 | 
+----+----------+----------+

ใช้แบบสอบถามต่อไปนี้เพื่อดึงฟิลด์ทั้งหมดของตาราง CUSTOMERS

SQL> SELECT * FROM CUSTOMERS;

แบบสอบถามข้างต้นให้ผลลัพธ์ดังต่อไปนี้ -

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
|  7 | Muffy    |  24 | Indore    | 10000.00 | 
+----+----------+-----+-----------+----------+

คำสั่ง SQL INSERT ใช้เพื่อเพิ่มแถวข้อมูลใหม่ลงในตารางในฐานข้อมูล

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์พื้นฐานของคำสั่ง INSERT INTO

INSERT INTO tableName 
{ [ ( columnName [,...] ) ] 
{ VALUES 
{ ( { DEFAULT | expression } [,...] ) } [,...] | [ DIRECT ] [ SORTED ] select } } | 
{ SET { columnName = { DEFAULT | expression } } [,...] }

การใช้คำสั่ง INSERT นี้เราสามารถแทรกระเบียนใหม่หรือแถวใหม่ลงในตาราง เมื่อใช้คำสั่ง DIRECT ผลลัพธ์จะได้รับผลโดยตรงกับตารางเป้าหมายโดยไม่มีขั้นตอนกลาง อย่างไรก็ตามในขณะที่เพิ่มค่าสำหรับคอลัมน์ทั้งหมดของตารางตรวจสอบให้แน่ใจว่าลำดับของค่าอยู่ในลำดับเดียวกับคอลัมน์ในตาราง

ตัวอย่าง

ให้เรายกตัวอย่างและลองใส่บันทึกที่กำหนดต่อไปนี้ลงในตารางลูกค้า

ID ชื่อ อายุ ที่อยู่ เงินเดือน
1 ราเมช 32 อาเมดาบัด พ.ศ. 2543
2 คิลัน 25 เดลี 1,500
3 Kaushik 23 โคตะ พ.ศ. 2543
4 Chaitail 25 มุมไบ 6500
5 ฮาร์ดิค 27 โภปาล 8500
6 Komal 22 ส.ส. 4500
7 Muffy 24 อินดอร์ 10,000

เราสามารถรับบันทึกที่กำหนดทั้งหมดลงในตารางลูกค้าได้โดยดำเนินการคำสั่งต่อไปนี้

INSERT INTO CUSTOMER VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000); 
INSERT INTO CUSTOMER VALUES (2, 'Khilan', 25, 'Delhi', 1500); 
INSERT INTO CUSTOMER VALUES (3, 'kaushik', 23, 'Kota', 2000); 
INSERT INTO CUSTOMER VALUES (4, 'Chaitali', 25, 'Mumbai', 6500); 
INSERT INTO CUSTOMER VALUES (5, 'Hardik', 27, 'Bhopal', 8500); 
INSERT INTO CUSTOMER VALUES (6, 'Komal', 22, 'MP', 4500); 
INSERT INTO CUSTOMER VALUES (7, 'Muffy', 24, 'Indore', 10000);

แบบสอบถาม UPDATE ใช้เพื่ออัปเดตหรือแก้ไขระเบียนที่มีอยู่ในตาราง เราสามารถใช้ WHERE clause กับ UPDATE query เพื่ออัปเดตแถวที่เลือกมิฉะนั้นแถวทั้งหมดจะได้รับผลกระทบ

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์พื้นฐานของแบบสอบถาม UPDATE

UPDATE tableName [ [ AS ] newTableAlias ] SET 
{ { columnName = { DEFAULT | expression } } [,...] } | 
{ ( columnName [,...] ) = ( select ) } 
[ WHERE expression ] [ ORDER BY order [,...] ] [ LIMIT expression ]

ในไวยากรณ์ UPDATE นี้เราสามารถรวมเงื่อนไขได้มากกว่าหนึ่งเงื่อนไขโดยใช้ AND หรือ OR clauses

ตัวอย่าง

พิจารณาตารางลูกค้าที่มีบันทึกต่อไปนี้

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
|  7 | Muffy    |  24 | Indore    | 10000.00 | 
+----+----------+-----+-----------+----------+

หากคุณต้องการรับตารางลูกค้าพร้อมกับข้อมูลที่กำหนดให้ดำเนินการค้นหาต่อไปนี้

CREATE TABLE CUSTOMER (id number, name varchar(20), age number, address varchar(20), 
   salary number);  
INSERT into CUSTOMER values (1, 'Ramesh', 32, 'Ahmedabad', 2000); 
INSERT into CUSTOMER values (2, 'Khilan', 25, 'Delhi', 1500); 
INSERT into CUSTOMER values (3, 'kaushik', 23, 'Kota', 2000); 
INSERT into CUSTOMER values (4, 'Chaitali', 25, 'Mumbai', 6500); 
INSERT into CUSTOMER values (5, 'Hardik', 27, 'Bhopal', 8500); 
INSERT into CUSTOMER values (6, 'Komal', 22, 'MP', 4500); 
INSERT into CUSTOMER values (7, 'Muffy', 24, 'Indore', 10000);

คำสั่งต่อไปนี้เป็นตัวอย่างซึ่งจะอัปเดต ADDRESS สำหรับลูกค้าที่มี ID คือ 6 -

UPDATE CUSTOMERS SET ADDRESS = 'Pune' WHERE ID = 6;

ตอนนี้ตาราง CUSTOMERS จะมีบันทึกต่อไปนี้ เราสามารถตรวจสอบบันทึกตารางของลูกค้าได้โดยดำเนินการสอบถามต่อไปนี้

SELECT * FROM CUSTOMERS;

แบบสอบถามข้างต้นให้ผลลัพธ์ดังต่อไปนี้

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | Pune      |  4500.00 | 
|  7 | Muffy    |  24 | Indore    | 10000.00 | 
+----+----------+-----+-----------+----------+

ในการแก้ไขค่าคอลัมน์ ADDRESS และ SALARY ทั้งหมดในตาราง CUSTOMERS เราไม่จำเป็นต้องใช้คำสั่ง WHERE แบบสอบถาม UPDATE จะเป็นดังนี้ -

UPDATE CUSTOMERS SET ADDRESS = 'Pune', SALARY = 1000.00;

ตอนนี้ตาราง CUSTOMERS จะมีบันทึกต่อไปนี้ เราสามารถตรวจสอบบันทึกตารางของลูกค้าได้โดยดำเนินการสอบถามต่อไปนี้

SELECT * FROM CUSTOMERS;

แบบสอบถามข้างต้นให้ผลลัพธ์ดังต่อไปนี้ -

+----+----------+-----+---------+---------+ 
| ID | NAME     | AGE | ADDRESS | SALARY  | 
+----+----------+-----+---------+---------+ 
|  1 | Ramesh   |  32 | Pune    | 1000.00 | 
|  2 | Khilan   |  25 | Pune    | 1000.00 | 
|  3 | kaushik  |  23 | Pune    | 1000.00 | 
|  4 | Chaitali |  25 | Pune    | 1000.00 | 
|  5 | Hardik   |  27 | Pune    | 1000.00 | 
|  6 | Komal    |  22 | Pune    | 1000.00 | 
|  7 | Muffy    |  24 | Pune    | 1000.00 | 
+----+----------+-----+---------+---------+

แบบสอบถาม SQL DELETE ใช้เพื่อลบระเบียนที่มีอยู่ออกจากตาราง เราสามารถใช้ WHERE clause กับ DELETE query เพื่อลบเร็กคอร์ดที่เลือกมิฉะนั้นบันทึกทั้งหมดจะถูกลบ

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์การสืบค้นทั่วไปของคำสั่งลบ

DELETE [ TOP term ] FROM tableName [ WHERE expression ] [ LIMIT term ]

ไวยากรณ์ด้านบนจะลบแถวออกจากตาราง หากระบุ TOP หรือ LIMIT แถวมากที่สุดตามจำนวนที่ระบุไว้จะถูกลบ (ไม่ จำกัด ว่าเป็นค่าว่างหรือน้อยกว่าศูนย์)

ตัวอย่าง

พิจารณาตารางลูกค้าที่มีบันทึกต่อไปนี้

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
|  7 | Muffy    |  24 | Indore    | 10000.00 | 
+----+----------+-----+-----------+----------+

คำสั่งต่อไปนี้จะลบรายละเอียดของลูกค้าซึ่งมี ID คือ 6

DELETE FROM CUSTOMERS WHERE ID = 6;

หลังจากดำเนินการคำสั่งดังกล่าวแล้วให้ตรวจสอบตารางลูกค้าโดยดำเนินการคำสั่งต่อไปนี้

SELECT * FROM CUSTOMERS;

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้ -

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  7 | Muffy    |  24 | Indore    | 10000.00 | 
+----+----------+-----+-----------+----------+

ถ้าเราต้องการลบระเบียนทั้งหมดจากตาราง CUSTOMERS เราไม่ใช้ WHERE clause แบบสอบถาม DELETE จะเป็นดังนี้

DELETE FROM CUSTOMER;

หลังจากดำเนินการคำสั่งข้างต้นจะไม่มีบันทึกในตารางลูกค้า

BACKUP เป็นคำสั่งที่ใช้ในการสำรองฐานข้อมูลลงในไฟล์. zip แยกต่างหาก อ็อบเจ็กต์ไม่ได้ถูกล็อกและเมื่อทำการสำรองข้อมูลบันทึกธุรกรรมจะถูกคัดลอกไปด้วย ต้องมีสิทธิ์ผู้ดูแลระบบเพื่อดำเนินการคำสั่งนี้

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Backup

BACKUP TO fileNameString;

ตัวอย่าง

ในตัวอย่างนี้ให้เราสำรองฐานข้อมูลปัจจุบันลงใน backup.zipไฟล์. ใช้คำสั่งต่อไปนี้สำหรับสิ่งเดียวกัน

BACKUP TO 'backup.zip';

ในการดำเนินการคำสั่งข้างต้นคุณจะได้รับไฟล์ backup.zip ในระบบไฟล์ภายในของคุณ

CALL เป็นคำสั่ง SQL ซึ่งเป็นของเซิร์ฟเวอร์ฐานข้อมูล H2 คำสั่งนี้ใช้ในการคำนวณนิพจน์ทั่วไป ส่งคืนผลลัพธ์ของนิพจน์ที่กำหนดในฟิลด์คอลัมน์เดียว เมื่อส่งกลับอาร์เรย์ของผลลัพธ์แต่ละองค์ประกอบในอาร์เรย์จะแสดงเป็นค่าคอลัมน์

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง CALL

CALL expression;

เราสามารถใช้นิพจน์เลขคณิตในไวยากรณ์นี้

ตัวอย่าง

ให้เรายกตัวอย่างและดำเนินการนิพจน์เลขคณิต (15 * 25) โดยใช้คำสั่งโทร

CALL 15*25;

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

375
375

คำสั่ง EXPLAIN แสดงแผนการดำเนินการสำหรับคำสั่ง เมื่อเราดำเนินการคำสั่งโดยใช้คำสั่ง EXPLAIN ANALYZE แผนการสืบค้นจะรวมจำนวนการสแกนแถวจริงสำหรับแต่ละตาราง

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง EXPLAIN

EXPLAIN { [ PLAN FOR ] | ANALYZE } { select | insert | update | delete | merge}

นอกจากไวยากรณ์นี้แล้วเรายังสามารถใช้เลือกแทรกลบและผสานได้

ตัวอย่าง

ตัวอย่างนี้อธิบายรายละเอียดแผนการสืบค้นของลูกค้าด้วย ID 1

EXPLAIN SELECT * FROM CUSTOMER WHERE ID = 1;

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้ -

คำสั่ง MERGE ใช้เพื่ออัปเดตแถวที่มีอยู่และแทรกแถวใหม่ลงในตาราง คอลัมน์คีย์หลักมีบทบาทสำคัญขณะใช้คำสั่งนี้ ใช้เพื่อค้นหาแถว

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง MERGE

MERGE INTO tableName [ ( columnName [,...] ) ] 
[ KEY ( columnName [,...] ) ] 
{ VALUES { ( { DEFAULT | expression } [,...] ) } [,...] | select }

ในไวยากรณ์ข้างต้นคำสั่ง KEY ใช้เพื่อระบุชื่อคอลัมน์คีย์หลัก นอกเหนือจากคำสั่ง VALUES แล้วเราสามารถใช้ค่าดั้งเดิมเพื่อแทรกหรือเราสามารถดึงและเก็บค่าตารางอื่นลงในตารางนี้โดยใช้คำสั่ง select

ตัวอย่าง

ในตัวอย่างนี้ให้เราลองเพิ่มระเบียนใหม่ในตารางลูกค้า ต่อไปนี้เป็นรายละเอียดของระเบียนใหม่ในตาราง

ชื่อคอลัมน์ มูลค่า
ID 8
ชื่อ Lokesh
อายุ 32
ที่อยู่ ไฮเดอราบาด
เงินเดือน 2500

ใช้แบบสอบถามต่อไปนี้ให้เราแทรกบันทึกที่กำหนดลงในแบบสอบถามฐานข้อมูล H2

MERGE INTO CUSTOMER KEY (ID) VALUES (8, 'Lokesh', 32, 'Hyderabad', 2500);

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

Update count: 1

ให้เราตรวจสอบบันทึกของตารางลูกค้าโดยดำเนินการค้นหาต่อไปนี้

SELECT * FROM CUSTOMER;

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

ID ชื่อ อายุ ที่อยู่ เงินเดือน
1 ราเมช 32 อาเมดาบัด พ.ศ. 2543
2 คิลัน 25 เดลี 1,500
3 Kaushik 23 โคตะ พ.ศ. 2543
4 Chaitali 25 มุมไบ 6500
5 ฮาร์ดิค 27 โภปาล 8500
6 Komal 22 ส.ส. 4500
7 Muffy 24 อินดอร์ 10,000
8 Lokesh 32 ไฮเดอราบาด 2500

ตอนนี้ให้เราพยายามอัปเดตบันทึกโดยใช้ไฟล์ Mergeคำสั่ง ต่อไปนี้เป็นรายละเอียดของบันทึกที่จะอัปเดต

ชื่อคอลัมน์ มูลค่า
ID 8
ชื่อ โลกิ
อายุ 32
ที่อยู่ ไฮเดอราบาด
เงินเดือน 3000

ใช้แบบสอบถามต่อไปนี้เพื่อแทรกระเบียนที่กำหนดลงในแบบสอบถามฐานข้อมูล H2

MERGE INTO CUSTOMER KEY (ID) VALUES (8, 'Loki', 32, 'Hyderabad', 3000);

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

Update count: 1

ให้เราตรวจสอบบันทึกของตารางลูกค้าโดยดำเนินการค้นหาต่อไปนี้

SELECT * FROM CUSTOMER;

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้ -

ID ชื่อ อายุ ที่อยู่ เงินเดือน
1 ราเมช 32 อาเมดาบัด พ.ศ. 2543
2 คิลัน 25 เดลี 1,500
3 Kaushik 23 โคตะ พ.ศ. 2543
4 Chaitali 25 มุมไบ 6500
5 ฮาร์ดิค 27 โภปาล 8500
6 Komal 22 ส.ส. 4500
7 Muffy 24 อินดอร์ 10,000
8 โลกิ 32 ไฮเดอราบาด 3000

SHOW คือคำสั่งที่ใช้เพื่อแสดงรายการของ Schemas ตารางหรือคอลัมน์ของตาราง

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง SHOW

SHOW { SCHEMAS | TABLES [ FROM schemaName ] | 
COLUMNS FROM tableName [ FROM schemaName ] }

ตัวอย่าง

คำสั่งต่อไปนี้สามารถใช้เพื่อรับรายการตารางในฐานข้อมูลปัจจุบัน

SHOW TABLES;

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

TABLE_NAME TABLE_SCHEMA
ลูกค้า สาธารณะ
EMP สาธารณะ

CREATE เป็นคำสั่ง SQL ทั่วไปที่ใช้ในการสร้างตารางสคีมาลำดับมุมมองและผู้ใช้ในเซิร์ฟเวอร์ฐานข้อมูล H2

สร้างตาราง

Create Table เป็นคำสั่งที่ใช้ในการสร้างตารางที่ผู้ใช้กำหนดเองในฐานข้อมูลปัจจุบัน

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปสำหรับคำสั่ง Create Table

CREATE [ CACHED | MEMORY ] [ TEMP | [ GLOBAL | LOCAL ] TEMPORARY ] 
TABLE [ IF NOT EXISTS ] name 
[ ( { columnDefinition | constraint } [,...] ) ] 
[ ENGINE tableEngineName [ WITH tableEngineParamName [,...] ] ] 
[ NOT PERSISTENT ] [ TRANSACTIONAL ] 
[ AS select ]

ด้วยการใช้ไวยากรณ์ทั่วไปของคำสั่งสร้างตารางเราสามารถสร้างตารางประเภทต่างๆเช่นตารางแคชตารางหน่วยความจำและตารางชั่วคราว ต่อไปนี้เป็นรายการเพื่ออธิบายประโยคต่างๆจากไวยากรณ์ที่กำหนด

  • CACHED- ตารางแคชเป็นประเภทเริ่มต้นสำหรับตารางปกติ ซึ่งหมายความว่าจำนวนแถวไม่ได้ถูก จำกัด โดยหน่วยความจำหลัก

  • MEMORY- ตารางหน่วยความจำเป็นประเภทเริ่มต้นสำหรับตารางชั่วคราว ซึ่งหมายความว่าตารางหน่วยความจำไม่ควรมีขนาดใหญ่เกินไปและข้อมูลดัชนีจะถูกเก็บไว้ในหน่วยความจำหลัก

  • TEMPORARY- ตารางชั่วคราวจะถูกลบขณะปิดหรือเปิดฐานข้อมูล โดยทั่วไปตารางชั่วคราวมีสองประเภท -

    • ประเภท GLOBAL - เข้าถึงได้โดยการเชื่อมต่อทั้งหมด

    • ประเภทท้องถิ่น - เข้าถึงได้โดยการเชื่อมต่อปัจจุบัน

    ประเภทเริ่มต้นสำหรับตารางชั่วคราวคือประเภทส่วนกลาง ดัชนีของตารางชั่วคราวจะถูกเก็บไว้ในหน่วยความจำหลักเว้นแต่จะสร้างตารางชั่วคราวโดยใช้ CREATE CACHED TABLE

  • ENGINE - จำเป็นต้องใช้ตัวเลือก ENGINE เมื่อใช้งานตารางแบบกำหนดเองเท่านั้น

  • NOT PERSISTENT - เป็นตัวปรับแต่งเพื่อเก็บข้อมูลตารางที่สมบูรณ์ไว้ในหน่วยความจำและแถวทั้งหมดจะหายไปเมื่อปิดฐานข้อมูล

  • TRANSACTIONAL - เป็นคีย์เวิร์ดที่ทำธุรกรรมแบบเปิดและคำสั่งนี้รองรับเฉพาะตารางชั่วคราว

ตัวอย่าง

ในตัวอย่างนี้ให้เราสร้างตารางชื่อ tutorials_tbl โดยใช้ข้อมูลที่กำหนดต่อไปนี้

ซีเนียร์ No ชื่อคอลัมน์ ประเภทข้อมูล
1 ID Int
2 หัวข้อ วาร์ชาร์ (50)
3 ผู้เขียน วาร์ชาร์ (20)
4 วันที่ยื่น วันที่

แบบสอบถามต่อไปนี้ใช้เพื่อสร้างตาราง tutorials_tbl พร้อมกับข้อมูลคอลัมน์ที่กำหนด

CREATE TABLE tutorials_tbl ( 
   id INT NOT NULL, 
   title VARCHAR(50) NOT NULL, 
   author VARCHAR(20) NOT NULL, 
   submission_date DATE 
);

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

(0) rows effected

สร้างสคีมา

Create Schema คือคำสั่งที่ใช้ในการสร้าง schema ที่ขึ้นอยู่กับผู้ใช้ภายใต้การอนุญาตเฉพาะ (ภายใต้ผู้ใช้ที่ลงทะเบียนในปัจจุบัน)

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Create Schema

CREATE SCHEMA [ IF NOT EXISTS ] name [ AUTHORIZATION ownerUserName ]

ในไวยากรณ์ทั่วไปข้างต้น AUTHORIZATION เป็นคำหลักที่ใช้เพื่อระบุชื่อผู้ใช้ที่เกี่ยวข้อง คำสั่งนี้เป็นทางเลือกซึ่งหมายความว่าหากเราไม่ได้ระบุชื่อผู้ใช้คำสั่งนี้จะพิจารณาผู้ใช้ปัจจุบัน ผู้ใช้ที่ดำเนินการคำสั่งต้องมีสิทธิ์ของผู้ดูแลระบบเช่นเดียวกับเจ้าของ

คำสั่งนี้คอมมิตธุรกรรมเปิดในการเชื่อมต่อนี้

ตัวอย่าง

ในตัวอย่างนี้ให้เราสร้างสคีมาชื่อ test_schema ภายใต้ผู้ใช้ SA โดยใช้คำสั่งต่อไปนี้

CREATE SCHEMA test_schema AUTHORIZATION sa;

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

(0) rows effected

สร้างลำดับ

ลำดับคือแนวคิดที่ใช้ในการสร้างตัวเลขโดยทำตามลำดับสำหรับ id หรือค่าคอลัมน์แบบสุ่ม

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่งสร้างลำดับ

CREATE SEQUENCE [ IF NOT EXISTS ] newSequenceName [ START WITH long ] 
[ INCREMENT BY long ] 
[ MINVALUE long | NOMINVALUE | NO MINVALUE ] 
[ MAXVALUE long | NOMAXVALUE | NO MAXVALUE ] 
[ CYCLE long | NOCYCLE | NO CYCLE ] 
[ CACHE long | NOCACHE | NO CACHE ]

ไวยากรณ์ทั่วไปนี้ใช้เพื่อสร้างลำดับ ประเภทข้อมูลของลำดับคือBIGINT. ในลำดับนี้จะไม่มีการใช้ค่าซ้ำแม้ว่าธุรกรรมจะถูกย้อนกลับก็ตาม

ตัวอย่าง

ในตัวอย่างนี้ให้เราสร้างลำดับชื่อ SEQ_IDโดยใช้แบบสอบถามต่อไปนี้

CREATE SEQUENCE SEQ_ID;

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

(0) rows effected

ALTER เป็นคำสั่งที่ใช้ในการเปลี่ยนโครงสร้างตารางโดยการเพิ่มส่วนคำสั่งต่างๆลงในไฟล์ alterคำสั่ง ตามสถานการณ์เราจำเป็นต้องเพิ่มส่วนคำสั่งที่เกี่ยวข้องให้กับคำสั่ง alter ในบทนี้เราจะพูดถึงสถานการณ์ต่างๆของคำสั่งแก้ไข

แก้ไขตารางเพิ่ม

Alter Table Add เป็นคำสั่งที่ใช้ในการเพิ่มคอลัมน์ใหม่ในตารางพร้อมกับชนิดข้อมูลที่เกี่ยวข้อง คำสั่งนี้ทำธุรกรรมในการเชื่อมต่อนี้

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Alter Table Add

ALTER TABLE [ IF EXISTS ] tableName ADD [ COLUMN ] 
{ [ IF NOT EXISTS ] columnDefinition [ { BEFORE | AFTER } columnName ] 
   | ( { columnDefinition } [,...] ) }

ตัวอย่าง

ในตัวอย่างนี้เราจะเพิ่มคอลัมน์ใหม่ start_date ไปที่โต๊ะ tutorials_tbl. ประเภทข้อมูลสำหรับ start_date คือ Date ต่อไปนี้คือแบบสอบถามเพื่อเพิ่มคอลัมน์ใหม่

ALTER TABLE tutorials_tbl ADD start_date DATE;

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

(6) rows effected

แก้ไขข้อ จำกัด เพิ่มตาราง

Alter table add constraint เป็นคำสั่งที่ใช้ในการเพิ่มข้อ จำกัด ต่าง ๆ ให้กับตารางเช่นคีย์หลักคีย์นอกไม่ใช่ null เป็นต้น

ดัชนีที่จำเป็นจะถูกสร้างขึ้นโดยอัตโนมัติหากยังไม่มีอยู่ ไม่สามารถปิดการตรวจสอบข้อ จำกัด เฉพาะได้ คำสั่งนี้คอมมิตธุรกรรมเปิดในการเชื่อมต่อนี้

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Alter table add constraint

ALTER TABLE [ IF EXISTS ] tableName ADD constraint [ CHECK | NOCHECK ]

ตัวอย่าง

ในตัวอย่างนี้ให้เราเพิ่มข้อ จำกัด ของคีย์หลัก (tutorials_tbl_pk) ไปยังรหัสคอลัมน์ของตาราง tutorials_tblโดยใช้แบบสอบถามต่อไปนี้

ALTER TABLE tutorials_tbl ADD CONSTRAINT tutorials_tbl_pk PRIMARYKEY(id);

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

(6) row (s) effected

แก้ไขข้อ จำกัด การเปลี่ยนชื่อตาราง

คำสั่งนี้ใช้เพื่อเปลี่ยนชื่อข้อ จำกัด ของตารางความสัมพันธ์เฉพาะ คำสั่งนี้คอมมิตธุรกรรมเปิดในการเชื่อมต่อนี้

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Alter Table Rename Constraint

ALTER TABLE [ IF EXISTS ] tableName RENAME oldConstraintName TO newConstraintName

ในขณะที่ใช้ไวยากรณ์นี้ตรวจสอบให้แน่ใจว่าชื่อข้อ จำกัด เก่าควรมีอยู่ในคอลัมน์ที่เกี่ยวข้อง

ตัวอย่าง

ในตัวอย่างนี้เราจะเปลี่ยนชื่อข้อ จำกัด คีย์หลักของตาราง tutorials_tbl จาก tutorials_tbl_pk ถึง tutorials_tbl_pk_constraint. ต่อไปนี้เป็นแบบสอบถามที่จะทำ

ALTER TABLE tutorials_tbl RENAME CONSTRAINT 
tutorials_tbl_pk TO tutorials_tbl_pk_constraint;

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

(1) row (s) effected

แก้ไขคอลัมน์แก้ไขตาราง

คำสั่งนี้ใช้เพื่อเปลี่ยนโครงสร้างและคุณสมบัติของคอลัมน์ของตารางเฉพาะ การเปลี่ยนคุณสมบัติหมายถึงการเปลี่ยนประเภทข้อมูลของคอลัมน์เปลี่ยนชื่อคอลัมน์เปลี่ยนค่าข้อมูลประจำตัวหรือเปลี่ยนการเลือก

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Alter Table Alter Column

ALTER TABLE [ IF EXISTS ] tableName ALTER COLUMN columnName 
{ { dataType [ DEFAULT expression ] [ [ NOT ] NULL ] [ AUTO_INCREMENT | IDENTITY ] } 
| { RENAME TO name } 
| { RESTART WITH long } 
| { SELECTIVITY int } 
| { SET DEFAULT expression } 
| { SET NULL } 
| { SET NOT NULL } }

ในไวยากรณ์ข้างต้น -

  • RESTART - คำสั่งเปลี่ยนค่าถัดไปของคอลัมน์การเพิ่มอัตโนมัติ

  • SELECTIVITY- คำสั่งตั้งค่าการเลือก (1-100) สำหรับคอลัมน์ ขึ้นอยู่กับค่าการเลือกเราสามารถแสดงภาพค่าของคอลัมน์ได้

  • SET DEFAULT - เปลี่ยนค่าเริ่มต้นของคอลัมน์

  • SET NULL - ตั้งค่าคอลัมน์เพื่อให้เป็น NULL

  • SET NOT NULL - ตั้งค่าคอลัมน์เพื่อให้ไม่เป็นโมฆะ

ตัวอย่าง

ในตัวอย่างนี้เราจะเปลี่ยนชื่อคอลัมน์ของตาราง tutorials_tbl จาก Title ถึง Tutorial_Title โดยใช้แบบสอบถามต่อไปนี้

ALTER TABLE tutorials_tbl ALTER COLUMN title RENAME TO tutorial_title;

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

(0) row(s) effected

ในทำนองเดียวกันเราสามารถดำเนินการสถานการณ์ต่างๆได้ด้วยคำสั่ง ALTER

DROP เป็นคำสั่งที่นำมาจากไวยากรณ์ SQL ทั่วไป คำสั่งนี้ใช้เพื่อลบส่วนประกอบฐานข้อมูลและโครงสร้างออกจากหน่วยความจำ มีสถานการณ์ที่แตกต่างกันด้วยคำสั่ง Drop ที่เราจะพูดถึงในบทนี้

วางตาราง

Drop Table เป็นคำสั่งที่ลบตารางตามลำดับและโครงสร้าง

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Drop Table

DROP TABLE [ IF EXISTS ] tableName [,...] [ RESTRICT | CASCADE ]

คำสั่งจะล้มเหลวหากเราใช้ RESTRICT และตารางที่มีมุมมองที่ขึ้นต่อกันอยู่ มุมมองที่อ้างอิงทั้งหมดจะถูกทิ้งเมื่อเราใช้คำหลัก CASCADE

ตัวอย่าง

ในตัวอย่างนี้เราจะวางตารางชื่อการทดสอบโดยใช้แบบสอบถามต่อไปนี้

DROP TABLE test;

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

(6) row (s) effected

วางสคีมา

Drop Schema คือคำสั่งที่ดร็อปสกีมาตามลำดับจากเซิร์ฟเวอร์ฐานข้อมูล มันจะไม่ทำงานจากสคีมาปัจจุบัน

ไวยากรณ์

DROP SCHEMA [ IF EXISTS ] schemaName

ตัวอย่าง

ในตัวอย่างนี้เราจะทิ้งสคีมาที่ชื่อ test_schema โดยใช้แบบสอบถามต่อไปนี้

DROP SCHEMA TEST_SCHEMA;

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

(0) row(s) effected

วางลำดับ

Drop Sequence เป็นคำสั่งที่ใช้ในการวางลำดับจากโครงสร้างตาราง

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Drop Sequence

DROP SEQUENCE [ IF EXISTS ] sequenceName

คำสั่งนี้คอมมิตธุรกรรมเปิดในการเชื่อมต่อนี้

ตัวอย่าง

ในตัวอย่างนี้เราจะวางลำดับที่ชื่อ sequence_id. ต่อไปนี้เป็นคำสั่ง

DROP SEQUENCE sequence_id;

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

(0) row (s) effected

Drop View

Drop View เป็นคำสั่งที่ใช้เพื่อวางมุมมองที่มีอยู่ มุมมองที่อ้างอิงทั้งหมดจะหายไปเช่นกันหากใช้ประโยค CASCADE

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Drop View

DROP VIEW [ IF EXISTS ] viewName [ RESTRICT | CASCADE ]

ตัวอย่าง

ในตัวอย่างนี้เราจะทิ้งมุมมองที่ชื่อ sample_view โดยใช้แบบสอบถามต่อไปนี้

DROP VIEW sample_view;

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

(0) row (s) effected

TRUNCATE เป็นคำสั่งที่ใช้ในการลบข้อมูลออกจากตาราง ไม่เหมือนกับ DELETE FROM ที่ไม่มีคำสั่ง WHERE คำสั่งนี้ไม่สามารถย้อนกลับได้ คำสั่งนี้คอมมิตธุรกรรมเปิดในการเชื่อมต่อนี้

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง truncate

TRUNCATE TABLE tableName

ตัวอย่าง

ในตัวอย่างนี้เราจะตัดตารางที่ชื่อ test โดยใช้แบบสอบถามต่อไปนี้

TRUNCATE TABLE test;

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

(6) row (s) effected

COMMIT เป็นคำสั่งจากไวยากรณ์ SQL ที่ใช้ในการคอมมิตธุรกรรม เราสามารถกระทำธุรกรรมเฉพาะหรือเราสามารถกระทำธุรกรรมที่ดำเนินการอยู่ในปัจจุบัน

ไวยากรณ์

มีไวยากรณ์สองแบบที่แตกต่างกันสำหรับคำสั่ง COMMIT

ต่อไปนี้เป็นไวยากรณ์ทั่วไปสำหรับคำสั่งคอมมิตเพื่อคอมมิตธุรกรรมปัจจุบัน

COMMIT [ WORK ]

ต่อไปนี้เป็นไวยากรณ์ทั่วไปสำหรับคำสั่งคอมมิตเพื่อคอมมิตธุรกรรมเฉพาะ

COMMIT TRANSACTION transactionName

ตัวอย่าง 1

ในตัวอย่างนี้ให้เราคอมมิตธุรกรรมปัจจุบันโดยใช้คำสั่งต่อไปนี้

COMMIT

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

Committed successfully

ตัวอย่าง 2

ในตัวอย่างนี้เราจะทำธุรกรรมที่ชื่อ tx_test โดยใช้คำสั่งต่อไปนี้

COMMIT TRANSACTION tx_test;

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

Committed successfully

Grant เป็นคำสั่งที่มาจากไวยากรณ์ SQL ที่ใช้เพื่อให้สิทธิ์แก่ตารางแก่ผู้ใช้หรือบทบาท ต้องมีสิทธิ์ผู้ดูแลระบบเพื่อดำเนินการคำสั่งนี้ คำสั่งนี้คอมมิตธุรกรรมเปิดในการเชื่อมต่อนี้

ในบทนี้เราจะพูดถึงสถานการณ์ต่างๆของคำสั่ง Grant

ให้สิทธิ์

Grant Right คือคำสั่งเพื่อให้สิทธิ์ผู้ดูแลระบบแก่ตารางแก่ผู้ใช้หรือบทบาท

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Grant

GRANT { SELECT | INSERT | UPDATE | DELETE | ALL } [,...] ON 
{ { SCHEMA schemaName } | { tableName [,...] } } 
TO { PUBLIC | userName | roleName }

ตัวอย่าง

ในตัวอย่างนี้เราจะให้ตารางทดสอบเป็นแบบอ่านอย่างเดียวโดยใช้คำสั่งต่อไปนี้

GRANT SELECT ON TEST TO READONLY

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

Grant successfully

ให้สิทธิ์แก้ไขสคีมาใด ๆ

Grant Alter Any Schema เป็นคำสั่งเพื่อให้สิทธิ์ในการแก้ไข schema แก่ผู้ใช้ที่เกี่ยวข้อง

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Grant Alter Any Schema

GRANT ALTER ANY SCHEMA TO userName

ตัวอย่าง

ในตัวอย่างนี้เราจะให้สิทธิ์ในการแก้ไขสคีมาแก่ผู้ใช้ที่ชื่อ test_user. ตรวจสอบให้แน่ใจว่ามี test_user อยู่ ต่อไปนี้เป็นแบบสอบถามเพื่อให้สิทธิ์ในการเปลี่ยนแปลง

GRANT ALTER ANY SCHEMA TO test_user;

แบบสอบถามข้างต้นสร้างผลลัพธ์ต่อไปนี้

Granted successfully to test_user

SAVEPOINT เป็นคำสั่งที่ใช้บันทึกธุรกรรมชั่วคราว เป็นการดีกว่าที่จะรักษาจุดประหยัดในการทำธุรกรรมของคุณเนื่องจากการย้อนกลับธุรกรรมไปยัง Savepoint ตามลำดับจะเป็นประโยชน์เมื่อจำเป็น

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Savepoint

SAVEPOINT savepointName

ตัวอย่าง

ในตัวอย่างนี้เราจะสร้าง Savepoint ชื่อ Half_Done โดยใช้คำสั่งต่อไปนี้

SAVEPOINT Half_Done;

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

Savepoint created

ROLLBACK เป็นคำสั่งจากไวยากรณ์ SQL ที่ใช้เพื่อย้อนกลับธุรกรรมไปยัง Savepoint หรือธุรกรรมก่อนหน้า ด้วยการใช้คำสั่งนี้เราสามารถย้อนกลับไปที่ Savepoint เฉพาะหรือเราสามารถย้อนกลับไปที่ธุรกรรมที่ดำเนินการก่อนหน้านี้

ไวยากรณ์

มีไวยากรณ์สองแบบที่แตกต่างกันสำหรับคำสั่ง ROLLABCK

ต่อไปนี้เป็นไวยากรณ์ทั่วไปสำหรับคำสั่งย้อนกลับ

ROLLBACK [ TO SAVEPOINT savepointName ]

ต่อไปนี้เป็นไวยากรณ์ทั่วไปของคำสั่ง Rollback สำหรับธุรกรรมเฉพาะ

ROLLBACK TRANSACTION transactionName

ตัวอย่าง 1

ในตัวอย่างนี้เราจะย้อนกลับธุรกรรมปัจจุบันเป็น Savepoint ที่มีชื่อว่า sp1_test โดยใช้คำสั่งต่อไปนี้

ROLLBACK sp1_test;

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

Rollback successfully

ตัวอย่าง 2

ในตัวอย่างต่อไปนี้เราจะย้อนกลับธุรกรรมที่มีชื่อว่า tx_test โดยใช้คำสั่งที่กำหนด

ROLLBACK TRANSACTION tx_test;

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

Rollback successfully

H2 เป็นฐานข้อมูล JAVA เราสามารถโต้ตอบกับฐานข้อมูลนี้โดยใช้ JDBC ในบทนี้เราจะดูวิธีสร้างการเชื่อมต่อ JDBC กับฐานข้อมูล H2 และการดำเนินการ CRUD กับฐานข้อมูล H2

โดยทั่วไปมีห้าขั้นตอนในการสร้างการเชื่อมต่อ JDBC

Step 1 - การลงทะเบียนไดรเวอร์ฐานข้อมูล JDBC

Class.forName ("org.h2.Driver");

Step 2 - การเปิดการเชื่อมต่อ

Connection conn = DriverManager.getConnection ("jdbc:h2:~/test", "sa","");

Step 3 - การสร้างคำสั่ง

Statement st = conn.createStatement();

Step 4 - ดำเนินการคำสั่งและรับ Resultset

Stmt.executeUpdate("sql statement");

Step 5 - การปิดการเชื่อมต่อ

conn.close();

ก่อนที่จะดำเนินการสร้างโปรแกรมเต็มเราจำเป็นต้องเพิ่ม h2-1.4.192.jar fileเป็น CLASSPATH เราจะได้รับสิ่งนี้jar จากโฟลเดอร์ C:\Program Files (x86)\H2\bin.

สร้างตาราง

ในตัวอย่างนี้เราจะเขียนโปรแกรมสำหรับสร้างตาราง พิจารณาตารางที่มีชื่อว่าRegistration มีฟิลด์ต่อไปนี้

ส. เลขที่ ชื่อคอลัมน์ ประเภทข้อมูล ไม่เป็นโมฆะ คีย์หลัก
1 ID จำนวน ใช่ ใช่
2 อันดับแรก วาร์ชาร์ (255) ไม่ ไม่
3 ล่าสุด วาร์ชาร์ (255) ไม่ ไม่
4 อายุ จำนวน ไม่ ไม่

ต่อไปนี้เป็นโปรแกรมตัวอย่างชื่อ H2jdbcCreateDemo.

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Statement;  

public class H2jdbcCreateDemo { 
   // JDBC driver name and database URL 
   static final String JDBC_DRIVER = "org.h2.Driver";   
   static final String DB_URL = "jdbc:h2:~/test";  
   
   //  Database credentials 
   static final String USER = "sa"; 
   static final String PASS = ""; 
  
   public static void main(String[] args) { 
      Connection conn = null; 
      Statement stmt = null; 
      try { 
         // STEP 1: Register JDBC driver 
         Class.forName(JDBC_DRIVER); 
             
         //STEP 2: Open a connection 
         System.out.println("Connecting to database..."); 
         conn = DriverManager.getConnection(DB_URL,USER,PASS);  
         
         //STEP 3: Execute a query 
         System.out.println("Creating table in given database..."); 
         stmt = conn.createStatement(); 
         String sql =  "CREATE TABLE   REGISTRATION " + 
            "(id INTEGER not NULL, " + 
            " first VARCHAR(255), " +  
            " last VARCHAR(255), " +  
            " age INTEGER, " +  
            " PRIMARY KEY ( id ))";  
         stmt.executeUpdate(sql);
         System.out.println("Created table in given database..."); 
         
         // STEP 4: Clean-up environment 
         stmt.close(); 
         conn.close(); 
      } catch(SQLException se) { 
         //Handle errors for JDBC 
         se.printStackTrace(); 
      } catch(Exception e) { 
         //Handle errors for Class.forName 
         e.printStackTrace(); 
      } finally { 
         //finally block used to close resources 
         try{ 
            if(stmt!=null) stmt.close(); 
         } catch(SQLException se2) { 
         } // nothing we can do 
         try { 
            if(conn!=null) conn.close(); 
         } catch(SQLException se){ 
            se.printStackTrace(); 
         } //end finally try 
      } //end try 
      System.out.println("Goodbye!");
   } 
}

บันทึกโปรแกรมข้างต้นลงใน H2jdbcCreateDemo.java คอมไพล์และรันโปรแกรมข้างต้นโดยดำเนินการคำสั่งต่อไปนี้ในพรอมต์คำสั่ง

\>javac H2jdbcCreateDemo.java 
\>java H2jdbcCreateDemo

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

Connecting to database... 
Creating table in given database... 
Created table in given database... 
Goodbye!

หลังจากการดำเนินการนี้เราสามารถตรวจสอบตารางที่สร้างโดยใช้อินเทอร์เฟซ H2 SQL

แทรกบันทึก

ในตัวอย่างนี้เราจะเขียนโปรแกรมสำหรับแทรกระเบียน ให้เราใส่บันทึกต่อไปนี้ลงในตารางการลงทะเบียน

ID อันดับแรก ล่าสุด อายุ
100 ซาร่า อาลี 18
101 มาห์นาซ แฟตมา 25
102 Zaid ข่าน 30
103 สุมิตร Mital 28

ต่อไปนี้เป็นโปรแกรมตัวอย่างชื่อ H2jdbcInsertDemo.

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Statement;  

public class H2jdbcInsertDemo { 
   // JDBC driver name and database URL 
   static final String JDBC_DRIVER = "org.h2.Driver";   
   static final String DB_URL = "jdbc:h2:~/test";  
   
   //  Database credentials 
   static final String USER = "sa"; 
   static final String PASS = ""; 
  
   public static void main(String[] args) { 
      Connection conn = null; 
      Statement stmt = null; 
      try{
         // STEP 1: Register JDBC driver 
         Class.forName(JDBC_DRIVER);  
         
         // STEP 2: Open a connection 
         System.out.println("Connecting to a selected database..."); 
         conn = DriverManager.getConnection(DB_URL,USER,PASS); 
         System.out.println("Connected database successfully..."); 
         
         // STEP 3: Execute a query 
         stmt = conn.createStatement();  
         String sql = "INSERT INTO Registration " + "VALUES (100, 'Zara', 'Ali', 18)"; 
         
         stmt.executeUpdate(sql); 
         sql = "INSERT INTO Registration " + "VALUES (101, 'Mahnaz', 'Fatma', 25)";  
         
         stmt.executeUpdate(sql); 
         sql = "INSERT INTO Registration " + "VALUES (102, 'Zaid', 'Khan', 30)"; 
         
         stmt.executeUpdate(sql); 
         sql = "INSERT INTO Registration " + "VALUES(103, 'Sumit', 'Mittal', 28)"; 
         
         stmt.executeUpdate(sql); 
         System.out.println("Inserted records into the table..."); 
         
         // STEP 4: Clean-up environment 
         stmt.close(); 
         conn.close(); 
      } catch(SQLException se) { 
         // Handle errors for JDBC 
         se.printStackTrace(); 
      } catch(Exception e) { 
         // Handle errors for Class.forName 
         e.printStackTrace(); 
      } finally { 
         // finally block used to close resources 
         try {
            if(stmt!=null) stmt.close();  
         } catch(SQLException se2) { 
         } // nothing we can do 
         try { 
            if(conn!=null) conn.close(); 
         } catch(SQLException se) { 
            se.printStackTrace(); 
         } // end finally try 
      } // end try 
      System.out.println("Goodbye!"); 
   } 
}

บันทึกโปรแกรมข้างต้นลงใน H2jdbcInsertDemo.java คอมไพล์และรันโปรแกรมข้างต้นโดยดำเนินการคำสั่งต่อไปนี้ในพรอมต์คำสั่ง

\>javac H2jdbcInsertDemo.java 
\>java H2jdbcInsertDemo

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

Connecting to a selected database... 
Connected database successfully... 
Inserted records into the table... 
Goodbye!

อ่านบันทึก

ในตัวอย่างนี้เราจะเขียนโปรแกรมสำหรับการอ่านบันทึก ให้เราพยายามอ่านบันทึกทั้งหมดจากตารางRegistration.

ต่อไปนี้เป็นโปรแกรมตัวอย่างชื่อ H2jdbcRecordDemo.

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement;  

public class H2jdbcReadDemo { 
   // JDBC driver name and database URL 
   static final String JDBC_DRIVER = "org.h2.Driver";   
   static final String DB_URL = "jdbc:h2:~/test";  
   
   //  Database credentials 
   static final String USER = "sa"; 
   static final String PASS = ""; 
   
   public static void main(String[] args) { 
      Connection conn = null; 
      Statement stmt = null; 
      try { 
         // STEP 1: Register JDBC driver 
         Class.forName(JDBC_DRIVER); 
         
         // STEP 2: Open a connection 
         System.out.println("Connecting to database..."); 
         conn = DriverManager.getConnection(DB_URL,USER,PASS);  
         
         // STEP 3: Execute a query 
         System.out.println("Connected database successfully..."); 
         stmt = conn.createStatement(); 
         String sql = "SELECT id, first, last, age FROM Registration"; 
         ResultSet rs = stmt.executeQuery(sql); 
         
         // STEP 4: Extract data from result set 
         while(rs.next()) { 
            // Retrieve by column name 
            int id  = rs.getInt("id"); 
            int age = rs.getInt("age"); 
            String first = rs.getString("first"); 
            String last = rs.getString("last");  
            
            // Display values 
            System.out.print("ID: " + id); 
            System.out.print(", Age: " + age); 
            System.out.print(", First: " + first); 
            System.out.println(", Last: " + last); 
         } 
         // STEP 5: Clean-up environment 
         rs.close(); 
      } catch(SQLException se) { 
         // Handle errors for JDBC 
         se.printStackTrace(); 
      } catch(Exception e) { 
         // Handle errors for Class.forName 
         e.printStackTrace(); 
      } finally { 
         // finally block used to close resources 
         try { 
            if(stmt!=null) stmt.close();  
         } catch(SQLException se2) { 
         } // nothing we can do 
         try { 
            if(conn!=null) conn.close(); 
         } catch(SQLException se) { 
            se.printStackTrace(); 
         } // end finally try 
      } // end try 
      System.out.println("Goodbye!"); 
   } 
}

บันทึกโปรแกรมข้างต้นลงใน H2jdbcReadDemo.java คอมไพล์และรันโปรแกรมข้างต้นโดยดำเนินการคำสั่งต่อไปนี้ในพรอมต์คำสั่ง

\>javac H2jdbcReadDemo.java 
\>java H2jdbcReadDemo

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

Connecting to a selected database... 
Connected database successfully... 
ID: 100, Age: 18, First: Zara, Last: Ali 
ID: 101, Age: 25, First: Mahnaz, Last: Fatma 
ID: 102, Age: 30, First: Zaid, Last: Khan 
ID: 103, Age: 28, First: Sumit, Last: Mittal 
Goodbye!

อัปเดตบันทึก

ในตัวอย่างนี้เราจะเขียนโปรแกรมเพื่อปรับปรุงระเบียน ให้เราพยายามอ่านบันทึกทั้งหมดจากตารางRegistration.

ต่อไปนี้เป็นโปรแกรมตัวอย่างชื่อ H2jdbcUpdateDemo.

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement;  

public class H2jdbcUpdateDemo { 
   // JDBC driver name and database URL 
   static final String JDBC_DRIVER = "org.h2.Driver";   
   static final String DB_URL = "jdbc:h2:~/test";  
   
   // Database credentials 
   static final String USER = "sa"; 
   static final String PASS = ""; 
   
   public static void main(String[] args) { 
      Connection conn = null; 
      Statement stmt = null; 
      try { 
         // STEP 1: Register JDBC driver 
         Class.forName(JDBC_DRIVER); 
         
         // STEP 2: Open a connection 
         System.out.println("Connecting to a database..."); 
         conn = DriverManager.getConnection(DB_URL,USER,PASS);  
         
         // STEP 3: Execute a query 
         System.out.println("Connected database successfully..."); 
         stmt = conn.createStatement(); 
         String sql = "UPDATE Registration " + "SET age = 30 WHERE id in (100, 101)"; 
         stmt.executeUpdate(sql);  
         
         // Now you can extract all the records 
         // to see the updated records 
         sql = "SELECT id, first, last, age FROM Registration"; 
         ResultSet rs = stmt.executeQuery(sql);  
         
         while(rs.next()){ 
            // Retrieve by column name 
            int id  = rs.getInt("id"); 
            int age = rs.getInt("age"); 
            String first = rs.getString("first"); 
            String last = rs.getString("last");  
            
            // Display values 
            System.out.print("ID: " + id); 
            System.out.print(", Age: " + age); 
            System.out.print(", First: " + first); 
            System.out.println(", Last: " + last); 
         } 
         rs.close();    
      } catch(SQLException se) { 
         // Handle errors for JDBC 
         se.printStackTrace(); 
      } catch(Exception e) { 
         // Handle errors for Class.forName 
         e.printStackTrace(); 
      } finally { 
         // finally block used to close resources  
         try { 
            if(stmt!=null) stmt.close(); 
         } catch(SQLException se2) { 
         } // nothing we can do 
         try { 
            if(conn!=null) conn.close(); 
         } catch(SQLException se) { 
            se.printStackTrace(); 
         } // end finally try 
      } // end try 
      System.out.println("Goodbye!"); 
   } 
}

บันทึกโปรแกรมข้างต้นลงใน H2jdbcUpdateDemo.java คอมไพล์และรันโปรแกรมข้างต้นโดยดำเนินการคำสั่งต่อไปนี้ในพรอมต์คำสั่ง

\>javac H2jdbcUpdateDemo.java 
\>java H2jdbcUpdateDemo

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

Connecting to a selected database... 
Connected database successfully... 
ID: 100, Age: 30, First: Zara, Last: Ali 
ID: 101, Age: 30, First: Mahnaz, Last: Fatma 
ID: 102, Age: 30, First: Zaid, Last: Khan 
ID: 103, Age: 28, First: Sumit, Last: Mittal 
Goodbye!

ลบบันทึก

ในตัวอย่างนี้เราจะเขียนโปรแกรมเพื่อลบบันทึก ให้เราพยายามอ่านบันทึกทั้งหมดจากตารางRegistration.

ต่อไปนี้เป็นโปรแกรมตัวอย่างชื่อ H2jdbcDeleteDemo.

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement;  

public class H2jdbcDeleteDemo { 
   // JDBC driver name and database URL 
   static final String JDBC_DRIVER = "org.h2.Driver";   
   static final String DB_URL = "jdbc:h2:~/test";  
   
   // Database credentials 
   static final String USER = "sa"; 
   static final String PASS = ""; 
  
   public static void main(String[] args) { 
      Connection conn = null; 
      Statement stmt = null; 
      try { 
         // STEP 1: Register JDBC driver 
         Class.forName(JDBC_DRIVER);  
         
         // STEP 2: Open a connection 
         System.out.println("Connecting to database..."); 
         conn = DriverManager.getConnection(DB_URL,USER,PASS);  
         
         // STEP 3: Execute a query
         System.out.println("Creating table in given database..."); 
         stmt = conn.createStatement();  
         String sql = "DELETE FROM Registration " + "WHERE id = 101"; 
         stmt.executeUpdate(sql);  
         
         // Now you can extract all the records 
         // to see the remaining records 
         sql = "SELECT id, first, last, age FROM Registration"; 
         ResultSet rs = stmt.executeQuery(sql);  
         
         while(rs.next()){ 
            // Retrieve by column name 
            int id  = rs.getInt("id"); 
            int age = rs.getInt("age"); 
            String first = rs.getString("first"); 
            String last = rs.getString("last");  
            
            // Display values 
            System.out.print("ID: " + id); 
            System.out.print(", Age: " + age); 
            System.out.print(", First: " + first); 
            System.out.println(", Last: " + last); 
         } 
         rs.close(); 
      } catch(SQLException se) { 
         // Handle errors for JDBC 
         se.printStackTrace();  
      } catch(Exception e) { 
         // Handle errors for Class.forName 
         e.printStackTrace(); 
      } finally { 
         // finally block used to close resources 
         try { 
            if(stmt!=null) stmt.close(); 
         } catch(SQLException se2) { 
         } // nothing we can do 
         try { 
            if(conn!=null) conn.close(); 
         } catch(SQLException se) { 
            se.printStackTrace(); 
         } // end finally try
      } // end try 
      System.out.println("Goodbye!"); 
   } 
}

บันทึกโปรแกรมข้างต้นลงใน H2jdbcDeleteDemo.java คอมไพล์และรันโปรแกรมข้างต้นโดยดำเนินการคำสั่งต่อไปนี้ในพรอมต์คำสั่ง

\>javac H2jdbcDeleteDemo.java 
\>java H2jdbcDeleteDemo

คำสั่งดังกล่าวสร้างผลลัพธ์ต่อไปนี้

Connecting to a selected database... 
Connected database successfully... 
ID: 100, Age: 30, First: Zara, Last: Ali 
ID: 102, Age: 30, First: Zaid, Last: Khan 
ID: 103, Age: 28, First: Sumit, Last: Mittal 
Goodbye!