create database if not exists 数据库名
default character set utfmb4 -- 字符集
default collate utf8mb4_unicode_ci; -- 排序规则
drop database if exists 数据库;
-- 修改数据库的character set:
alter database 数据库 character set utf8mb4;
-- 修改数据库的collate:
alter database 数据库 collate utf8mb4_general_ci;
use 数据库
CREATE TABLE IF NOT EXISTS 数据库.数据表 (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
age INT DEFAULT 18,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
active BOOLEAN DEFAULT TRUE,
salary DECIMAL(10,2) DEFAULT 0.00,
CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES department(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
添加新列:
ALTER TABLE table_name ADD COLUMN column_name column_type;
修改现有列:
ALTER TABLE table_name MODIFY COIUMN column_name new_column_tyoe;
删除列:
ALTER TABLE table_name DROP COLUMN column_name;
修改表名:
ALTER TABLE old_table_name RENAME TO new_table_name;
添加约束条件:
ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint_type(column_name);
- constraint_type有:
- UNIQUE:用于确保列中的所有值都是唯一的。
- NOT NULL:用于确保列中的值不为空。
CHECK:用于定义要求满足的条件。
删除约束条件:
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
添加主键:
ALTER TABLE table_name ADD CONSTRAINT pk_constraint_name PRIMARY KEY(column_name);
删除主键:
ALTER TABLE table_name DROP CONSTRAINT pk_constraint_name;
添加外键:
ALTER TABLE table_name ADD CONSTRAINT fk_constraint_name FOREIGN KEY(column_name) REFERENCES other_table(other_column);
删除外键:
ALTER TABLE table_name DROP CONSTRAINT fk_constraint_name;
完全删除数据表:
DROP TABLE table_name;
仅删除数据表中的数据,保留数据表的结构:
TRUNCATE TABLE table_name;
INSERT INTO table_name(column1, column2, ...) VALUES (value1, value2, ...);
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
DELETE FROM table_name WHERE condition;
SELETE column1, column2, ... FROM table_name WHERE condition;
1.等于(Equal to):
WHERE column = value
2.不等于(Not Equal to):
WHERE column <> value
3.大于(Greater than):
WHERE column > value
4.小于(Less than):
WHERE column < value
5.大于等于(Greater than or equal to):
WHERE column >= value
6.小于等于(Less than or equal to):
WHERE column <= value
7.包含(IN):
WHERE column IN (value1, value2, ...)
8.不包含(NOT IN):
WHERE column NOT IN (value1, value2, ...)
9.模糊匹配(LIKE):
WHERE column LIKE 'pattern'
10.范围(BETWEEN):
WHERE column BETWEEN value1 AND value2
11.空值(IS NULL):
WHERE column IS NULL
12.非空值(IS NOT NULL):
WHERE column IS NOT NULL
以例子演示:表结构如下:
表数据:




SELECT students.student_name, courses.course_name, scores.score
FROM students
INNER JOIN scores ON students.student_id = scores.student_id
INNER JOIN courses ON scores.course_id = courses.course_id;

SELECT courses.course_name, teachers.teacher_name
FROM courses
LEFT JOIN teachers ON courses.teacher_id = teachers.teacher_id;

SELECT student_name as name FROM students
UNION
SELECT teacher_name as name FROM teachers;

SELECT student_name as name FROM students
UNION
SELECT teacher_name as name FROM teachers
UNION
SELECT course_name as name FROM courses;

SELECT teachers.teacher_name, courses.course_name
FROM teachers
RIGHT JOIN courses ON teachers.teacher_id = courses.teacher_id;

SELECT students.student_name, courses.course_name, teachers.teacher_name, scores.score
FROM students
INNER JOIN scores ON students.student_id = scores.student_id
INNER JOIN courses ON scores.course_id = courses.course_id
INNER JOIN teachers ON courses.teacher_id = teachers.teacher_id;

SELECT courses.course_name, AVG(scores.score) as average_score
FROM courses
LEFT JOIN scores ON courses.course_id = scores.course_id
GROUP BY courses.course_name;

SELECT students.student_name, courses.course_name, scores.score
FROM students
INNER JOIN scores ON students.student_id = scores.student_id
INNER JOIN courses ON scores.course_id = courses.course_id
WHERE students.student_name = "John";
SELECT students.student_name, average_score
FROM students
LEFT JOIN (
SELECT student_id,AVG(score) as average_score
FROM scores
GROUP BY student_id
) AS subquery
ON students.student_id = subquery.student_id;

SELECT courses.course_name, teachers.teacher_name, students.student_name, scores.score
FROM courses
LEFT JOIN teachers ON courses.teacher_id = teachers.teacher_id
LEFT JOIN scores ON courses.course_id = scores.course_id
LEFT JOIN students ON scores.student_id = students.student_id;

SELECT s.student_name, c.course_name, COALESCE(sc.course, "No score") as score
FROM student s
CROSS JOIN courses c
LEFT JOIN score sc ON s.student_id = sc.student_id AND c.course_id = sc.course_id;

SELECT name FROM (
SELECT student_name as name FROM students
UNION
SELECT teacher_name as name FROM teachers
) AS combined_names
ORDER BY name ASC;

SELECT teachers.teacher_name, COUNT(courses.course_id) as num_courses_taught
FROM teachers
LEFT JOIN courses ON teachers.teacher_id = courses.teacher_id
GROUP BY teachers.teacher_name
HAVING COUNT(courses.course_id) > 2;

SELECT courses.course_name
FROM courses
LEFT JOIN teachers ON courses.teacher_id = teachers.teacher_id
WHERE teachers.teacher_id IS NULL;

SELECT course_name, student_name, score, ranking
FROM (
SELECT courses.course_name,
students.student_name,
scores.score,
RANK() OVER (PARTITION BY courses.course_id ORDER BY scores.score DESC) AS ranking
FROM courses
INNER JOIN scores ON scores.course_id = courses.course_id
INNER JOIN students ON students.student_id = scores.student_id
) AS ranked_scores
WHERE ranking <= 3;

SELECT name FROM (
SELECT student_name as name FROM students WHERE student_name LIKE 'Smith%'
UNION
SELECT teacher_name as name FROM teachers WHERE teacher_name LIKE 'Smith%'
) AS combined_names;

-- 数学运算
SELECT abs(-10);/*绝对值:0*/
SELECT ceiling(9.4);/*向上取整:10*/
SELECT floor(9.4);/*向下取整:9*/
SELECT rand();/*生成随机数,0~1:0.40571950134422585*/
SELECT sign(122);/*值为0返回0,值为正数返回1,值为负数返回-1:1*/
-- 字符串相关操作
SELECT char_length('123456789');/*获取值的长度:9*/
SELECT concat('a','b','c');/*拼接字符串:abc*/
SELECT insert('1234567',1,2,'a');/*根据位置替换字符串,从第1个位置开始的2个数替换为'a':a34567*/
SELECT lower('Abc');/*小写:abc*/
SELECT upper('Abc');/*大写:ABC*/
SELECT replace('12345678','345','abc');/*根据内容替换字符串,把'345'替换为'abc':12abc678*/
SELECT substr('123456',2,2);/*返回第2个位置开始的2个数:23*/
SELECT instr('1234567','456');/*返回456的第一次的位置,找不到返回0:4*/
SELECT reverse('123456');/*反转:654321*/
-- 日期和时间函数
SELECT current_date();/*获取当前日期:2024-05-31*/
SELECT curdate();/*获取当前日期:2024-05-31*/
SELECT now();/*获取当前时间:2024-05-31 11:28:04*/
SELECT localtime();/*获取当前时间:2024-05-31 11:28:24*/
SELECT sysdate();/*获取当前时间:2024-05-31 11:28:44*/
SELECT year(now());/*获取当前年份:2024*/
SELECT month(now());/*获取当前月份:5*/
SELECT date(now());/*获取当前日期:2024-05-31*/
SELECT hour(now());/*获取当前小时:11*/
SELECT minute(now());/*获取当前分钟:32*/
SELECT second(now());/*获取当前秒数:56*/
-- 聚合函数
USE test;
-- count(...) 对查询到的数据进行统计
SELECT COUNT(1) FROM students;
-- SUM(...) 对查询到的数据进行求和,如果数据不能求和(字符串),返回0
SELECT SUM(scores.score) FROM scores;
-- AVG(...) 对查询到的数据进行求平均值
SELECT AVG(scores.score) FROM scores;
-- MAX(...) 返回查询到的数据的最大值
SELECT MAX(scores.score) FROM scores;
-- MIN(...) 返回查询到的数据的最小值
SELECT MIN(scores.score) FROM scores;