基本操作
DDL操作(表结构操作)
MySQL安装完成后,要想将数据存储到数据库的表中,首先要创建一个数据库。创 建数据库就是在数据库系统中划分一块空间存储数据,语法如下:
create database 数据库名称;
创建数据库后查看该数据库基本信息MySQL命令:
show create database db1;
删除数据库MySQL命令:
drop database db1;
查询出MySQL中所有的数据库MySQL命令:
show databases;
查看当前使用的数据库 MySQL命令:
select database();
创建数据表
数据库创建成功后可在该数据库中创建数据表(简称为表)存储数据。请注意:在操作数据表之前应使用“USE 数据库名;”指定操作是在哪个数据库中进行先关操作,否则会抛出“No database selected”错误。
语法如下:
create table 表名(
字段1 字段类型,
字段2 字段类型,
…
字段n 字段类型
);
查看数据表
show tables;
修改数据表
有时,希望对表中的某些信息进行修改,例如:修改表名、修改字段名、修改字段 数据类型…等等。在MySQL中使用alter table修改数据表.
e.g:修改表名 MySQL命令:
alter table student rename to stu;
e.g:修改字段名 MySQL命令:
alter table stu change name sname varchar(10);
e.g:修改字段数据类型 MySQL命令:
alter table stu modify sname int;
e.g:增加字段 MySQL命令:
alter table stu add address varchar(50);
e.g:删除字段 MySQL命令:
alter table stu drop address;
删除数据表
drop table 表名;
数据表的约束
约束条件 | 说明 |
PRIMARY KEY | 主键约束用于唯一标识对应的记录 |
FOREIGN KEY | 外键约束 |
NOT NULL | 非空约束 |
UNIQUE | 唯一性约束 |
DEFAULT | 默认值约束,用于设置字段的默认值 |
主键约束
主键约束即primary key用于唯一的标识表中的每一行。被标识为主键的数据在表中是唯一的且其值不能为空。这点类似于我们每个人都有一个身份证号,并且这个身份证号是唯一的。
主键约束基本语法:
字段名 数据类型 primary key;
e.g:
id int primary key,
or:
create table student(
id int
name varchar(20),
primary key(id)
);
非空约束
非空约束即 NOT NULL指的是字段的值不能为空,基本的语法格式如下所示:
字段名 数据类型 NOT NULL;
默认值约束
默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插入默认值;其基本的语法格式如下所示:
字段名 数据类型 DEFAULT 默认值;
唯一性约束
唯一性约束即UNIQUE用于保证数据表中字段的唯一性,即表中字段的值不能重复出现,其基本的语法格式如下所示:
INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);
字段名 数据类型 UNIQUE;
外键约束
物理外键
外键语法
--创建表时指定
create table 表名(
字段名 数据类型,
......
[constraint] [外键名称] foreign key (外键字段名)references 主表(字段名)
);
--建完表后,添加外键
alter table 表名 add constraint 外键名称 foreign key (外键字段名)references 主表(字段名);
DML操作(表数据操作)
插入数据
为表中所有字段插入数据
每个字段与其值是严格一一对应的。也就是说:每个值、值的顺序、值的类型必须与对应的字段相匹配。但是,各字段也无须与其在表中定义的顺序一致,它们只要与 VALUES中值的顺序一致即可。
语法如下:
INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);
为表中指定字段插入数据
语法如下:
INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);
同时插入多条记录
语法如下:
INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;
更新数据
在MySQL通过UPDATE语句更新数据表中的数据。
UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 条件表达式];
UPDATE更新部分数据
update student set age=20,gender='female' where name='tom';
UPDATE更新全部数据
update student set age=18;
删除数据
DELETE FROM 表名 [WHERE 条件表达式];
DELETE删除部分数据
delete from student where age=14;
DELETE删除全部数据
delete from student;
TRUNCATE和DETELE的区别
TRUNCATE和DETELE都能实现删除表中的所有数据的功能,但两者也是有区别的:
- DELETE语句后可跟WHERE子句,可通过指定WHERE子句中的条件表达式只删除满足条件的部分记录;但是,TRUNCATE语句只能用于删除表中的所有记录。
- 使用TRUNCATE语句删除表中的数据后,再次向表中添加记录时自动增加字段的默认初始值重新由1开始;使用DELETE语句删除表中所有记录后,再次向表中添加记录时自动增加字段的值为删除时该字段的最大值加1
- DELETE语句是DML语句,TRUNCATE语句通常被认为是DDL语句
查询数据
查询所有字段
select * from student;
查询指定字段
select sid,sname from student;
常数的查询
select sid,sname,'2021-03-02' from student;
DQL操作
查询数据
基础查询
查询多个字段:select字段1,字段2,字段3 from 表名;
查询所有字段(通配符):select * from 表名;
设置别名:select 字段1[as别名1],字段2[as 别名2] from 表名;
去除重复记录:select distinct 字段列表 from 表名;
条件查询
模糊查询
注意要单引号
查询两个字的员工
两个下划线表示两个字符
select * from tb_emp where name like '__';
查询姓张的员工
select * from tb_emp where name like '张%';
分组查询
统计表格总数
null值不参与所有聚合函数运算
推荐方法:
select count(*) from tb_emp;
统计该企业最早入职的员工-min
select min(entrydate) from tb_emp;
统计该企业最迟入职的员工 - max
select max(entrydate) from tb_emp;
统计该企业员工ID的平均值 - avg
select avg(id) from tb_emp;
计该企业员工的ID之和 - sum
select sum(id) from tb_emp;
分组查询:select 字段列表 from表名[where条件] groupby 分组字段名[having 分组后过滤条件];
e.g:查询入职时间在‘2015-01-01'(包含)以前的员工,并对结果根据职位分组,获取员工数量大于等于2的职位
select job,count(*) from tb_emp where entrydate <= '2015-01-01' group by job having count(*) >= 2;
排序查询
条件查询:select 字段列表 from 表名 [where条件列表][group by 分组字段]order by 字段1 排序方式1,字段2排序方式2..;
排序方式
ASC:升序(默认值)
DESC:降序
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
分页查询
分页查询:select 字段列表 from 表名 limit 起始索引l,查询记录数;
起始索引=(页数-1)*每页数量
e.g:查询第二页的内容,每页5条数据
select * from tb_emp limit 5,5;
查询函数
if函数
if(表达式,tvalue,fvalue):当表达式为true时,取值tvalue;当表达式为false时,取值fvalue
e.g:
select if(gender = 1, '男性员工', '女性员工') '性别', count(*)
from tb_emp
group by gender;
case函数
ase expr when value1 then result1 [when value2 then value2 ...] [else result] end
e.g:
select (case job
when 1 then '班主任'
when 2 then '讲师'
when 3 then '学工主管'
when 4 then '教工主管'
else '未分配职位' end) 职位,
count(*)
from tb_emp
group by job;
多表操作
多表查询
- 内连接:相当于查询A、B交集部分数据
- 外连接:
- 左外连接:查询左表所有数据(包括两张表交集部分数据)
- 右外连接:查询右表所有数据(包括两张表交集部分数据)
内连接(取交集)
隐式内连接:
select 字段列表 from 表1,表2 where 条件 ...;
显式内连接:
select 字段列表 from 表1 [inner]join 表2 on 连接条件..;
外连接
左外连接:
select 字段列表 from 表1 left [outer] join 表2 on 连接条件 ...;
e.g:
A.查询员工表 所有员工的姓名,和对应的部门名称 (左外连接)
select tb_emp.name,td.name
from tb_emp left join tb_dept td on tb_emp.dept_id = td.id;
右外连接:
select 字段列表 from 表1 right [outer] join 表2 on 连接条件 ... ;
e.g:
B.查询部门表所有部门的名称,和对应的员工名称(右外连接)
select tb_emp.name,td.name
from tb_emp right join tb_dept td on tb_emp.dept_id = td.id;
子查询
SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
select * from t1 where column1 = ( select column1 from t2 .. );
子查询外部的语句可以是insert/update/delete/select的任何一个,最常见的是select。
标量子查询
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式
常用的操作符 : = <> > < >= <=
select *
from tb_emp where entrydate > (select entrydate
from tb_emp where name = '方东白');
列子查询
子查询返回的结果是一列(可以是多行)
常用的操作符:in、not in等
select *
from tb_emp where dept_id in (select id
from tb_dept where name = '教研部' or name = '咨询部');
行子查询
子查询返回的结果是一行(可以是多列)
常用的操作符:=、<>、in、not in
select *
from tb_emp
where (entrydate, job) = (select entrydate, job
from tb_emp
where name = '韦一笑');
表子查询
子查询返回的结果是多行多列,常作为临时表
常用的操作符:in
A。查询入职日期是"2006-01-01”之后的员工信息,及其部门名称
a。查询入职日期是"2006-01-01”之后的员工信息
select * from tb_emp where entrydate > '2006-01-01';
b。查询这部分员工信息及其部门名称-tb_dept
select e.* , d.name from (select * from tb_emp where entrydate > '2006-01-01') e , tb_dept d where e.dept_id = d.id
e.g:
询每个分类下最贵的菜品,展示出分类的名称、最贵的菜品的价格
select category.name, max(dish.price)
from dish,
category
where dish.category_id = category.id
group by category.name;
询各个分类下菜品状态为「起售!,并且该分类下菜品总数量大于等于3的分类名称
select c.name, count(*)
from dish d,
category c
where c.id = d.category_id
and d.status = 1
group by c.name
having count(*) >= 3;
注意count聚合函数的条件要加在having后面
询出"商务套餐A”中包含了哪些菜品(展示出套餐名称、价格,包含的菜品名称、价格、份数),
select s.name, s.price, d.name, d.price, sd.copies
from setmeal s,
setmeal_dish sd,
dish d
where s.id = sd.setmeal_id
and d.id = sd.dish_id
and s.name = '商务套餐A';
事务
数据库优化
索引
简单说就是空间换时间,也会影响增删改的效率
语法:
创建索引:
create:[unique]index 索引名 on 表名(字段名...)
查看索引:
show index from 表名;
删除索引:
drop index 索引名 on 表名;
注意事项:
- 主键字段,在建表时,会自动创建主键索引。
- 主键索引是所有索引中性能最高的
- 添加唯一约束时,数据库实际上会添加唯一索引。