一.建立一个数据库
CREATE DATABASE 库名
-- 用于建立一个数据库
效果
二.建立一个数据表
标准语句
CREATE TABLE 表名 (
列名1 数据类型1 [约束条件1],
列名2 数据类型2 [约束条件2],
...
列名N 数据类型N [约束条件N]
)
表名:你想要创建的表的名称。
列名:表中列的名称。
数据类型:指定列可以存储的数据类型,如INT, VARCHAR, DATE等。
约束条件:可选,用于定义列的特定规则,如NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK等。
例如,创建一个名为employees的表,包含id, first_name, last_name, email,hire_date和sex列,可以使用以下SQL语句:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
hire_date DATE,
sex CHAR(2) NULL DEFAULT '男'
);
在这个例子中:
id 列是一个自增的整数,被指定为主键。
first_name 和 last_name 列是长度为50的字符串,且不能为空。
email 列是长度为100的字符串,且必须是唯一的。
hire_date 列是日期类型。
sex设置了默认值为“男”。
注意CREATE TABLE语句的最后一句话不需要加逗号!
运行效果
三.向现有表添加列
使用ADD COLUMN:
ALTER TABLE 表名
ADD COLUMN 新列名 数据类型 [约束条件];
仅使用ADD:
ALTER TABLE 表名
ADD 新列名 数据类型 [约束条件];
在这两种语法中,表名是你想要修改的表的名称,新列名是你想要添加的列的名称,数据类型指定了新列可以存储的数据类型,而约束条件是可选的,用于定义列的特定规则。
例如,向名为employees的表中添加一个名为department的列,数据类型为VARCHAR(100),可以使用以下SQL语句:
ALTER TABLE employees
ADD COLUMN department VARCHAR(100);
或者使用更简洁的语法:
ALTER TABLE employees
ADD department VARCHAR(100);
在这两个例子中,新的department列被添加到了employees表中,允许存储长度最多为100的字符串。
四.向表中删除现有列
在MySQL中,向现有表删除字段(列)的标准语句使用ALTER TABLE命令,结合DROP COLUMN。以下是删除列的语法:
ALTER TABLE 表名
DROP COLUMN 列名;
在这个语法中,表名是你想要修改的表的名称,列名是你想要删除的列的名称。
例如,从名为employees的表中删除名为department的列,可以使用以下SQL语句:
ALTER TABLE employees
DROP COLUMN department;
执行这个语句后,department列将从employees表中被删除,相关的数据也会被移除。
五.修改列属性
在MySQL中,修改现有表中列的属性的标准语句使用ALTER TABLE命令,结合MODIFY COLUMN或CHANGE COLUMN。以下是两种常用的语法:
使用MODIFY COLUMN:
ALTER TABLE 表名
MODIFY COLUMN 列名 新数据类型 [新约束条件];
使用CHANGE COLUMN:
ALTER TABLE 表名
CHANGE COLUMN 旧列名 新列名 新数据类型 [新约束条件];
在这两种语法中,表名是你想要修改的表的名称,列名是你想要修改的列的名称,新数据类型指定了列的新数据类型,而新约束条件是可选的,用于定义列的新规则。
MODIFY COLUMN用于仅修改列的数据类型或约束条件,而不改变列名。
CHANGE COLUMN用于修改列名、数据类型或约束条件。
例如,将名为employees的表中的email列的数据类型从VARCHAR(100)修改为VARCHAR(200),可以使用以下SQL语句:
ALTER TABLE employees
MODIFY COLUMN email VARCHAR(200);
或者,如果你想同时修改列名和数据类型,例如将email列重命名为new_email并修改数据类型为VARCHAR(255),可以使用以下SQL语句:
ALTER TABLE employees
CHANGE COLUMN email new_email VARCHAR(255);
六.向表中插入记录
在MySQL中,向表中插入记录的标准语句使用INSERT INTO命令。以下是插入单条记录的语法:
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES (值1, 值2, 值3, ...);
在这个语法中,表名是你想要插入记录的表的名称,列1, 列2, 列3, ...是你想要插入值的列的名称,而值1, 值2, 值3, ...是对应列的值。
例如,向名为employees的表中插入一条新记录,包含first_name, last_name, email和department列的值,可以使用以下SQL语句:
INSERT INTO employees (first_name, last_name, email, department)
VALUES ('John', 'Doe', 'john.doe@example.com', 'HR');
在这个例子中,first_name列的值是'John',last_name列的值是'Doe',email列的值是'john.doe@example.com',department列的值是'HR'。
如果你想要插入多条记录,可以使用以下语法:
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES
(值1, 值2, 值3, ...),
(值1, 值2, 值3, ...),
...;
例如,插入多条记录到employees表:
INSERT INTO employees (first_name, last_name, email, department)
VALUES
('Jane', 'Smith', 'jane.smith@example.com', 'Marketing'),
('Alice', 'Johnson', 'alice.johnson@example.com', 'Sales');
七.更新记录
在MySQL中,更新表中记录的标准语句使用UPDATE命令。以下是更新记录的语法:
UPDATE 表名
SET 列1 = 新值1, 列2 = 新值2, ...
WHERE 条件;
在这个语法中,表名是你想要更新记录的表的名称,列1 = 新值1, 列2 = 新值2, ...指定了你想要更新的列和新值,而WHERE 条件是一个可选子句,用于指定哪些记录需要被更新。如果没有指定WHERE子句,那么表中的所有记录都会被更新。
例如,更新名为employees的表中first_name为'John'的记录,将其department列的值更新为'Finance',可以使用以下SQL语句:
UPDATE employees
SET department = 'Finance'
WHERE first_name = 'John';
在这个例子中,只有first_name为'John'的记录的department列会被更新为'Finance'。
如果你想要更新多个列的值,可以在SET子句中指定多个列和对应的新值,用逗号分隔:
UPDATE employees
SET department = 'Finance', email = 'john.finance@example.com'
WHERE first_name = 'John';
在这个例子中,first_name为'John'的记录的department和email列都会被更新。
请注意,WHERE子句非常重要,因为它决定了哪些记录会被更新。如果省略了WHERE子句,将会更新表中的所有记录,这可能会导致数据丢失或不一致。因此,在使用UPDATE语句时,务必小心并确保正确指定了WHERE条件。
八.删除记录
在MySQL中,删除表中的记录使用DELETE命令。以下是删除记录的语法:
DELETE FROM 表名
WHERE 条件;
在这个语法中,表名是你想要删除记录的表的名称,而WHERE 条件是一个可选子句,用于指定哪些记录需要被删除。如果没有指定WHERE子句,那么表中的所有记录都会被删除。
例如,删除名为employees的表中department为'HR'的记录,可以使用以下SQL语句:
DELETE FROM employees
WHERE department = 'HR';
在这个例子中,只有department为'HR'的记录会被删除。
如果你想要删除表中的所有记录,可以省略WHERE子句:
DELETE FROM employees;
这将删除employees表中的所有记录,但表结构仍然存在。
九.查询记录(过滤单个记录)
在MySQL中,查询记录使用SELECT命令。以下是基本的查询语法:
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件
ORDER BY 列名 [ASC|DESC];
在这个语法中:
列名1, 列名2, ...是你想要从表中检索的列的名称。如果想要检索所有列,可以使用*代替列名。
FROM 表名指定你想要查询的表。
WHERE 条件是一个可选子句,用于指定查询结果应满足的条件。
ORDER BY 列名 [ASC|DESC]也是一个可选子句,用于对查询结果进行排序。ASC表示升序(默认),DESC表示降序。
例如,从名为employees的表中查询所有department为'HR'的员工记录,并按last_name升序排序,可以使用以下SQL语句:
SELECT *
FROM employees
WHERE department = 'HR'
ORDER BY last_name ASC;
在这个例子中,查询将返回employees表中department为'HR'的所有记录,并且这些记录将按照last_name列的值升序排列。
如果你只想查询特定的列,可以指定列名:
SELECT first_name, last_name
FROM employees
WHERE department = 'HR'
ORDER BY last_name ASC;
在这个例子中,查询将只返回first_name和last_name两列的数据。
特殊条件
日期(区间)
SELECT *
FROM employees
WHERE hire_date BETWEEN '2024-06-22' and '2024-06-23';
查询hire_date在2024-06-22至2024-06-23的人(均包含)
模糊查询(字符)
SELECT *
FROM employees
WHERE first_name like '%红%';
查询first_name中包含“红”的人
十.统计符合条件的记录
在MySQL中,要统计符合特定条件的记录数量,可以使用COUNT()聚合函数结合WHERE子句。以下是一个基本的查询语法示例:
SELECT COUNT(*)
FROM 表名
WHERE 条件;
在这个语法中:
COUNT(*)用于计算表中满足WHERE子句指定条件的所有记录的数量。
FROM 表名指定你想要查询的表。
WHERE 条件是一个可选子句,用于指定查询结果应满足的条件。
例如,如果你想统计名为employees的表中department为'HR'的员工数量,可以使用以下SQL语句:
SELECT COUNT(*)
FROM employees
WHERE department = 'HR';
在这个例子中,查询将返回employees表中department为'HR'的记录数量。
如果你想要统计特定列中非空值的数量,可以使用COUNT(列名):
SELECT COUNT(last_name)
FROM employees
WHERE department = 'HR';
在这个例子中,查询将返回employees表中department为'HR'的记录中last_name列非空值的数量。
特殊条件
统计表“xscj”中“成绩”的最高分、最低分以及平均分,并按课程号升序排序
SELECT 课程号,MIN(成绩)AS 最低分,MAX(成绩)AS 最高分,AVG(成绩)AS 平均分
FROM xscj
GROUP BY 课程号;
效果
十一.跨表查询
在MySQL中,跨表查询通常通过使用JOIN语句来实现,它允许你从两个或多个表中检索相关联的数据。JOIN操作基于这些表之间的共同字段(通常是外键关系)。以下是几种常见的JOIN类型及其用法:
INNER JOIN:返回两个表中满足连接条件的记录。
SELECT 列名
FROM 表1
INNER JOIN 表2 ON 表1.共同字段 = 表2.共同字段;
例如,如果你有两个表employees和departments,它们通过department_id字段关联,你可以这样查询:
SELECT employees.employee_id, employees.first_name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;
十二.查询记录(过滤分组)
在MySQL中,HAVING子句用于在SELECT语句中对聚合结果进行条件过滤。它通常与GROUP BY子句一起使用,用于指定对分组后的数据进行筛选的条件。HAVING子句与WHERE子句类似,但WHERE用于过滤单个记录,而HAVING用于过滤分组。
以下是HAVING子句的基本用法:
SELECT 列名, 聚合函数(列名)
FROM 表名
GROUP BY 列名
HAVING 条件;
在这个语法中:
列名, 聚合函数(列名)是你想要从表中检索的列和聚合函数的结果。
FROM 表名指定你想要查询的表。
GROUP BY 列名用于将结果集按指定列分组。
HAVING 条件是一个可选子句,用于指定对分组后的结果进行筛选的条件。
例如,假设你有一个名为orders的表,其中包含订单信息,包括customer_id(客户ID)和amount(订单金额)。如果你想找出订单总金额超过1000的客户,可以使用以下SQL语句:
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING total_amount > 1000;
在这个例子中,查询首先按customer_id分组,并计算每个客户的订单总金额(使用SUM(amount))。然后,HAVING子句用于筛选出总金额大于1000的客户。
语法二.
以下为xscj表记录
查询至少选修了两门以上课程的学生学号
SELECT 学号
FROM xscj
GROUP by 学号
HAVING COUNT(课程号)>=2;
SELECT 学号:这部分指定查询结果中要显示的列,即只显示学号这一列。
FROM xscj:指定查询的数据来源,即从xscj表中检索数据。
GROUP BY 学号:这部分将结果按学号进行分组。这意味着所有具有相同学号的记录将被分到同一组中。
HAVING COUNT(课程号)>=2:这是HAVING子句,用于对分组后的结果进行条件筛选。COUNT(课程号)计算每个学生组中选修的课程数量。条件>=2意味着只选择那些至少选修了两门课程的学生。
十三.嵌套查询
嵌套查询,也称为子查询,是在一个查询内部嵌套另一个查询的SQL技术。子查询可以嵌套在SELECT、FROM、WHERE或HAVING子句中,用于提供更复杂的查询逻辑。下面是一些常见的嵌套查询示例和它们的用法:
- 在WHERE子句中使用子查询
SELECT column_name(s)
FROM table_name
WHERE column_name operator
(SELECT column_name
FROM table_name
WHERE condition);
这里是一个具体的例子,展示了如何在WHERE子句中使用嵌套查询:
SELECT 学号, 姓名
FROM 学生表
WHERE 学号 IN
(SELECT 学号
FROM 选课表
WHERE 成绩 > 85);
在这个例子中,外部查询从学生表中选择学号和姓名。WHERE子句中的条件使用了嵌套查询,该查询从选课表中选择那些成绩大于85的学生的学号。外部查询只选择那些学号出现在子查询结果中的学生。
嵌套查询也可以用在FROM子句中,如下所示:
SELECT 学号, 课程数量
FROM (SELECT 学号, COUNT(课程号) AS 课程数量
FROM 选课表
GROUP BY 学号) AS 临时表;
在这个例子中,子查询创建了一个名为临时表的临时结果集,其中包含了每个学生的学号和他们的课程数量。外部查询从这个临时表中选择数据。
嵌套查询还可以用在SELECT子句中,如下所示:
SELECT 学号, 姓名,
(SELECT AVG(成绩)
FROM 选课表
WHERE 选课表.学号 = 学生表.学号) AS 平均成绩
FROM 学生表;
在这个例子中,子查询为每个学生计算平均成绩,并将其作为一个新的列(平均成绩)添加到外部查询的结果中。
嵌套查询是SQL中非常灵活和强大的功能,可以用来构建复杂的数据检索逻辑。通过合理使用子查询,可以有效地处理和分析数据库中的数据。
十四.视图创建
视图是数据库中存储的预定义查询,它允许用户以表的形式查看和操作数据,而不需要直接访问基础表。视图可以简化复杂的查询,提供数据安全性,并允许数据逻辑独立性。创建视图的标准SQL语句如下:
CREATE VIEW 视图名 AS
SELECT 字段1, 字段2, ...
FROM 表名
WHERE 条件;
这里是一个具体的例子,展示了如何创建一个视图:
CREATE VIEW 高成绩学生 AS
SELECT 学号, 姓名, 课程号, 成绩
FROM 选课表
WHERE 成绩 > 85;
在这个例子中,我们创建了一个名为高成绩学生的视图,它包含了选课表中成绩大于85的学生的学号、姓名、课程号和成绩。一旦视图被创建,你可以像查询普通表一样查询这个视图:
SELECT * FROM 高成绩学生;
这将返回所有成绩大于85的学生的详细信息。
视图可以包含多个表的数据,也可以包含聚合函数、计算列等。例如,如果你想创建一个视图来显示每个学生的平均成绩,可以这样做:
CREATE VIEW 学生平均成绩 AS
SELECT 学生表.学号, 学生表.姓名, AVG(选课表.成绩) AS 平均成绩
FROM 学生表
JOIN 选课表 ON 学生表.学号 = 选课表.学号
GROUP BY 学生表.学号, 学生表.姓名;
在这个例子中,视图学生平均成绩包含了每个学生的学号、姓名和他们的平均成绩。
(特殊)向视图中插入记录
INSERT INTO 视图名 (字段1,字段2, ...)
VALUES (值1, 值2, ...);
这里是一个例子,假设有一个简单视图:
INSERT INTO 简单视图 (学号, 姓名)
VALUES (101, '张三');
十五.创建存储过程及调用
在MySQL中,创建存储过程的标准语法如下:
CREATE PROCEDURE procedure_name([IN|OUT|INOUT] parameter_name data_type)
BEGIN
-- SQL statements
END;
CREATE PROCEDURE 是创建存储过程的关键字。
procedure_name 是你给存储过程起的名字。
([IN|OUT|INOUT] parameter_name data_type) 是存储过程的参数列表,可以包含输入参数(IN)、输出参数(OUT)或两者都有(INOUT)。
BEGIN 和 END 之间包含的是存储过程的SQL语句。
例如,创建一个简单的存储过程来获取用户的数量:
CREATE PROCEDURE GetUserCount()
BEGIN
SELECT COUNT(*) FROM users;
END;
调用存储过程的语法如下:
CALL procedure_name([parameter_value]);
CALL 是调用存储过程的关键字。
procedure_name 是要调用的存储过程的名称。
([parameter_value]) 是传递给存储过程的参数值(如果有的话)。
例如,调用上面创建的 GetUserCount 存储过程:
CALL GetUserCount();
这将执行存储过程中的SQL语句,并返回结果。
以下为一个具体的例子,它接受一个用户ID作为输入参数,并返回该用户的详细信息以及该用户的订单数量:
CREATE PROCEDURE GetUserDetailsAndOrderCount(
IN user_id INT,
OUT user_name VARCHAR(255),
OUT user_email VARCHAR(255),
OUT order_count INT
)
BEGIN
SELECT name, email
INTO user_name, user_email
FROM users
WHERE id = user_id;
SELECT COUNT(*)
INTO order_count
FROM orders
WHERE user_id = user_id;
END;
在这个存储过程中:
user_id 是一个输入参数,用于指定要查询的用户。
user_name 和 user_email 是输出参数,用于存储从 users 表中查询到的用户名和电子邮件。
order_count 也是一个输出参数,用于存储从 orders 表中查询到的该用户的订单数量。
接下来,我们调用这个存储过程,并获取结果:
CALL GetUserDetailsAndOrderCount(1, @name, @email, @order_count);
在这个调用中:
1 是传递给 user_id 参数的值,表示我们要查询ID为1的用户的详细信息。
@name, @email, @order_count 是用户定义的变量,用于接收存储过程的输出参数值。
最后,我们可以查询这些变量来查看存储过程的输出结果:
SELECT @name, @email, @order_count;
十六.声明局部变量
在MySQL中,DECLARE 是一个用于声明局部变量、游标或条件处理程序的关键字。这些声明通常在存储过程、函数、触发器或事件中使用。
DECLARE variable_name datatype [DEFAULT value];
例如,声明一个整数变量并设置默认值为10:
DECLARE my_var INT DEFAULT 10;
十七.输出字段
SELECT可用于输出字段,其标准格式为:
SELECT'内容';
例如
SELECT'你好';
这将在控制台输出“你好”两个字
请登录后查看评论内容