1.數據準備
-- 以下語句用于創建 students 表,該表存儲學生的基本信息
-- 定義表名為 students
CREATE TABLE students (-- 定義學生的唯一標識符,類型為整數,作為主鍵,且支持自動遞增student_id INT PRIMARY KEY AUTO_INCREMENT,-- 定義學生的姓名,類型為可變長度字符串,最大長度為 50student_name VARCHAR(50),-- 定義學生的年齡,類型為整數age INT
);-- 以下語句用于創建 courses 表,該表存儲課程的相關信息以及選課的學生信息
-- 定義表名為 courses
CREATE TABLE courses (-- 定義課程的唯一標識符,類型為整數,作為主鍵,且支持自動遞增course_id INT PRIMARY KEY AUTO_INCREMENT,-- 定義課程的名稱,類型為可變長度字符串,最大長度為 50course_name VARCHAR(50),-- 定義選課學生的標識符,類型為整數,用于關聯 students 表中的學生student_id INT,-- 定義外鍵約束,將 student_id 字段關聯到 students 表的 student_id 字段FOREIGN KEY (student_id) REFERENCES students(student_id)
);-- 以下語句用于向 students 表中插入學生的基本信息
-- 插入學生的姓名和年齡數據
INSERT INTO students (student_name, age) VALUES
-- 插入名為 Alice,年齡為 20 的學生信息
('Alice', 20),
-- 插入名為 Bob,年齡為 21 的學生信息
('Bob', 21),
-- 插入名為 Charlie,年齡為 22 的學生信息
('Charlie', 22);-- 以下語句用于向 courses 表中插入課程信息以及選課的學生信息
-- 插入課程名稱和選課學生的標識符
INSERT INTO courses (course_name, student_id) VALUES
-- 插入課程名為 Math,選課學生標識符為 1 的信息
('Math', 1),
-- 插入課程名為 Physics,選課學生標識符為 1 的信息
('Physics', 1),
-- 插入課程名為 Chemistry,選課學生標識符為 2 的信息
('Chemistry', 2),
-- 插入課程名為 Biology,選課學生標識符為 3 的信息
('Biology', 3);
多表查詢
多表查詢用于從多個表中獲取相關的數據。常見的多表查詢類型有內連接(INNER JOIN)、左連接(LEFT JOIN)、右連接(RIGHT JOIN)和全外連接(FULL OUTER JOIN,MySQL 不直接支持,可通過 UNION 模擬)。
1.內連接(INNER JOIN)
內連接返回兩個表中匹配的行。例如,我們要查詢每個學生所選的課程:
SELECT students.student_name, courses.course_name
FROM students
INNER JOIN courses ON students.student_id = courses.student_id;
這個查詢會返回 students 表和 courses 表中 student_id 匹配的行,即每個學生所選的課程信息。
2.左連接(LEFT JOIN)
左連接返回左表中的所有行,以及右表中匹配的行。如果右表中沒有匹配的行,則返回 NULL。例如,我們要查詢所有學生及其所選的課程,如果學生沒有選課,課程信息顯示為 NULL:
SELECT students.student_name, courses.course_name
FROM students
LEFT JOIN courses ON students.student_id = courses.student_id;
3.索引
索引是一種數據結構,用于提高數據庫查詢的速度。在 MySQL 中,常見的索引類型有主鍵索引、唯一索引、普通索引等。
3.1創建索引
以下是創建索引的示例:
1.普通索引
如果你經常根據 students 表的 student_name 字段進行查詢,可以為該字段創建一個普通索引:
CREATE INDEX idx_student_name ON students (student_name);
測試:
mysql> create index cl_na_in on class1(name);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings:
2.唯一索引
如果你希望 courses 表的 course_name 字段的值是唯一的,可以為該字段創建一個唯一索引:
CREATE UNIQUE INDEX idx_course_name ON courses (course_name);
3.查看索引
可以使用以下語句查看表的索引信息:
SHOW INDEX FROM students;
4.刪除索引
如果不再需要某個索引,可以使用以下語句刪除它:
DROP INDEX idx_student_name ON students;
5.查詢測試索引
SELECT * FROM stux.class1 WHERE name = 'zhangsan';
6使用 EXPLAIN 分析查詢語句
在你原本的查詢語句前加上 EXPLAIN 關鍵字,例如,你之前想要查詢 name 為 ‘zhangsan’ 的記錄,可執行如下語句:
EXPLAIN SELECT * FROM stux.class1 WHERE name = 'zhangsan';
執行該語句后,MySQL 會返回一個結果集,其中包含了查詢執行計劃的相關信息
---------------------------------------------
案例實操測試:
mysql> select * from crs;
+------+---------+-------+
| c_id | c_name | st_id |
+------+---------+-------+
| 1 | jsj | 1 |
| 2 | english | 1 |
| 3 | sx | 2 |
| 4 | ty | 3 |
+------+---------+-------+
4 rows in set (0.01 sec)mysql> select * from class1;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | zhangsan | 20 |
| 2 | wanger | 21 |
| 3 | xxw | 25 |
+----+----------+------+
3 rows in set (0.00 sec)mysql> select class1.name,crs.c_name-> from class1-> INNER JOIN crs ON class1.id = crs.st_id;
+----------+---------+
| name | c_name |
+----------+---------+
| zhangsan | jsj |
| zhangsan | english |
| wanger | sx |
| xxw | ty |
+----------+---------+
4 rows in set (0.00 sec)mysql> select class1.name,crs.c_name from class1 LEFT JOIN
crs ON class1.id = crs.st_id;
+----------+---------+
| name | c_name |
+----------+---------+
| zhangsan | jsj |
| zhangsan | english |
| wanger | sx |
| xxw | ty |
+----------+---------+
4 rows in set (0.00 sec)mysql> insert into class1(name,age) values('zhaoyun',98);
Query OK, 1 row affected (0.00 sec)mysql> select class1.name,crs.c_name from class1 LEFT JOIN
crs ON class1.id = crs.st_id;
+----------+---------+
| name | c_name |
+----------+---------+
| zhangsan | jsj |
| zhangsan | english |
| wanger | sx |
| xxw | ty |
| zhaoyun | NULL |
+----------+---------+
5 rows in set (0.00 sec)