MySQL数据库基本操作
一、DDL
概念:是一个数据定义语言
该语言部分包括:
1、对数据库的常用操作
-
创建数据库:
-
1、create database 数据库名 (直接删除)
-
2、create database if not exists 数据库名 (判断数据库是否存在,不存在则创建)
-
3、create database if not exists 数据库名 charset =字符编码 (在2的基础上加上数据库的字符编码)
create database if not exists demo charset =utf8
-
切换数据库:use 数据库名
use demo
-
删除数据库:
1、drop database 数据库 (直接删除)
2、drop database if exists 数据库名(判断是否存在数据库,存在即删除)
drop database if exists demo
-
查看所有数据库
show databases
-
修改数据库编码
ALTER DATABASE 数据库名 CHARSET 字符编码;
ALTER DATABASE demo CHARSET utf8;
ALTER DATABASE 数据库名 character set 字符编码;
alter database newer2 character set utf8
2、对表结构的常用操作
- 创建表:
格式:create table if not exists 表名(
字段名1 字段类型(长度)约束,
字段名2 字段类型(长度)约束,
字段名3 字段类型(长度)约束,
字段名4 字段类型(长度)约束
);
create table if not exists 表名(
字段名1 类型 (长度) 约束条件 comment '字段说明' ,
字段名2 类型 (长度) 约束条件 comment '字段说明' ,
字段名3 类型 (长度) 约束条件 comment '字段说明'
)表的一些设置;
数据类型:
数据类型 | 关键字 |
---|---|
整型 | int integer |
浮点类型 | double, float decimal(6,2)整个小数长5位,小数点不占位,小数是两位(9999.99) |
字符串型 | char:定长,char(2)最长存储2个字符,无论有没有2个字符,都是占2个字符 varchar:可变长度,varchar(10) 最长可以保存10个字符 |
日期类型 | date(2010-10-11) 或time(19:22:22) 、datetime(2010-10-11 19:22:33) |
对表的一些其他操作:
- 查看当前数据库的所有表名称:
show tables;
- 查看表结构:
desc 表格;
- 删除表:
drop table 表名
- 查询表创建语句:
show create table 表名
- 修改表结构
alter table 表名
- 添加列add
alter table 表名 add 字段名 数据类型;
- 修改列数据类型 modify
alter table 表名 modify 字段名 数据类型;
- 修改列名和类型 change
alter table 表名 change 旧字段名 新的字段名 数据类型;
- 删除列
alter table 表名 drop 字段名;
- 修改表名
rename table 旧的表名 to 新的表名;
- 另一种修改表名写法
alter table 旧表名 rename 新表名;
二、DML
定义:指数据操作语言,用来对数据库中表的数据进行记录与更新
插入:insert
-- 插入全部字段
-- 写数据的时候,有多少列就有多少值
insert into 表名 values(列1的值,列2的值,……);
-- 只插入表中几列的值,其它列不写值
insert into 表名 (列名1,列名3)values(列1的值,列3的值);
insert into 表名 values
(列1的值,列2的值,……),
(列1的值,列2的值,……),
(列1的值,列2的值,……),
(列1的值,列2的值,……),
(列1的值,列2的值,……);
删除:delete
delete from 表名 where 条件; -- 带条件删除
delete from 表名 ; -- 删除整个表数据
truncate table 表名; -- 删除整个表数据
truncate 表名; -- 删除整个表数据
更新:update
update 表名 set 字段名=值,字段名=值,字段名=值.....;-- 修改整个表名
update 表名 set 字段名=值,字段名=值,字段名=值.....where 条件; -- 指定修改
三:约束
概念:实际上就是表中数据的限制条件
作用:表在设计的时候加入约束的目的,就是为了保证表中的记录完整性和有效性
约束分类:
主键约束(primary key) PK
概念:
- MySQL主键约束是一个列或多个列的组合,其值能唯一的标识表中的每一行,方便在RDBMS中尽快的找到某一个行。
- 主键约束相当于唯一约束+非空约束的组合,主键约束的列不允许重复,也不允许出现空值
- 每个表最多允许一个主键
- 主键约束的关键字:primary key
- 当创建主键的约束的时候,系统会默认在所在的列和列组合上建立对应的唯一索引
操作:
-
添加单列主键
定义完字段之后指定主键:
create table 表名( 字段1 类型(长度) 约束, ..., constraint 约束名 primary key (字段名) );
在定义字段的同时指定主键:
create table 表名( 字段1 类型(长度) primary key );
-
添加多列的联合主键
就是这个主键是由一张表中多个字段组成
注意:当主键是由多个字段组成时,不能直接在字段名后面声明主键约束;
一张表只能有一个主键,联合主键也是一个主键。
create table 表名( ... primary key(字段1,字段2,字段3...) );
-
删除主键
alter table 表名 drop primary key;
-
创建表完成之后,添加主键
alter table 表名 add primary key(字段名);
自增长约束(auto_increment)
概念:
在MySQL中,当主键定义为自增长后,这个主键的值就不需要用户输入数据了,而是由数据库系统根据定义自动赋值,每增加一条记录,主键就会自动以相同的步长进行增长,通过给字段添加auto_increment属性来实现主键自增长
create table 表名(
字段1 类型(长度) 约束 auto_increment
)auto_increment=100; -- 从100开始
特点:
-
默认情况下,auto_increment的初始值为1,每增加一条记录就字段值加一;
-
一个表中只能有一个字段使用auto_increment约束,且该字段必须有唯一索引,避免序号重复(主键或主键一部分)
-
自增长约束的字段必须具备not null 属性
-
auto_increment约束的字段只能是整数类型(tinyint,int,BIGINT)等
-
auto_increment约束字段的最大值是被该字段的数据类型约束,如果到达上限,auto_increment约束就会失效
指定自增字段的初始值
alter table 表名 auto_increment=初始值;
非空约束(not null)
概念:非空约束,指字段的值不能为空,对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错
字段名 数据类型 not null;
alter table 表名 modify 字段 类型 not null;
唯一性约束(unique key)
概念:指所有记录中字段的值不能出现重复,例如id字段加上唯一性约束以后,每一条记录的id值都是唯一的,不能重复出现。
字段名 数据类型 unique ;
alter table 表名 add constraint 约束名 unique (指定列);
alter table 表名 drop index (约束名)字段名;-- 删除约束
默认约束(default)
概念:MySQL默认值约束用来指定某列的默认值
字段名 类型 default 默认值;
alter table 表名 modify 列名 类型 default 默认值; -- 可以修改,也可以添加
alter table 表名 modify column 字段名 类型 default null; -- 删除默认约束
外键约束(foreign key) FK
定义:外键约束是表的一个特殊字段,经常和主键约束一起使用,对于两个具有关联关系的表来说,相关字段中主所在表就是主表(父表),外键所在表就是从表(子表)
特点(定义一个外键时,需要遵守的规则):
- 主表必须已经存在于数据库中,或者是当前正在创建的表
- 必须为主表定义主键
- 主键不能包含空值,但是允许在外键中出现空值,也就是说,只要外键的每个非空值出现在指定的主键中,那么这个外键的内容就是正确的
- 在主表的表名后面指定列名或列名的组合,那么这个列或列的组合必须是主表的主键或候选键
- 外键中列的数目必须和主表的主键中的列的数目相同
- 外键中列的数据类型必须和主表的主键中的列的数据类型相同
方式一:在创建表的时候设置外键约束
语法:
constraint 外键名 foreign key 字段名 [,字段名2,...] references 主表名 主键列 [,主键列2,...]
例子:
create database mydb3;
use mydb3;
-- 创建部门表
create table if not exists dept(
deptno varchar(20) primary key , -- 部门号
name varchar(20) -- 部门名字
);
create table if not exists emp(
eid varchar(20) primary key , -- 员工编号
ename varchar(20), -- 员工名字
age int, -- 员工年龄
dept_id varchar(20), -- 员工所属部门
constraint emp_fk foreign key (dept_id) references dept (deptno) -- 外键约束
);
方式二:在创建表之后设置外键约束
语法:alter table <数据表名> add constraint <外键名> foreign key(<列名>) references <主表名> (<列名>);
例子:
alter table emp add constraint emp_fk foreign key (dept_id) references dept (deptno);
删除外键约束:
语法:alter table <表名> drop foreign key <外键约束名>;
例子:alter table emp drop foreign key emp_fk;
四:DQL
基本查询,单表查询
简单语法:
select * from 表名 where 条件;
-- 1.查询所有的商品
SELECT * FROM product;
-- 2查询商品名称和价格
SELECT pname,price FROM product;
-- 3.表别名
SELECT * FROM product AS p WHERE p.pname="美的冰箱";
-- 4.列别名
SELECT pname 商品名,price 价格 FROM product
-- 5.去掉重复值
SELECT DISTINCT price FROM product
-- 查询结果是表达式;将使用商品的价格+10进行显示
SELECT pname,price+10 FROM product;
-- 查询商品名称为“海尔洗衣机”的商品所有信息:
SELECT * FROM product WHERE pname="海尔洗衣机";
-- 查询价格为800商品
SELECT * FROM product WHERE price=800;
-- 查询价格不是800的所有商品
SELECT * FROM product WHERE NOT(price=800);
-- 查询商品价格大于60元的所有商品信息
SELECT * FROM product WHERE price>60;
-- 查询商品价格在200到1000之间所有商品
SELECT * FROM product WHERE price>=200 AND price<=1000;
SELECT * FROM product WHERE price BETWEEN 200 AND 1000;
-- 查询商品价格是200或800的所有商品
SELECT * FROM product WHERE price = 200 OR price = 800;
SELECT * FROM product WHERE price IN(200,800);
-- 查询含有‘裤'字的所有商品
SELECT * FROM product WHERE pname LIKE '%裤%' ;
-- 查询以'海'开头的所有商品
SELECT * FROM product WHERE pname LIKE '海%';
-- 查询第二个字为'蔻'的所有商品
SELECT * FROM product WHERE pname LIKE '_蔻%';
-- 查询category_id为null的商品
SELECT * FROM product WHERE category_id IS NULL ;
-- 查询category_id不为null的商品
SELECT * FROM product WHERE category_id IS NOT NULL ;
-- 使用least求最小值
SELECT LEAST(10,20,NULL,40);
-- 使用greatest求最大值
SELECT GREATEST(10,20,40);
复杂语法:
select[all|distinct] 目标列的表达式 别名,目标列的表达式 别名,... from 表名或视图名 别名,表名或视图名 别名
<where 条件表达式>
<group by <别名>> -- 分组查询
<having <条件表达式>> -- 分组之后的条件删选
select * from 表名 order by 列名 [asc|desc]; -- 排序
特点:
asc是升序(默认),desc是降序
order by 用于子句中可以支持单个字段,多个字段,表达式,函数,别名
order by 子句,放在查询语句的最后面,limit子句除外
<limit 数字或者列表> -- 分页
排序查询:
select * from 表名 order by 列名 [asc|desc]; -- 排序
特点:
asc是升序(默认),desc是降序
order by 用于子句中可以支持单个字段,多个字段,表达式,函数,别名
order by 子句,放在查询语句的最后面,limit子句除外
聚合查询:
聚合函数:
- count( ) 统计指定列不为null的记录的行数
- sum( ) 计算指定列的数值和,如果指定的列的类型不是数值类型,那么计算的结果是0
- max( ) 计算指定列的最大值,如果指定的列的类型是字符串类型,那么就使用字符串排序运算
- min( ) 计算指定列的最小值,如果指定的列的类型是字符串类型,那么就使用字符串排序运算
- avg( ) 计算指定列的平均值,如果指定的列的类型不是数值类型,那么计算的结果是0
聚合函数–null值的处理:
-
count函数对null值的处理:如果count函数的参数为*,则统计所有记录的个数,如果参数为字段,则不统计含有null值的记录个数
-
sum和avg函数对null值的处理:这两个函数是没有null值的存在,就好像是该记录不存在
-
max和min函数对null值的处理:这两个函数是没有null值的存在,就好像是该记录不存在
分组查询 (group by) 分组后条件筛选(having)
-
分组之后对统计结果进行筛选的话必须使用having不能使用where
-
where子句用来筛选from子句中指定的操作所产生的行
-
group by 子句用来分组where子句的输出
-
having子句是用来从分组的结果中进行筛选
select * from 表名 group by 分组的字段 having 分组条件;
分页查询:limit
-- 显示前n条
select * from 表名 limit 条数;
-- 分页显示
select * from 表名 limit m,n;
-- m代表整数,表示第几条索引开始,计算方式=((当前页-1)*每页显示条数)
-- n表示查询多少数据,计算方式=(每页的条数*当前页数)
五、多表查询
多表操作:对两个或两个以上的表进行操作
多表之间的关系:MySQL中多表之间的关系可以概括为:一对一,一对多,多对一,多对多
一对一关系:
实现:在任意表中添加唯一外键,指向另一方主键,确保一对一关系(少见,遇见了就合并)
一对多/多对一关系:
例如:部门和员工
一个部门有多个员工,一个员工只能对应一个部门
实现:在多的一方建立外键,指向一的一方的主键
多对多关系:
例如:学生和课程
实现:需要借助第三张中间表,中间表至少包含两个字段,将多对多的关系拆成一对多的关系,中间表至少有两个外键,分别指向原来两个表的主键
多表联合查询
介绍:多表查询就是同时查询两个或两个以上的表,因为有时候用户在查看数据的时候,需要显示的数据来自于多张表
多表查询的分类:
1,交叉连接查询:select * from 表A,表B;
2,内连接查询:关键字(inner join)
隐式内连接:select * from 表a,表b where 条件;
显示内连接:select * from 表A inner join 表B on 条件;(在MySQL中,inner可以省略)
3,外连接查询:关键字(outer join)
- 左外连接:left outer join
- 右外连接:right outer join
- 满外连接:full outer join
4,子连接查询:select的嵌套
5,表的自关联:将一张表当成多张表使用
查询种类 | 特点 | 关键字 | |
---|---|---|---|
全连接 | 交叉连接(笛卡尔积),把两张表的数据进行交叉组合,A*B | 了解 | |
内连接 | 两表的交集部分 | inner join | |
外连接 | 左外连接:取左表的全部数据+左右两表的交集 右外连接:取右表的全部数据+左右两表的交集 | ||
自然连接 | natural join 和内连接有些相似,它会自动去掉相同的字段 取两表的交集数据,并且去掉相同的列 | 了解 | natural join |
自连接 | 需要使用表别名,并且使用一个关键字段进行连接 | join 使用表别名 | |
嵌套连接 | 子查询 查询语句当中再嵌套查询语句 | select中嵌套select |