目录
前言
MySQL数据库使用SQL(Structured Query Language)作为其查询和操作语言。在MySQL中,SQL主要分为两大类:数据定义语言(DDL)和数据操作语言(DML)
一、数据定义语言(DDL)
数据定义语言有create、alter、drop。
-
1.1 create
1.1.1创建数据库
语法格式:
create {database} [if not exists] 数据库名 [选项];
说明:
- []中内容可选项
- [if not exists] 子句是可选的,如果指定,当数据库已经存在时,数据库管理系统将不会报错,而是简单地忽略该命令。
- [选项]指的是一组可选的参数,这些参数可以用来定义数据库或模式的特定属性
--示例
--创建test数据库
create database test;
--创建course数据库(如果 course 数据库不存在,那么它将被创建;如果已经存在,则不做任何操作,避免报错)
create database if not exists course;
--创建数据库schoolInfo(如果 schoolInfo 数据库不存在,那么它将被创建;指定数据库默认的字符集为 utf8;指定默认的排序规则为 utf8_bin)
create database if not exists 'schoolInfo' default character set utf8 collate utf8_bin;
1.1.2 创建表
语法:
create table 表名(
字段名1 数据类型 [约束条件]
字段名2 数据类型 [约束条件]
······
[其它约束条件],
[其它约束条件],
)(其它选项);
- 数据类型:如char、varchar、int、date等
- 约束条件:对字段进行约束,有主键约束(Primary Key)、外键约束(Foreign Key)、非空约束(Not Null)、默认约束(Default)、唯一约束(Unique)等
- 其它选项:如存储引擎、字符集、索引等
例:创建一个teacherInfo表,表结构如下:
字段名 | 字段描述 | 数据类型 | 主键 | 外键 | 非空 | 唯一 | 自增 |
id | 编号 | int(4) | 是 | 否 | 是 | 是 | 是 |
num | 教工号 | int(10) | 否 | 否 | 是 | 是 | 否 |
name | 姓名 | varchar(20) | 否 | 否 | 是 | 否 | 否 |
sex | 性别 | varchar(4) | 否 | 否 | 是 | 否 | 否 |
birthday | 出生日期 | datetime | 否 | 否 | 否 | 否 | 否 |
address | 家庭住址 | varcher(50) | 否 | 否 | 否 | 否 | 否 |
CREATE TABLE teacherInfo(
`id` INT(4) NOT NULL UNIQUE AUTO_INCREMENT COMMENT '编号', -- 整数类型的字段,长度为4位数字,不允许为空(NOT NULL),值是唯一的(UNIQUE),自动递增(AUTO_INCREMENT),用于标识每条记录的唯一编号。
`num` INT(10) NOT NULL UNIQUE COMMENT '', -- 整数类型的字段,长度为10位数字,不允许为空,值是唯一的,可能用于存储教工号唯一标识。
`name` VARCHAR(20) COLLATE utf8_bin NOT NULL COMMENT '姓名', -- 最大长度为20字符的字符串字段,使用 utf8_bin 排序规则,不允许为空,用于存储教师的姓名。
`sex` VARCHAR(4) COLLATE utf8_bin NOT NULL COMMENT '性别', -- 最大长度为4字符的字符串字段,使用 utf8_bin 排序规则,不允许为空,用于存储性别信息。
`birthday` DATETIME COMMENT '出生日期', -- 日期时间类型的字段,用于存储教师的出生日期。
`address` VARCHAR(50) COLLATE utf8_bin COMMENT '地址', -- 最大长度为50字符的字符串字段,使用 utf8_bin 排序规则,用于存储教师的家庭住址。
PRIMARY KEY(`id`) -- 将 `id` 字段设置为主键,确保每条记录的 `id` 值都是唯一的。
) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin; -- 使用 InnoDB 存储引擎,设置默认字符集为 utf8 和默认排序规则为 utf8_bin。
1.2 alter
1. 2.1修改数据库
语法格式:
alter {database} [database_name]
[default] character set [=] character_set_name |
[default] collate [=] collation_name;
- 说明:
- database_name:要修改的数据库的名称。
- character set:指定数据库默认字符集。
- collate:指定数据库默认排序规则。
--示例
--修改数据库schoolInfo的字符集为utf8mb4
alter database schoolInfo default character set utf8mb4
1.2.2修改表
1. 添加字段
alter table 表名 add (字段 字段类型) ;
--示例 --在teacherInfo表中增加名为wages的字段,数据类型为FLOAT alter table `teacherInfo` add column `wages` float; --在student表中增加名为phone的字段 alter table `student` add column `phone` float;
2. 修改字段名
alter table 表名 change 旧字段名 新字段名 新数据类型;
--示例 --将teacherInfo表中的num字段改名为t_id alter table `teacherInfo` change `num` `t_id` int(10) not null; --将Grade表中的grade字段改名为score alter table `Grade` change `grade` `score` varchar(4) ;
3.删除字段
alter table 表名 drop (字段);
--示例 --将teacherInfo表的address字段删除 alter table `teacherInfo` drop column `address`; --将student表的address字段删除 alter table `Student` drop column `address`;
4.删除外键约束
alter table ‘表名’ drop foreign 表名_fk;
--示例 --删除worker表的外键约束 alter table `worker` drop foreign key worker_fk; --删除student表的外键约束 alter table `GradeInfo` drop foreign key grade_fk;
5.更改表储存引擎类型
alter table ‘表名’ engine = ‘引擎类型’;
--示例 --将teacherInfo Info表的存储引擎更改为MyISAM类型 alter table `teacherInfo Info` engine = MyISAM; --将grade表的存储引擎更改为MyISAM类型 alter table `Grade` engine = MyISAM;
6.更改表名
alter table ‘旧表名’ rename ‘新表名’;
--示例 --将teacherInfo表改名为teacherInfo Info alter table `teacherInfo` rename `teacherInfo Info`; --将grade表改名为gradeInfo alter table `Grade` rename `GradeInfo`;
7.改变字段位置
alter table modify column `字段` datetime after `字段·;
--示例 --将birthday 字段的位置改到sex字段的后面 alter table teacherInfo modify column `birthday` datetime after `name`; --将s_num字段的位置改到course字段的后面 alter table modify column `s_num` datetime after `course`;
8.更改字段的数据类型
alter table `表名` modify column `字段` 数据类型;
--示例 --将grade表的course字段的数据类型改为VARCHAR(20) alter table `Grade` modify column `course` varchar(20) not null; --将teacherInfo表的name字段的数据类型改为VARCHAR(30) alter table `teacherInfo` modify column `name` varchar(30) not null;
1.3 drop
1.3.1删除数据库
语法:
drop {dadtabase} [if exists] database_name;
说明:
[if exists]
:这是一个可选的子句,用来检查数据库是否存在。如果指定了IF EXISTS
,当数据库不存在时,数据库管理系统不会报错,而是简单地忽略该命令
--示例
--删除名为schoolinfo的数据库,如果它存在的话:
drop database if exists schoolinfo;
1.3. 2删除表
drop table [if exists] ’表名’;
--示例
--删除student表
drop table `student`;
--删除department表(表中包含外键worker_fk,则先删除外键)
alter table `worker` drop foreign key worker_fk;
drop table `department`;
二、数据操作语言(DML)
数据操作语言包括 insert、delete、update、select,即增、删、改、查
2.1insert
1. 不指定具体的字段,插入数据:insert into 表名 values(`值`,`值`);
--示例
--不指定具体的字段,像food表中插入数据
insert into food values (1,'QQ饼干', 'QQ饼干厂', 2.5, '2008',3,'北京') ;
2. 依次指定表的字段,插入数据:
Insert into 表名(字段,字段) values(`值`,`值`);
--示例
--依次指定food表的字段插入'MN牛奶', 'MN牛奶厂', 3.5, '2009', 1, '河北'
insert into food(foodid,Name,Company, Price, Product_time, Validity_time, address)
values (2,'MN牛奶', 'MN牛奶厂', 3.5, '2009', 1, '河北');
3.同时插入多条记录,插入数据
--示例
--向food表中同时插入多条数据
insert into food values(3,‘e果冻’, 'ee果冻厂', 1.5, '2007', 2, '北京'),
(4,'ff咖啡', 'ff咖啡厂', 20, '2002', 5, '天津'),
(5,'gg奶糖', 'gg奶糖', 14, '2003', 3, '广东');
2.2delete
1. 删除表中数据:delete from 表名 where 字段名=’字段值’;
--示例
--删除teacher表中教工号(num)为1002的记录
delete from teacher where num = 1002;
--删除Food表中厂址为北京的食品的记录
delete from Food where address =’北京’;
2.3update
1.修改数据:update 表名set 字段= ’值’ where 字段 =’值’;
--示例
--将性别(sex)为“男”的记录的家庭住址(address)都变为“北京市朝阳区”
update teacher
set address = '北京市朝阳区'
where sex = '男';
--更新教工号为1003的记录,将生日(birthday)改为“1982-11-08”
update teacher
set birthday = '1982-11-08'
where num = 1003;
2.4select
1. 检索所有列:select *from 表名;
--示例
--查询employee表的所有记录。SQL代码如下:
select * from employee;
2.检索指定列:select 字段名 from 表名;
--示例
--从department表查询部门号(d_id)、部门名称(d_name)和部门职能(function)
select d_id, d_name, function from department;
3. 检索满足条件的行:selest *from 表名 where 字段=’值’;
--示例
--从employee表中查询年龄在25到30之间的员工的信息
--方法一
select * from employee
where age between 25 and 30;
--方法二
select * from employee
where age >= 25 and age <= 30;
--查询employee表的第四条到第五条记录
select id, name, sex, age, d_id, salary, address
from employee limit 3, 2;
4. 使用排序:select * from 表名 order by 字段名 desc; -- 降序排列
--示例
--查询employee表,按照工资从高到低的顺序排列
select * from employee
order by salary desc ;
--查询score表,将计算机成绩按从高到低进行排序
select grade from score
where C_name = '计算机' order by grade desc;
5.使用函数:
Select avg(字段名) from 表名; --- 计算平均值
--示例
--计算score表中,每个考试科目的平均成绩
select C_name,avg(grade) from score
group by C_name;
Select sum(字段名) from 表名; --- 计算总和
--示例
--计算employee表中,每个部门的总工资。先按部门号进行分组,然后用SUM()函数来求和。
select d_id, sum(salary) from employee
group by d_id;
--计算每个学生的总成绩(需显示学生姓名)。代码如下:
select name,sum(grade) from
student left join score on student.num = score.Stu_id
group by num;
6.模糊检索:select * from 表名 where 字段名 like '值%';
--示例
--查询姓张或者姓王的同学的姓名、院系、考试科目和成绩
select name,department,C_name,grade from
student left join score on student.num = score.Stu_id
where name like '张%' or name like '王%';
--查询都是湖南的同学的姓名、年龄、院系、考试科目和成绩
select name,(year(now())-birth)age,department,C_name,grade from
student left join score on student.num = score.Stu_id
where address like '湖南%';
--查询家是北京市员工的姓名、年龄、家庭住址。这里使用LIKE关键字:
select name, age, address from employee
where address like '北京%';
7.使用别名:select (字段名) as 别名 from 表名;
--示例
-- 查询每个部门有多少员工。先按部门号进行分组,然后用COUNT()函数来计算每组的人数, 给COUNT(id)取名为sum.
select d_id, count(id) as sum
from employee
group by d_id;
--student表中查询每个院系有多少人,为统计人数列取别名sum_of_department。
select department,count(department) as sum_of_department
from student
group by department;
8.使用UNION合并查询结果
--示例
--从department表和employee表中查询出部门号,然后使用UNION合并查询结果
select d_id from employee
union
select d_id from department;
--从student表和score表中查询出学生的学号,然后合并查询结果
Select num from student
Union
Select Stu_id from score;
9.通过左连接查询
--示例
--用左连接的方式查询department表和employee表。
使用LEFT JOIN ON来实现左连接
select department.d_id, d_name, function, department.address, id, name, age, sex, salary, employee.address
from department left join employee on employee.d_id = department.d_id;
--用连接查询的方式查询所有学生的信息和考试信息
select num,name,sex,student.birth,department,address,id,Stu_id,C_name,grade
from student left join score on student.num = score.Stu_id;
10.使用关键字
--示例
--使用IN关键字查询计算机系和英语系的学生的信息
select * from student
where num = any(
select Stu_id from score
where department in('计算机系','英语系')
);
--使用OR关键字查询计算机系和英语系的学生的信息
select * from student
where num in(
select Stu_id from score
where department = '计算机系' or department = '英语系'
);
--使用BETWEENAND关键字从employee表中查询年龄在25到30之间的员工的信息
select * from employee
where age between 25 and 30;
--使用AND关键字和比较运算符从employee表中查询年龄在25到30之间的员工的信息
select * from employee
where age >= 25 and age <= 30;
三、总结
- create具有创建数据库和数据表的功能
- alter具有添加字段、删除字段、修改字段类、删除外键约束、更改表储存引擎类型、更改表名、改变字段位置、更改字段的数据类型的功能
- drop具有删除表、删除数据库的功能
- insert具有进行不指定具体的字段插入数据、依次指定表的字段插入数据的作用
- delete具有删除表中数据的作用
- update具有修改数据的功能
- select具有检索所有列、检索指定列、检索满足条件的行、进行模糊检索的作用,查询过程时可对查询出来的结果进行排序,可通过使用UNION合并查询结果,通过左连接查询,使用关键字查询,使用函数查询最大值、平均值等。