MySQL数据库总结
Posted Zeker62
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库总结相关的知识,希望对你有一定的参考价值。
DDL操作数据库、表
操作数据库
查看数据库
show databases;
查询创建数据库mysql的字符集
show create database mysql;
创建数据库
create database db1; -- 创建db1数据库
show create database db1; -- 查看db1数据库的字符集
create database if not exists db2 -- 如果不存在就创建db2,判断操作
create database db3 character set gbk; -- 将字符集设置成gbk编码
show create database db3
create database if not exists db4 character set gbk; -- db4不存在的情况下,创建数据库db4,同时设置编码为gbk
修改数据库
alter database db3 character set utf8; -- 不能写成utf-8
删除数据库
drop database db3;
drop database if exists db4;
使用数据库
select database(); -- 查询当前正在使用的数据库名称
use db1; -- 使用数据库db1
操作表
查询表(use、show)
use db1;
show tables; -- 显示当前数据库的所有表的名称
desc db1; -- 查询当前表的结构
数据类型
- int 整数类型
- double(a,b) 浮点数类型,浮点数长a,小数点保留到b为
- date 日期类型,只包含年月日 yyyy-MM-dd
- datetime 日期类型,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
- timestamp 时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss。如果不给这个字段赋值,或为null,那么默认使用当前系统的时间
- varchar(a) 字符串类型,最大为a个字符长度
- 详细内容:菜鸟教程-Mysql数据类型
创建表(create)
create table student(
id int,
name varchar(32),
age int,
score double(4,1), -- 100.0
birthday date,
insert_time timestamp
);
复制表(like)
create table stu like student; -- 复制student表
删除数据表(drop table)
drop table stu;
drop table if exists stu;
修改表(alter)
alter table student rename to stu; -- 将student表重命名
show create table stu;
alter table stu character set utf8; -- 修改表的字符集
alter table stu add gender varchar(10); -- 添加名为gender的列
alter table stu change gender sex varchar(20); -- 修改名为gender的列名为sex,并修改数据类型
alter table stu modify sex varchar(10); -- 只改类型,不改名称
alter table stu drop sex; -- 删除表中的sex列
DML 增删改表中数据
添加数据(insert)
insert into stu(id,name,age) values(1,'张无忌',18); -- 将数据插入到表当中
INSERT INTO stu VALUES(1,'Tom',17,99.5,NULL,NULL); -- 省略列名的添加方式
INSERT INTO stu VALUES(3,'Bob',19,88.5,"1993-11-11",NULL); -- 除了数字类型,其他类型都需要用单引号或者双引号引用起来。
删除数据(delete、truncate)
DELETE FROM stu WHERE id=3; -- 删除列名为id,值为3的一行记录
DELETE FROM stu; -- 删除stu表中所有的数据,数据量大的时候开销大,有多少条记录就会执行多少次删除操作。
TRUNCATE TABLE stu; -- 直接删除stu表,然后再创建一个不含数据但结构一样的stu表,数据量大的时候开销小
修改数据(update)
UPDATE stu SET age=22 WHERE id=2; -- 修改id=2的那一行的age属性值
UPDATE stu SET age=18 ,score=100 WHERE id=3; -- 同时修改两个数据
UPDATE stu SET age=20; -- 不加限制条件,则会修改age字段的所有数据都为20
DQL查询表中的记录
基础查询(select、DISTINCT、IFNULL()函数)
select * from stu;
SELECT NAME,age FROM stu; --两列
SELECT DISTINCT age FROM stu; -- distinct 去除重复的结果集
SELECT NAME,math,english,math+english FROM stu; -- 两列数值可以直接相加,如有null参加运算,计算结果都为null
SELECT NAME,IFNULL(math,0),IFNULL(english,0),math+english FROM stu; -- 可以用ifnull 这个函数来进行null值判断,如果为null,那么这个数据就会当成0来计算
SELECT NAME,IFNULL(math,0) AS 数学,IFNULL(english,0) AS 英语,math+english AS 总分 FROM stu; -- 使用as 进行起别名
条件查询(> < = ! & |、between and、or、and、in)
-- 比较运算符
SELECT * FROM stu WHERE math>80;
SELECT * FROM stu WHERE math=80;
SELECT * FROM stu WHERE math>=80;
SELECT * FROM stu WHERE math!=80;
SELECT * FROM stu WHERE math<>80; -- 不等号
-- 逻辑运算符
SELECT * FROM stu WHERE math<=80 && math>90; -- 不推荐
SELECT * FROM stu WHERE math<=80 and math>90;
SELECT * FROM stu WHERE math BETWEEN 80 AND 90; -- 在80和90之间,包括80和90
SELECT * FROM stu WHERE math=80 || math=90;-- 不推荐
SELECT * FROM stu WHERE math=80 OR math=90 OR math=100; -- 或者条件
SELECT * FROM stu WHERE math IN (80,90,100); -- 或者条件的简写
对null操作(is null、is not null)
-- 对null操作
SELECT * FROM stu WHERE birthday=NULL; -- 不正确,null不能使用比较运算符判断,应该用is
SELECT * FROM stu WHERE birthday IS NULL;
SELECT * FROM stu WHERE birthday IS NOT NULL;
模糊查询(%、_)
SELECT * FROM stu WHERE NAME LIKE '张%'; -- 查询名字第一个字是张
SELECT * FROM stu WHERE NAME LIKE "_无%"; -- 查询名字第二字是无的人
SELECT * FROM stu WHERE NAME LIKE "___"; -- 查询名字是三个字的人
SELECT * FROM stu WHERE NAME LIKE "%无忌%"; -- 查询名字包含无忌的人
排序查询(order by ASC\\DESC)
SELECT * FROM stu ORDER BY math; -- 默认升序 asc
SELECT * FROM stu ORDER BY math ASC;
SELECT * FROM stu ORDER BY math DESC; -- 降序
SELECT * FROM stu ORDER BY math ASC ,english ASC;-- 按照数学成绩排名,数学成绩一样,就按照英语成绩排序,都是升序。当第一个条件值排序一样的时候,才会去判断第二个条件
聚合函数(count()、max()、min()、sum()、avg())
-- 将一列数据作为一个整体,做纵向计算
SELECT COUNT(NAME) FROM stu; -- 计算name列中的属性个数
-- 注意:聚合函数会排除null值,解决方法:
SELECT COUNT(*) FROM stu; -- 使用*计算
SELECT COUNT(id) FROM stu; -- 使用不为空的主键
SELECT COUNT(IFNULL(birthday,0)) FROM stu; -- 把null值替换成0
select max(math),min(math),avg(math) from stu; -- 计算数学成绩的最大值,最小值,以及平均成绩
SELECT SUM(math) FROM stu; -- 计算数学总成绩
SELECT SUM(math,english) FROM stu; -- 报错,不能两个列进行操作
分组查询(group by … having…)
SELECT age,AVG(math) FROM stu GROUP BY age; -- 不同年龄的数学平均分
SELECT age,COUNT(id) FROM stu GROUP BY age; -- 查询不同年龄的人数分别有多少
SELECT age,AVG(math),COUNT(id) FROM stu GROUP BY age;
SELECT age,AVG(math) FROM stu WHERE math<90 GROUP BY age ; -- 查询成绩低于90分的不同年龄段的平均成绩
SELECT age,AVG(math) FROM stu GROUP BY age HAVING age>18 ; -- 分组之后,年龄要大于18
- where 和 having的区别
- 位置不同,where 在分组之前限定,如果不满足结果,则不参与分组。having在分组之后确定,如果不满足结果则不显示出来
- where后面不能跟聚合函数,having后面可以跟聚合函数
分页查询(limit)
SELECT * FROM stu LIMIT 0,2; -- 从0开始查,查三条记录
SELECT * FROM stu LIMIT 2,2; -- 从第3条开始,查两条
-- 【开始的索引】=【当前的页码-1】*【每页显示的条数】
-- 最后一页有多少条显示多少条,不会报错
limit操作是一个MySQL方言,只能在MySQL数据库中用
约束
约束就是对表中数据进行限定,保证数据的正确性,有效性和完整性
分类:
- 主键约束
- 非空约束
- 唯一约束
- 外键约束
非空约束(not null)
某一列的值不能为空
-- 创建表添加非空约束
create table stu(
id int,
name varchar(20) not null -- name为非空
);
ALTER TABLE stu MODIFY NAME VARCHAR(20); -- 取消(删除)非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL; -- 额外添加非空约束
唯一约束(unique)
某一列的值不能重复
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE -- 唯一约束
-- 手机号不能重复
);
唯一约束可以有null值,但是只有一条记录可以有null
-- 删除唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20); -- 不能删除
ALTER TABLE stu DROP INDEX phone_number; -- 正确删除
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE; -- 添加唯一约束,如果此时数据不满足列的unique,就会报错
主键(primary key)
非空且唯一,一张表只能有一个字段为主键
CREATE TABLE stu(
id INT PRIMARY KEY, -- 主键
NAME VARCHAR(20)
);
-- 删除主键
ALTER TABLE stu MODIFY id INT; -- 不起作用
ALTER TABLE stu DROP PRIMARY KEY; -- 正确删除
自动增长(auto_increment)
-- 自动增长,必须是数字类型
CREATE TABLE stu(
id INT PRIMARY KEY AUTO_INCREMENT, -- 给id添加自动增长主键约束
NAME VARCHAR(20)
);
INSERT INTO stu VALUES(NULL,'sss'); -- 此时会读取上一条id的值,并将此时的id为上一个id+1
-- 删除自动增长
ALTER TABLE stu MODIFY id INT; -- 主键并不会被删除
-- 添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
外键约束(FOREIGN KEY … REFERENCES …)
看一段数据:
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30),
age INT,
dep_name VARCHAR(30),
dep_location VARCHAR(30)
);
SHOW TABLES;
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('张三',18,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('李四',20,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('王五',21,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('宋白',18,'销售部','深圳');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('张成',24,'销售部','深圳');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('孙七',23,'销售部','深圳');
id name age dep_name dep_location
------ ------ ------ --------- --------------
1 张三 20 研发部 广州
2 李四 20 研发部 广州
3 王五 21 研发部 广州
4 宋白 18 销售部 深圳
5 张成 24 销售部 深圳
6 孙七 23 销售部 深圳
数据存在冗余,销售部一定在深圳,研发部一定在广州
解决方案,分成两张表,一张写员工,一张写部门
-- 部门表
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
);
-- 员工表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT
);
SHOW TABLES;
DESC employee;
DESC department;
-- 添加两个部门
INSERT INTO department VALUES(NULL,'研发部','广州'),(NULL,'销售部','深圳');
INSERT INTO employee(NAME,age,dep_id) VALUE('张三',20,1);
INSERT INTO employee(NAME,age,dep_id) VALUE('李四',20,1);
INSERT INTO employee(NAME,age,dep_id) VALUE('王五',21,1);
INSERT INTO employee(NAME,age,dep_id) VALUE('宋白',18,2);
INSERT INTO employee(NAME,age,dep_id) VALUE('张成',24,2);
INSERT INTO employee(NAME,age,dep_id) VALUE('孙七',23,2);
SELECT * FROM employee;
SELECT * FROM department;
id name age dep_id
------ ------ ------ --------
1 张三 20 1
2 李四 20 1
3 王五 21 1
4 宋白 18 2
5 张成 24 2
6 孙七 23 2
id dep_name dep_location
------ --------- --------------
1 研发部 广州
2 销售部 深圳
带来问题,两个表不能关联,需要添加外键
-- 部门表
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
);
-- 员工表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT,
CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) -- 外键,dep_id和department表中的id关联了
);
-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;
-- 添加外键
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id);
修改数据库引擎(ENGINE=INNODB)
如果外键不起作用,数据库表的默认引擎为MyISAM,这个引擎不支持外键,需要换成innoDB即可。
解决方法:
- 修改表的引擎
SHOW TABLE STATUS LIKE 'employee'; -- 查看数据表引擎
ALTER TABLE employee ENGINE=INNODB;
- 新建表时直接给值
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
)ENGINE = INNODB; -- 修改引擎
-- 员工表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT,
CONSTRAINT dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id) -- 外键,dep_id和department表中的id关联了
)ENGINE = INNODB; -- 修改引擎
级联操作(ON UPDATE CASCADE)
外键的约束要更改相应的值就特别麻烦。
级联操作可以做到只要更改一处,相关联的就会接着更改
-- 添加外键,设置级联更新
ALTER TABLE employee ADD CONSTRAINT<以上是关于MySQL数据库总结的主要内容,如果未能解决你的问题,请参考以下文章