一文轻松学会Mysql数据库:DDL操作库表和DML语句增删改查表数据,全文特别详细,安装MYSQL数据请自行搜索,或者搜索我的头条文章有,,建议收藏+关注。不迷路,用的时候找得到。^_^
学习目标 能够理解数据库的概念 能够安装MySql数据库 能够使用SQL语句操作数据库 能够使用SQL语句操作表结构 能够使用SQL语句进行数据的添加修改和删除的操作 能够使用SQL语句进行条件查询数据 能够使用SQL语句进行排序 能够使用聚合函数 能够使用SQL语句进行分组查询 能够使用SQL语句进行分页查询 第一章-数据库概述 1. 知识点-数据库的介绍没有数据库之前,如果我们要进行数据存储,有几种方式:
- 我们可以使用java集合等方式将数据保存在内存中,但是数据不能持久化保存,断电/程序退出,数据就清除了 我们还可以将数据保存在普通文件中,可以持久化保存,但是查找,增加,修改,删除数据比较麻烦,效率低
所以我们需要一个既可以持久化保存数据又可以方便操作的地方来存储数据,这就是我们接下来要给大家介绍的数据库
2.1 什么是数据库数据库(Database,DB):指长期保存在计算机的存储设备(硬盘)上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合. 还是以文件的方式存在服务器的电脑上的。
说白了就是数据的仓库, 用来保存数据的.
2.2 常见的关系型数据库 MySql :开源免费的数据库,中小型的数据库,已经被Oracle收购了。MySql6.x版本也开始收费。后来Sun公司收购了MySql,而Sun公司又被Oracle收购 Oracle:收费的大型数据库.Oracle公司的产品.Oracle收购SUN公司,收购MySql. DB2:IBM公司的数据库产品,收费的.银行系统中. SQLServer:MS公司.收费的中型的数据库. Sybase:已经淡出历史舞台.提供了一个非常专业数据建模的工具PowerDesigner. SQLite: 嵌入式的小型数据库,应用在手机端. 知识点1:数据库结构数据库管理程序(DBMS)可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。
数据库管理系统、数据库和表的关系如图所示:
小结- 关系型数据库按行存储 一个数据库下可以有多张表,一张表可以有多条记录 一般情况下,一个项目对应一个数据库,一个实体类对应一张表,表中的每一条记录对应一个java对象
- SQL:结构化查询语言,是关系型数据库的操作标准,但是每个数据库又会有其独有的方言 SQL分类:数据增删改–DML数据查询 — DQL数据库表操作–DDL数据控制–DCL
我们把Sql介绍完成了, 那下面就通过DDL操作数据库
2.步骤 创建数据库(掌握) 查看数据库 删除数据库(掌握) 修改数据库 数据库的其它操作(掌握) 3.讲解 3.1创建数据库 语法create database 数据库名 [character set 字符集][collate 校对规则] 注: []意思是可选的意思
字符集(charset):是一套符号和编码。
练习创建一个数据库(默认字符集)
create database web16db;
创建一个day16_2的数据库,指定字符集为gbk(了解)
create database web14_2 character set gbk;
3.2查看所有的数据库 3.2.1查看所有的数据库 语法 show databases;
3.2.2查看数据库的定义结构【了解】 语法 show create database 数据库名;
查看web14_1这个数据库的定义 show create database web14_1;
3.3删除数据库 语法 drop database 数据库名;
删除web14_2数据库 drop database web14_2;
3.4修改数据库【了解】 语法 alter database 数据库名 character set 字符集;
修改web14_1这个数据库的字符集(gbk) alter database web14_1 character set gbk;
注意:
是utf8,不是utf-8 不是修改数据库名 3.5其他操作 切换数据库, 选定哪一个数据库use 数据库名; //注意: 在创建表之前一定要指定数据库. use 数据库名
练习: 使用web14_1 use web14_1;
查看正在使用的数据库 select database();
4.小结 - 创建数据库 create database db_name; 修改数据库 alter database db_name; 删除数据库 drop database db_name; 查看数据库 show databases;
我们第四章已经把数据库的CRUD讲解完了,下面我们就学习创建表
2.步骤 创建表的语法介绍 MySql常见的类型 MySql约束 3.讲解 3.1语法create table 表( 列 类型 [约束], 列 类型 [约束] ... );
3.2 类型 - 整型 一般使用int 或者bigint,偶尔使用tinyint tinyint — byte smallint — short int — int bigint — long unsigned:表示无符号数字,最高位不表示正负zerofill:0填充,设置一个数字的长度,int(4): 存储1:0001tinyint 经常用于表示boolean类型 1表示true 0 表示false 浮点/双精度型 默认的范围 float或者double指定范围 float(M,D) eg: float(4,2) 表达的范围: -99.99~99.99,M表示数字位长度,D表示小数位长度float(5,2):100.01 字符串固定长度 char(n) eg: char(20), 最大能存放20个字符. ‘aaa’, 还是占20个字符的空间可变长度 varchar(n) eg:varchar(20), 最大能存放20个字符. ‘aaa’, 占3个字符的空间 插入数据时 数据需要使用单引号包起来一般使用varchar(n) 节省空间; 如果长度(eg:身份证)是固定的话 可以使用char(n) 性能高一点 关于大文件一般在数据库里面很少存文件的内容, 一般存文件的路径一般不使用二进制存, 使用varchar(n)存文件的路径 日期DATE 只有日期DATETIME 日期和时间 ,一般如果需要设置默认时间, 我们使用TimeStamp数据类型 数值:tinyint int bigint double 字符串:char varchar 时间日期:datetime timestamp
约束种类:
not null: 非空 ; eg: username varchar(40) not null username这个列不能有null值 unique:唯一约束, 后面的数据不能和前面重复; eg: cardNo char(18) unique; cardNo 列里面不可以有重复数据 primary key;主键约束(非空+唯一); 一般用在表的id列上面. 一张表基本上都有id列的, id列作为唯一标识的 auto_increment: ==自动增长,必须是设置了primary key之后,才可以使用auto_increment== id int primary key auto_increment; id不需要我们自己维护了, 插入数据的时候直接插入null, 自动的增长进行填充进去, 避免重复了.注意:
先设置了primary key 再能设置auto_increment
只有当设置了auto_increment 才可以插入null 自己维护 否则插入null会报错
id列:
- 给id设置为int类型, 添加主键约束, 自动增长 或者给id设置为字符串类型,添加主键约束, 不能设置自动增长
CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAr(40) NOT NULL, sex INT);
4.小结 - 语法
create table 表名( 列 类型 【约束】, 列 类型 【约束】);
- 类型数值:int bigint double 偶尔使用tinyint字符:char(n) 固定长度 varchar(n) 可变长度时间:Date DateTime TimeStamp 约束not null 非空unique 唯一primary key 主键(非空+唯一)auto_increment 自动增长 iid可以设置成int类型, 设置成primary key, 添加auto_increment 作为记录唯一标识 注意:
列名:见名识义 多个单词用_拼接列类型:tinyint int bigint double char varchar datetime timestamp列约束: not null:不能为空 primary key:主键,限制表中的每一行都是唯一的,主键所在的列不能为空也不可以重复 unique key:唯一约束 限制当前列可以为null(只能出现一个),但是不能重复 primary key == unique key + not null列属性: auto_increment:自增 用在主键列上,并且该列为整型 zerofill:零填充 用在整型类型列上 unsigned:无符号,最高位不表示正负 1.auto_increment需要和primary key 一起使用 2.unsigned、zerofill不能和primary key一起使用
知识点-查看表【了解】 1.目标 我们把表创建好了, 下面就来介绍查看表
2.步骤 查看当前数据库所有的表 查看表的定义结构 3.讲解 3.1查看所有的表show tables;
3.2查看表的定义结构 语法desc 表名; 练习: 查看student表的定义结构 desc student;
知识点-修改表【掌握】 1.目标 我们表创建好了, 如果要增加一列,要删除一列呢? 那下面就来讲解修改表
2.步骤 增加列 修改列的类型约束 修改列的名称,类型,约束 删除列 修改表名 3.讲解 3.1语法 增加一列;alter table 表 add 字段 类型 约束; 修改列的类型约束; alter table 表 modify 字段 类型 约束 ; 修改列的名称,类型,约束;alter table 表 change 旧列 新列 类型 约束; 删除一列; alter table 表名 drop 列名; 修改表名 ; rename table 旧表名 to 新表名; 3.2练习 给学生表增加一个grade字段alter table student add grade varchar(20) not null;
给学生表的sex字段改成字符串类型 alter table student modify sex varchar(10);
给学生表的grade字段修改成class字段 alter table student change grade class varchar(20);
把class字段删除 alter table student drop class;
把学生表修改成老师表(了解) rename table student to teacher
4.小结 - 修改表都是以alter table tb_name打头 增加列 add 修改列的类型 约束 modify 修改列的名字 类型 约束 change 删除列 drop 修改表名 rename
表创建好了, 我们还可以删除。 掌握表的删除
2.步骤 删除表 3.讲解 语法drop table 表名; 把teacher表删除drop table teacher;
4.小结 - 删除表语法
drop table 表名;
- 创建表create table tb_name(
列名 类型 约束 ,…); 修改表add 、modify 、change 、 drop 、rename 查看表show tables;
desc tb_name;
create table product( pid int primary key auto_increment, //只有设置了auto_increment id列才可以赋值为null pname varchar(40), price double, num int);
知识点-插入记录 1.目标 掌握插入记录 2.步骤 两种方式插入数据 使用命令行操作时候乱码的解决 3.讲解 方式一: 插入指定列, ==如果没有把这个列进行列出来, 以null进行自动赋值了==.eg: 只想插入pname, price , insert into t_product(pname, price) values(‘mac’,18000); insert into 表(列,列..) values(值,值..);
方式二: 插入所有的列注意: 如果没有插入了列设置了非空约束, 会报错的
insert into 表 values(值,值....); eg:insert into product values(null,\\\'苹果电脑\\\',18000.0,10);insert into product values(null,\\\'华为5G手机\\\',30000,20);insert into product values(null,\\\'小米手机\\\',1800,30);insert into product values(null,\\\'iPhonex\\\',8000,10);insert into product values(null,\\\'苹果电脑\\\',8000,100);insert into product values(null,\\\'iPhone7\\\',6000,200);insert into product values(null,\\\'iPhone6s\\\',4000,1000);insert into product values(null,\\\'iPhone6\\\',3500,100);insert into product values(null,\\\'iPhone5s\\\',3000,100);insert into product values(null,\\\'方便面\\\',4.5,1000);insert into product values(null,\\\'咖啡\\\',11,200); insert into product values(null,\\\'矿泉水\\\',3,500);
命令行插入中文数据报错:
关闭服务, net stop MySql 在数据库软件的安装目录下面, 修改配置文件 my.ini中客户端的编码为gbk 重新打开命令行,开启服务, net start MySql 4.小结- 语法
insert into 表名(字段列表) values(值列表)
插入所有的列
insert into 表名 values(值,值,值....)
多行插入
insert into 表名 values(值列表),(值列表),(值列表)...
注意:
插入特定的列没有赋值的列,系统自动赋为null(前提是当前列没有设置not null 约束) 在插入指定列数据时,可以省略不插入的是一些(可以为空的列、设置默认值的列、设置AUTO_INCREMENT的列)。 列名与列值的类型、个数、顺序要一一对应。 值不要超出列定义的长度。eg:password varchar(12) abcd123456789 插入的日期和字符串,使用单引号括起来。 知识点-更新记录 1.目标我们数据插入成功了, 还可以对已有的数据进行更新。
2.步骤 更新数据 3.讲解 3.1语法update 表 set 列 =值, 列 =值 [where 条件]
3.2练习 将所有商品的价格修改为5000元 update product set price = 5000;
将商品名是Mac的价格修改为18000元 UPDATE product set price = 18000 WHERe name = \\\'Mac\\\';
将商品名是Mac的价格修改为17000,数量修改为5 UPDATE product set price = 17000,num = 5 WHERe name = \\\'Mac\\\';
将商品名是方便面的商品的价格在原有基础上增加2元 UPDATE product set price = price+2 WHERe name = \\\'方便面\\\';
4.小结 - 语法
update tb_name set 列1=值1[,列2=值2...] where条件
- 注意实际工作中,where 条件必不可少,不可省略
delete from 表 [where 条件] 注意: 删除数据用delete,不用truncate
类型 删除表中名称为’Mac’的记录
delete from product where pname = \\\'Mac\\\';
删除价格小于5001的商品记录
delete from product where price < 5001;
删除表中的所有记录
delete from product;
3.2truncate truncate table 表;
4.小结 - 删除记录
delete from 表 【where 条件】 注意:实际开发中,where条件一定不能少
- delete 和truncate区别【面试题】 DELETe 删除表中的数据,表结构还在; 删除后的数据可以找回,一条一条的删除.
- 工作里面的删除 物理删除: 真正的删除了, 数据不在, 使用delete就属于物理删除逻辑删除: 没有真正的删除, 数据还在. 搞一个标记, 其实逻辑删除是更新 eg: del_flag 0存在 1删除工作里面一般使用逻辑删除用得多 ALTER TABLE product ADD del_flag TINYINT(4) DEFAULT 0 NOT NULL;
# 逻辑删除UPDATE product SET del_flag=1 WHERe pid=3;
1.目标
我们上面讲解了对数据的增删改, 下面就来重点讲解数据的简单查询.
2.路径 基本查询语法 查询所有的列 查询某张表特定列 去重查询 别名查询 运算查询(+,-,*,/等) 基本条件查询 3.讲解 3.1基本查询语法select [*] [列名 ,列名] [列名 as 别名 ...] [distinct 字段] from 表名 [where 条件]
3.2简单查询 3.2.1 查询所有的列的记录 语法 select * form 表
查询商品表里面的所有的列 select * from product;
3.2.2查询某张表特定列的记录 语法 select 列名,列名,列名... from 表
查询商品名字和价格 select pname, price from product;
3.2.3 去重查询 语法 SELECt DISTINCT 字段名 FROM 表名; //要数据一模一样才能去重
去重查询商品的价格 select distinct price from product;
3.2.4 别名查询 语法注意点: 去重针对某列, distinct前面不能先出现列名
select 列名 as 别名 ,列名 from 表 //列别名 as可以不写select 别名.* from 表 as 别名 //表别名(多表查询, 看主页另外一篇Mysql高级)
查询商品名称和商品价格,商品价格通过别名‘价格’来显示 select pname , price as 价格 from product;
3.2.5运算查询(+,-,*,/等) 把商品名,和商品价格+10查询出来 select pname ,price+10 from product;
运算查询字段,字段之间是可以的 字符串等类型可以做运算查询,但结果没有意义 3.3条件查询 3.3.1语法注意
select ... from 表 where 条件 //取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回
- between…and… 区间查询
eg: where price between 1000 and 3000 相当于 1000<=price<=3000
- in(值,值..)
-- 查询id为1,3,5,7的select * from t_product where id = 1select * from t_product where id = 3select * from t_product where id = 5select * from t_product where id = 7select * from t_product where id in(1,3,5,7)
- like 模糊查询 一般和_或者%一起使用_ 占一位% 占0或者n位
name like \\\'张%\\\' --查询姓张的用户, 名字的字数没有限制name like \\\'张_\\\' --查询姓张的用户 并且名字是两个的字的
- and 多条件同时满足
where 条件1 and 条件2 and 条件3
- or 任意条件满足
where 条件1 or 条件2 or 条件3
3.3.2练习 查询商品价格>3000的商品 select * from product where price > 3000;
查询id=1的商品 select * from product where pid = 1;
查询id<>1的商品 select * from product where pid <> 1;
查询价格在3000到6000之间的商品 select * from product where price between 3000 and 6000;
查询id在1,5,7,15范围内的商品 select * from product where id = 1;select * from product where id = 5;select * from product where id = 7;select * from product where id = 15;select * from product where id in (1,5,7,15);
查询商品名以iPho开头的商品(iPhone系列) select * from product where pname like \\\'iPho%\\\';
查询商品价格大于3000并且数量大于20的商品 (条件 and 条件 and…) select * from product where price > 3000 and num > 20;
查询id=1或者价格小于3000的商品 select * from product where pid = 1 or price < 3000;
4.小结 语法 select [*]|[字段列表] from 表名 [where条件]select * from tb_name;
条件where 条件 between … and … in like _|% 知识点-排序查询 1.目标 能够使用SQL语句进行排序 2.分析 有时候我们需要对查询出来的结果排序显示,那么就可以通过ORDER BY子句将查询出的结果进行排序。排序可以根据一个字段排,也可以根据多个字段排序,排序只是对查询的结果集排序,并不会影响表中数据的顺序。
3.讲解 3.0 环境的准备# 创建学生表(有sid,学生姓名,学生性别,学生年龄,分数列,其中sid为主键自动增长)CREATE TABLE student( sid INT PRIMARY KEY auto_increment, sname VARCHAr(40), sex VARCHAr(10), age INT, score DOUBLE);INSERT INTO student VALUES(null,\\\'zs\\\',\\\'男\\\',18,98.5);INSERT INTO student VALUES(null,\\\'ls\\\',\\\'女\\\',18,96.5);INSERT INTO student VALUES(null,\\\'ww\\\',\\\'男\\\',15,50.5);INSERT INTO student VALUES(null,\\\'zl\\\',\\\'女\\\',20,98.5);INSERT INTO student VALUES(null,\\\'tq\\\',\\\'男\\\',18,60.5);INSERT INTO student VALUES(null,\\\'wb\\\',\\\'男\\\',38,98.5);INSERT INTO student VALUES(null,\\\'小丽\\\',\\\'男\\\',18,100);INSERT INTO student VALUES(null,\\\'小红\\\',\\\'女\\\',28,28);INSERT INTO student VALUES(null,\\\'小强\\\',\\\'男\\\',21,95);
3.1单列排序 - 语法: 只按某一个字段进行排序,单列排序
SELECt 字段名 FROM 表名 [WHERe 条件] ORDER BY 字段名 [ASC|DESC]; //ASC: 升序,默认值; DESC: 降序
- 练习: 以分数降序查询所有的学生
SELECt * FROM student ORDER BY score DESC
3.2组合排序 - 语法: 同时对多个字段进行排序,如果第1个字段相等,则按第2个字段排序,依次类推
SELECt 字段名 FROM 表名 WHERe 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
- 练习: 以分数降序查询所有的学生, 如果分数一致,再以age降序
SELECt * FROM student ORDER BY score DESC, age DESC
4.小结 - 排序的语法
select * from tb_name where条件 order by 排序要使用的列[ASC|DESC [,第二列...]]order by 列 asc/desc, 列 asc/desc;asc: 升序【默认值】desc: 降序
- 应用场景 商城里面 根据价格, 销量, 上架时间, 评论数… 社交里面 根据距离排序排序不改变表中数据的顺序,只是改变查询结果集的显示顺序
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是==纵向查询==,它是对一列的值进行计算,然后返回==一个结果值==。聚合函数会忽略空值NULL
聚合函数用于数学计算统计!
3.讲解 聚合函数 作用 max(列名) 求这一列的最大值 min(列名) 求这一列的最小值 avg(列名) 求这一列的平均值 count(列名) 统计这一列有多少条记录 sum(列名) 对这一列求总和- 语法
SELECt 聚合函数(列名) FROM 表名 [where 条件];
- 练习
-- 求出学生表里面的最高分数SELECt MAX(score) FROM student-- 求出学生表里面的最低分数SELECt MIN(score) FROM student-- 求出学生表里面的分数的总和(忽略null值)SELECt SUM(score) FROM student-- 求出学生表里面的平均分SELECt AVG(score) FROM student-- 统计学生的总人数 (忽略null) SELECt COUNT(sid) FROM studentSELECt COUNT(*) FROM student
注意: 聚合函数会忽略空值NULL
我们发现对于NULL的记录不会统计,建议如果统计个数则不要使用有可能为null的列,但如果需要把NULL也统计进去呢?我们可以通过 IFNULL(列名,默认值) 函数来解决这个问题. 如果列不为空,返回这列的值。如果为NULL,则返回默认值。
4.小结- 语法
select 聚合函数(列) from 表名;
2.聚合函数 用于数学统计:
max() 最大值 min() 最小值 sum() 求和 avg() 平均值 count() 统计数量:求一个表中的记录数,建议使用count(*)3.注意事项
聚合函数会忽略null值的 知识点-分组查询 1.目标 能够使用SQL语句进行分组查询 2.分析分组查询是指使用 GROUP BY语句对查询信息进行分组
GROUP BY怎么分组的? 将分组字段结果中相同内容作为一组,如按性别将学生分成两组
==GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用==
3.讲解 3.1分组- 语法
SELECt 字段1,字段2... FROM 表名 [where 条件] GROUP BY 列 [HAVINg 条件];
- 练习:根据性别分组, 统计每一组学生的总人数
-- 根据性别分组, 统计每一组学生的总人数SELECt sex, count(*) FROM student GROUP BY sex
3.2 分组后筛选 having 练习根据性别分组, 统计每一组学生的总人数> 5的(分组后筛选) SELECt sex, count(*) FROM student GROUP BY sex HAVINg count(*) > 5
4.小结 - 分组语法
select 分组列,分组统计结果 from 表 [where条件] group by 列 [having条件]
- 注意事项根据某一列进行分组, 将分组字段结果中相同内容作为一组; 有几组 返回的记录就有几条单独分组 没有意义, 返回每一组的第一条记录分组的目的一般为了做统计使用, 所以经常和聚合函数一起使用在分组里面, 如果select后面的列没有出现在group by后面 展示这个组的这个列的第一个数据使用分组时,注意要进行查询显示的是分组列和分组统计结果。 where和having的区别【面试】
LIMIT是限制的意思,所以LIMIT的作用就是限制查询记录的条数. 经常用来做分页查询
3.讲解- 语法
select ... from .... limit a ,b.
LIMIT a,b; a:起始行数,从0开始计数,如果省略,默认就是0; a=(当前页码-1)*b; b: 返回的行数 - 练习
eg: 分页查询学生, 每一页查询4条 b=4; a=(当前页码-1)*b;第一页: a=0, b=4;第二页: a=4, b=4;第三页: a=8, b=4;
4.小结 - 语法
limit a,b; a:从第几条数据开始查询, 从0开始计数 【a=(当前页码-1)*b】b: 一页查询的数量【固定的,自定义的】
- 应用场景如果数据库里面的数据量特别大, 我们不建议一次查询出来. 为了提升性能和用户体验, 使用分页
select...from...where...group by...order by...limitselect...from...where...select...from...where...order by...select...from...where...limit...select...from...where...order by...limit
Mysql进阶:多表联合查询,外键约束,多表间关系,连接查询,内连接查询,隐式内连接,事务特性和隔离级别