SQL is a language. You use it to talk to a database. This page teaches it in easy English. Then you write real SQL yourself. SQL 是一种语言。你用它跟数据库说话。这一页用很简单的英语教你。然后你自己写真正的 SQL。 SQL คือภาษาหนึ่ง คุณใช้มันคุยกับฐานข้อมูล หน้านี้สอนด้วยภาษาอังกฤษง่าย ๆ แล้วคุณจะได้เขียน SQL จริงด้วยตัวเอง
There is a small database inside this page. It has two tables:
students and teachers. Every blue code box below has a
▶ Try it button. Press it. The command goes to the practice console
at the bottom and runs. Nothing is sent to the internet.
这一页里面有一个小小的数据库。它有两张表:students 和 teachers。
下面每一个蓝色代码框都有一个 ▶ Try it 按钮。按下去,命令就会跑到下面的练习台上运行。
什么都不会送到网上。
ในหน้านี้มีฐานข้อมูลเล็ก ๆ อยู่ มีสองตาราง: students และ teachers
กล่องโค้ดสีน้ำเงินทุกกล่องข้างล่างมีปุ่ม ▶ Try it กดแล้วคำสั่งจะไปรันที่แผงฝึกด้านล่าง
ไม่มีอะไรถูกส่งออกอินเทอร์เน็ต
Learn these 15 words first. Then the rest of the page is easy. 先学会这 15 个词。后面的内容就很容易了。 เรียน 15 คำนี้ก่อน แล้วส่วนที่เหลือของหน้านี้จะง่ายมาก
| Word | Meaning |
|---|---|
| Database数据库ฐานข้อมูล | A place where a computer keeps information.电脑存放资料的地方。ที่ที่คอมพิวเตอร์เก็บข้อมูลไว้ |
| Table表ตาราง | A named group of rows inside a database.数据库里一组有名字的行。กลุ่มของแถวที่มีชื่อ อยู่ในฐานข้อมูล |
| Row行แถว | One record in a table. One student is one row.表里的一条记录。一个学生就是一行。หนึ่งรายการในตาราง นักเรียนหนึ่งคนคือหนึ่งแถว |
| Column列คอลัมน์ | One kind of information. Age is one column.一种资料。年龄就是一列。ข้อมูลหนึ่งชนิด อายุคือหนึ่งคอลัมน์ |
| SQL | The language you use to talk to the database.你用来跟数据库说话的语言。ภาษาที่ใช้คุยกับฐานข้อมูล |
| PostgreSQL | A program that keeps your tables safe.帮你保管表的程序。โปรแกรมที่เก็บตารางของคุณไว้อย่างปลอดภัย |
| Client客户端ไคลเอนต์ | The tool you type your commands into.你打命令用的工具。เครื่องมือที่คุณพิมพ์คำสั่งลงไป |
| Server服务器เซิร์ฟเวอร์ | The program that holds the data and does the work.保管资料、做事情的程序。โปรแกรมที่เก็บข้อมูลและทำงานให้ |
| Query查询คิวรี (คำถาม) | A question you ask the database.你问数据库的一个问题。คำถามที่คุณถามฐานข้อมูล |
| Integer整数จำนวนเต็ม | A whole number, like 12. No decimal point.整整的数字,比如 12。没有小数点。ตัวเลขเต็ม เช่น 12 ไม่มีจุดทศนิยม |
| Varchar变长文本ข้อความความยาวจำกัด | Words or text, with a longest size.文字,有最长的限制。ตัวอักษรหรือข้อความ ที่กำหนดความยาวมากที่สุดไว้ |
| Date日期วันที่ | A day on the calendar.日历上的一天。วันหนึ่งวันบนปฏิทิน |
| Null空值ค่าว่าง | Empty. We do not know this value.空的。我们不知道这个值。ว่าง เราไม่รู้ค่านี้ |
| Join连接การเชื่อมตาราง | Put two tables together in one answer.把两张表合在一个答案里。เอาสองตารางมารวมกันในคำตอบเดียว |
| Primary key主键คีย์หลัก | A number that is different for every row.每一行都不一样的一个号码。ตัวเลขที่ไม่ซ้ำกันในทุกแถว |
Here is our students table. Press the buttons to see a row and a column.
这是我们的 students 表。按按钮看看什么是行、什么是列。
นี่คือตาราง students ของเรา กดปุ่มเพื่อดูว่าแถวและคอลัมน์คืออะไร
PostgreSQL uses a client/server model. The server is the program that keeps the data. The client is the tool that you use. You type in the client. The client sends your words to the server. The server does the work. Then it sends the answer back. PostgreSQL 用的是客户端/服务器模式。服务器是保管资料的程序。 客户端是你用的工具。你在客户端里打字。客户端把你的话送给服务器。 服务器做完事,再把答案送回来。 PostgreSQL ใช้รูปแบบ ไคลเอนต์/เซิร์ฟเวอร์ เซิร์ฟเวอร์ คือโปรแกรมที่เก็บข้อมูล ไคลเอนต์ คือเครื่องมือที่คุณใช้ คุณพิมพ์ในไคลเอนต์ ไคลเอนต์ส่งคำสั่งไปให้เซิร์ฟเวอร์ เซิร์ฟเวอร์ทำงานแล้วส่งคำตอบกลับมา
The client and the server can be on two different computers. They talk over a network. One server can talk to many clients at the same time. 客户端和服务器可以在两台不同的电脑上。它们通过网络说话。 一台服务器可以同时跟很多客户端说话。 ไคลเอนต์กับเซิร์ฟเวอร์อยู่คนละเครื่องได้ ทั้งคู่คุยกันผ่านเครือข่าย เซิร์ฟเวอร์หนึ่งตัวคุยกับไคลเอนต์หลายตัวพร้อมกันได้
You type these in your computer terminal, not in SQL. 这些是在电脑的终端里打的,不是 SQL。 คำสั่งพวกนี้พิมพ์ในเทอร์มินัลของเครื่อง ไม่ใช่ SQL
dropdb removes the whole database.
You cannot undo it. Nothing asks you “are you sure?”
小心。dropdb 会删掉整个数据库。删了就回不来了。
它不会问你"你确定吗?"
ระวัง dropdb ลบฐานข้อมูลทั้งอัน เรียกคืนไม่ได้
และไม่มีอะไรถามว่า "แน่ใจหรือ?"psql is the normal client. It is a text window. You type SQL in it.
psql 是最常用的客户端。它是一个文字窗口。你在里面打 SQL。
psql คือไคลเอนต์ที่ใช้กันทั่วไป เป็นหน้าต่างตัวอักษร คุณพิมพ์ SQL ลงไป
Inside psql some commands start with a backslash. They are not SQL.
They are commands for the client itself.
在 psql 里,有些命令用反斜线开头。它们不是 SQL,
是给客户端自己用的命令。
ใน psql คำสั่งบางอย่างขึ้นต้นด้วยเครื่องหมาย \ คำสั่งพวกนี้ไม่ใช่ SQL
แต่เป็นคำสั่งของตัวไคลเอนต์เอง
| Command | What it does |
|---|---|
\l | List all databases列出所有数据库แสดงรายชื่อฐานข้อมูลทั้งหมด |
\dt | List all tables列出所有表แสดงรายชื่อตารางทั้งหมด |
\d mytable | Show the columns of one table看一张表有哪些列ดูคอลัมน์ของตารางหนึ่งตาราง |
\? | Show help看说明ดูคำแนะนำ |
\q | Quit psql离开 psqlออกจาก psql |
You give the table a name. Then you list the columns. For each column you say what kind of data it holds. 先给表起一个名字。然后列出每一列。每一列都要说它放的是哪种资料。 ตั้งชื่อตารางก่อน แล้วไล่รายชื่อคอลัมน์ แต่ละคอลัมน์ต้องบอกว่าเก็บข้อมูลชนิดไหน
A data type tells the computer what is in a column. 数据类型告诉电脑,这一列里放的是什么。 ชนิดข้อมูลบอกคอมพิวเตอร์ว่าในคอลัมน์นั้นมีอะไรอยู่
| Data type | What it holds | Example |
|---|---|---|
integer | Whole numbers整数จำนวนเต็ม | 12 |
real | Numbers with a dot有小数点的数字ตัวเลขที่มีจุดทศนิยม | 0.25 |
text | Words, any length文字,多长都行ข้อความ ยาวเท่าไรก็ได้ | Chiang Mai |
varchar(40) | Words, 40 letters at most文字,最多 40 个字ข้อความ ยาวไม่เกิน 40 ตัวอักษร | Nok |
date | A day一个日期วันที่ | 1994-11-27 |
boolean | True or false真或假จริงหรือเท็จ | true |
A constraint is a rule. The database keeps the rule for you. If you break it, the database says no. 约束就是一条规则。数据库帮你守着这条规则。你违反了,它就不答应。 constraint คือกฎข้อหนึ่ง ฐานข้อมูลจะคอยรักษากฎนี้ให้ ถ้าคุณทำผิดกฎ มันจะไม่ยอม
| Rule | What it says | Example |
|---|---|---|
| NOT NULL | This box cannot be empty.这一格不可以是空的。ช่องนี้ว่างไม่ได้ | name text NOT NULL |
| UNIQUE | No two rows can be the same here.这里不可以有两行一样。ห้ามมีสองแถวที่ค่าตรงนี้ซ้ำกัน | email text UNIQUE |
| PRIMARY KEY | A unique number for the row.这一行专用、不重复的号码。เลขประจำแถว ไม่ซ้ำกับใคร | id integer PRIMARY KEY |
| REFERENCES | This points at another table.这一格指向另一张表。ช่องนี้ชี้ไปที่อีกตารางหนึ่ง | teacher_id integer REFERENCES teachers |
| CHECK | The value must follow a rule.这个值必须符合一条规则。ค่านี้ต้องเป็นไปตามกฎที่ตั้งไว้ | price numeric CHECK (price > 0) |
Text and dates go inside single quotes. Numbers do not. 文字和日期要放在单引号里。数字不用。 ข้อความและวันที่ต้องอยู่ในเครื่องหมาย ' ' ส่วนตัวเลขไม่ต้อง
You can add more than one row at a time. 一次可以加好几行。 เพิ่มทีละหลายแถวพร้อมกันได้
"Nok" with double quotes is wrong.
Text needs single quotes: 'Nok'. Double quotes mean a column name.
常见错误。用双引号写 "Nok" 是错的。
文字要用单引号:'Nok'。双引号是用来写列名的。
ข้อผิดพลาดที่พบบ่อย เขียน "Nok" ด้วยเครื่องหมาย " " ผิด
ข้อความต้องใช้ ' ' แบบนี้: 'Nok' ส่วน " " ใช้กับชื่อคอลัมน์SELECT is the most important word in SQL. You use it every day. SELECT 是 SQL 里最重要的词。你每天都会用到它。 SELECT คือคำที่สำคัญที่สุดใน SQL คุณจะได้ใช้มันทุกวัน
The star * means “every column”.
星号 * 的意思是"每一列"。
เครื่องหมาย * หมายถึง "ทุกคอลัมน์"
WHERE is a filter. Only rows that match come back. WHERE 是一个筛子。只有符合条件的行才会回来。 WHERE คือตัวกรอง เฉพาะแถวที่ตรงเงื่อนไขเท่านั้นที่จะกลับมา
| You write | It means |
|---|---|
= | is the same as等于เท่ากับ |
<> | is not the same as不等于ไม่เท่ากับ |
> < | bigger than, smaller than大于、小于มากกว่า, น้อยกว่า |
>= <= | bigger or same, smaller or same大于等于、小于等于มากกว่าหรือเท่ากับ, น้อยกว่าหรือเท่ากับ |
BETWEEN 80 AND 90 | from 80 to 90, both included从 80 到 90,两头都算ตั้งแต่ 80 ถึง 90 นับรวมทั้งสองค่า |
IN ('a', 'b') | is one of these是这几个里的一个เป็นหนึ่งในค่าเหล่านี้ |
LIKE 'N%' | starts with N (% = any letters)用 N 开头(% = 任何字母)ขึ้นต้นด้วย N (% = ตัวอักษรอะไรก็ได้) |
IS NULL | this box is empty这一格是空的ช่องนี้ว่าง |
AND means both rules must be true. OR means one rule is enough. AND 是两个条件都要成立。OR 是一个成立就够了。 AND คือต้องจริงทั้งสองเงื่อนไข OR คือจริงข้อเดียวก็พอ
WHERE (a OR b) AND c.
AND 比 OR 强。数据库先算 AND。想换顺序就加括号:
WHERE (a OR b) AND c。
AND แรงกว่า OR ฐานข้อมูลจะคิด AND ก่อน ถ้าอยากได้ลำดับอื่นให้ใส่วงเล็บ:
WHERE (a OR b) AND cUse DESC for biggest first. ASC is smallest first,
and it is the default.
用 DESC 是从大到小。ASC 是从小到大,也是默认的。
ใช้ DESC เพื่อเรียงจากมากไปน้อย ส่วน ASC คือน้อยไปมาก และเป็นค่าเริ่มต้น
Three students live in Lamphun. DISTINCT shows the city name one time only. 有几个学生住在南奔。DISTINCT 让这个城市名只出现一次。 มีนักเรียนหลายคนอยู่ลำพูน DISTINCT ทำให้ชื่อเมืองขึ้นมาแค่ครั้งเดียว
WHERE teacher_id = NULL finds nothing, ever. You must write
WHERE teacher_id IS NULL.
NULL 不是 0。NULL 的意思是"我们不知道"。
WHERE teacher_id = NULL 永远什么都找不到。必须写
WHERE teacher_id IS NULL。
NULL ไม่ใช่ศูนย์ NULL แปลว่า "เราไม่รู้"
WHERE teacher_id = NULL จะไม่เจออะไรเลย ต้องเขียนว่า
WHERE teacher_id IS NULLThese five functions do maths on many rows. They give you one answer. We call them aggregate functions. 这五个函数会把很多行一起算,只给你一个答案。我们叫它们聚合函数。 ฟังก์ชันห้าตัวนี้คิดเลขจากหลายแถวรวมกัน แล้วให้คำตอบเดียว เราเรียกว่า ฟังก์ชันสรุปผล
| Function | What it does |
|---|---|
COUNT(*) | How many rows?一共有几行?มีกี่แถว? |
MAX(score) | The biggest number最大的数字ตัวเลขที่มากที่สุด |
MIN(score) | The smallest number最小的数字ตัวเลขที่น้อยที่สุด |
AVG(score) | The average number平均数ค่าเฉลี่ย |
SUM(score) | All of them added together全部加起来บวกทั้งหมดเข้าด้วยกัน |
Without GROUP BY you get one answer for the whole table. With GROUP BY you get one answer for each city. 不用 GROUP BY,整张表只有一个答案。用了 GROUP BY,每个城市各有一个答案。 ถ้าไม่ใช้ GROUP BY จะได้คำตอบเดียวสำหรับทั้งตาราง ถ้าใช้ GROUP BY จะได้คำตอบของแต่ละเมือง
WHERE filters rows. HAVING filters groups, after the counting is done. WHERE 筛的是行。HAVING 筛的是组,在算完之后才筛。 WHERE กรองแถว ส่วน HAVING กรองกลุ่ม หลังจากนับเสร็จแล้ว
MAX() inside
WHERE. WHERE runs before the maths. Use HAVING, or ask
a second question first.
常见错误。MAX() 不能写在 WHERE 里面。
WHERE 是在算数之前跑的。要用 HAVING,或者先问一个问题。
ข้อผิดพลาดที่พบบ่อย ใส่ MAX() ใน WHERE ไม่ได้
เพราะ WHERE ทำงานก่อนการคิดเลข ให้ใช้ HAVING หรือถามอีกคำถามก่อนOur students table has a column teacher_id.
It holds a number, not a name. The name lives in the teachers table.
JOIN puts them together.
我们的 students 表有一列叫 teacher_id。
里面放的是号码,不是名字。名字在 teachers 表里。JOIN 把它们合起来。
ตาราง students ของเรามีคอลัมน์ teacher_id
ข้างในเก็บตัวเลข ไม่ใช่ชื่อ ส่วนชื่ออยู่ในตาราง teachers JOIN เอาสองอย่างนี้มารวมกัน
You tell the database which columns match. That is the ON part.
你要告诉数据库哪两列是对得上的。那就是 ON 的部分。
คุณต้องบอกฐานข้อมูลว่าคอลัมน์ไหนตรงกับคอลัมน์ไหน นั่นคือส่วน ON
Long table names are slow to type. Give each table a short name instead.
Here s means students and t means teachers.
表名太长,打起来很慢。可以给每张表起一个短名字。
这里 s 就是 students,t 就是 teachers。
ชื่อตารางยาว ๆ พิมพ์ช้า ตั้งชื่อสั้น ๆ ให้แต่ละตารางแทนได้
ตรงนี้ s คือ students และ t คือ teachers
Kwan has no teacher. Her teacher_id is NULL.
A normal JOIN drops her. A LEFT JOIN keeps her and writes NULL for the teacher.
Kwan 还没有老师,她的 teacher_id 是 NULL。
普通的 JOIN 会把她丢掉。LEFT JOIN 会留下她,老师那一栏写 NULL。
Kwan ยังไม่มีครู teacher_id ของเธอเป็น NULL
JOIN ธรรมดาจะตัดเธอทิ้ง แต่ LEFT JOIN จะเก็บเธอไว้ และใส่ NULL ตรงช่องครู
UPDATE changes rows that are already in the table.
SET says what the new value is.
UPDATE 是改已经在表里的行。SET 说明新的值是什么。
UPDATE ใช้แก้แถวที่มีอยู่ในตารางแล้ว SET บอกว่าค่าใหม่คืออะไร
You can change two columns at the same time. 可以同时改两列。 แก้สองคอลัมน์พร้อมกันได้
WHERE, the command hits every row.
DELETE FROM students; empties the table. UPDATE students SET score = 0;
makes every score zero. The database does not ask you first. It just does it.
SQL 里最危险的错误。如果忘了写 WHERE,命令会打到每一行。
DELETE FROM students; 会把整张表清空。UPDATE students SET score = 0;
会把所有分数变成 0。数据库不会先问你,它直接就做。
ข้อผิดพลาดที่อันตรายที่สุดใน SQL ถ้าลืม WHERE
คำสั่งจะไปโดนทุกแถว DELETE FROM students; จะล้างตารางจนหมด
UPDATE students SET score = 0; จะทำให้ทุกคะแนนเป็นศูนย์
ฐานข้อมูลไม่ถามก่อน มันทำเลยWHERE as a SELECT first.
Look at the rows. Are those the right rows?
Then change the SELECT into an UPDATE or a DELETE.
一个安全的习惯。先把你的 WHERE 写成 SELECT 跑一次,
看看是哪些行。如果行没错,再把 SELECT 改成 UPDATE 或 DELETE。
นิสัยที่ปลอดภัย ลองเขียน WHERE ของคุณเป็น SELECT ก่อน
แล้วดูว่าได้แถวไหนบ้าง ถ้าใช่แถวที่ต้องการ ค่อยเปลี่ยน SELECT เป็น UPDATE หรือ DELETEThis is a real database. It lives in your browser. Type SQL and press Run. Nothing leaves your computer. If you break the data, press Reset data and it comes back. 这是一个真的数据库,就在你的浏览器里。打好 SQL 再按 Run。 什么都不会离开你的电脑。资料弄坏了就按 Reset data,它就回来了。 นี่คือฐานข้อมูลจริง อยู่ในเบราว์เซอร์ของคุณ พิมพ์ SQL แล้วกด Run ไม่มีอะไรออกไปจากเครื่องคุณ ถ้าทำข้อมูลพัง กด Reset data แล้วมันจะกลับมา
Click an exercise. Write your SQL in the box above. Press ✓ Check my answer. There is more than one right answer. The page looks at your result. It does not look at your words. 点一道题。在上面的框里写 SQL。按 ✓ Check my answer。 正确答案不止一个 — 这一页看的是你的结果,不是你写的字。 คลิกเลือกข้อหนึ่ง เขียน SQL ในกล่องด้านบน แล้วกด ✓ Check my answer คำตอบที่ถูกมีได้หลายแบบ — หน้านี้ดูที่ผลลัพธ์ของคุณ ไม่ได้ดูที่ตัวหนังสือ
| Message | What it means |
|---|---|
command not found | PostgreSQL is not installed, or the path is wrong.PostgreSQL 没装,或者路径不对。ยังไม่ได้ติดตั้ง PostgreSQL หรือ path ไม่ถูก |
connection to server failed | The server is not running.服务器没有在跑。เซิร์ฟเวอร์ไม่ได้ทำงานอยู่ |
role does not exist | You have no database user account.你还没有数据库的用户帐号。คุณยังไม่มีบัญชีผู้ใช้ของฐานข้อมูล |
permission denied | You are not allowed to do this.你没有权限做这件事。คุณไม่มีสิทธิ์ทำสิ่งนี้ |
relation does not exist | That table name is wrong, or the table is gone.表名写错了,或者表已经没了。ชื่อตารางผิด หรือตารางหายไปแล้ว |
| The mistake | How to fix it |
|---|---|
Double quotes around text: "Nok"文字用了双引号:"Nok"ใส่ " " รอบข้อความ: "Nok" |
Use single quotes: 'Nok'.改用单引号:'Nok'。ใช้ ' ' แทน: 'Nok' |
| Forgetting the semicolon忘了分号ลืมใส่เซมิโคลอน | End every command with ;.每个命令都用 ; 结尾。จบทุกคำสั่งด้วย ; |
Using MAX() inside WHERE在 WHERE 里用 MAX()ใช้ MAX() ใน WHERE |
Use HAVING, or ask a second question first.改用 HAVING,或者先问一个问题。ใช้ HAVING หรือถามอีกคำถามก่อน |
Writing = NULL写成 = NULLเขียนว่า = NULL |
Write IS NULL.要写 IS NULL。ต้องเขียน IS NULL |
UPDATE or DELETE with no WHEREUPDATE 或 DELETE 没写 WHEREUPDATE หรือ DELETE ที่ไม่มี WHERE |
It changed every row. Test with SELECT first.它改掉了每一行。下次先用 SELECT 试。มันเปลี่ยนทุกแถว คราวหน้าลองด้วย SELECT ก่อน |
| Column name not found找不到列名หาชื่อคอลัมน์ไม่เจอ | Check the spelling. Look at the table on the left.检查拼写。看看左边那张表。ตรวจตัวสะกด ดูตารางทางซ้ายมือ |
The console is small on purpose. It knows SELECT, INSERT and UPDATE.
It knows DELETE, CREATE TABLE and DROP TABLE. It knows WHERE, GROUP BY and HAVING.
It knows ORDER BY, LIMIT, JOIN and LEFT JOIN.
It does not know subqueries, transactions, indexes or users.
For those, install real PostgreSQL and use psql.
这个练习台是故意做小的。它会 SELECT、INSERT、UPDATE、DELETE、
CREATE TABLE 和 DROP TABLE,也会 WHERE、GROUP BY、HAVING、ORDER BY、LIMIT、
JOIN 和 LEFT JOIN。它不会子查询、事务、索引和用户管理。
要用那些,就去装真正的 PostgreSQL,用 psql。
แผงฝึกนี้ทำเล็กไว้ตั้งใจ มันรู้จัก SELECT, INSERT, UPDATE, DELETE,
CREATE TABLE และ DROP TABLE รู้จัก WHERE, GROUP BY, HAVING, ORDER BY, LIMIT,
JOIN และ LEFT JOIN แต่ไม่รู้จัก subquery, transaction, index หรือการจัดการผู้ใช้
ถ้าอยากใช้สิ่งเหล่านั้น ให้ติดตั้ง PostgreSQL จริงแล้วใช้ psql
NotebookLM wrote the lesson text on this page. It read 20 pages of the official PostgreSQL 18 manual. Those pages gave us the words, the data types and the rules. They also gave us the psql commands and the error tables. Nothing here was written from memory. 课文、数据类型、规则、psql 命令和错误表,都是 NotebookLM 根据 官方 PostgreSQL 18 手册的 20 个页面生成的 — 包括教程各章、 SELECT / INSERT / CREATE TABLE 参考页、数据类型那一章、约束那一节和 psql 页。 没有一句是凭记忆写的。 เนื้อหาบทเรียน ชนิดข้อมูล กฎต่าง ๆ คำสั่ง psql และตารางข้อผิดพลาด สร้างโดย NotebookLM จาก คู่มือ PostgreSQL 18 ฉบับทางการ 20 หน้า — บททิวทอเรียล หน้าอ้างอิง SELECT / INSERT / CREATE TABLE บทชนิดข้อมูล หัวข้อ constraint และหน้า psql ไม่มีส่วนไหนเขียนจากความจำ