一文轻松学会Mysql:DDL操作库表和DML语句增删改查表数据,全文特别详细,安装MYSQL数据请自行搜索,或者搜索我的头条文章有,,建议收藏+关注。不迷路,用的时候找得到。^_^
能够理解数据库的概念能够安装MySql数据库能够使用SQL语句操作数据库能够使用SQL语句操作表结构能够使用SQL语句进行数据的添加修改和删除的操作能够使用SQL语句进行条件查询数据能够使用SQL语句进行排序能够使用聚合函数能够使用SQL语句进行分组查询能够使用SQL语句进行分页查询
没有数据库之前,如果我们要进行数据存储,有几种方式:
我们可以使用java集合等方式将数据保存在内存中,但是数据不能持久化保存,断电/程序退出,数据就清除了我们还可以将数据保存在普通文件中,可以持久化保存,但是查找,增加,修改,删除数据比较麻烦,效率低
所以我们需要一个既可以持久化保存数据又可以方便操作的地方来存储数据,这就是我们接下来要给大家介绍的数据库
数据库(DataBase,DB):指长期保存在计算机的存储设备(硬盘)上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合. 还是以文件的方式存在服务器的电脑上的。
说白了就是数据的仓库, 用来保存数据的.
MySql :开源免费的数据库,中小型的数据库,已经被Oracle收购了。MySql6.x版本也开始收费。后来Sun公司收购了MySql,而Sun公司又被Oracle收购Oracle:收费的大型数据库.Oracle公司的产品.Oracle收购SUN公司,收购MySql.DB2:IBM公司的数据库产品,收费的.银行系统中.SQLServer:MS公司.收费的中型的数据库.SyBase:已经淡出历史舞台.提供了一个非常专业数据建模的工具PowerDesigner.SQLite: 嵌入式的小型数据库,应用在手机端.
数据库管理程序(DBMS)可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。
数据库管理系统、数据库和表的关系如图所示:
关系型数据库按行存储一个数据库下可以有多张表,一张表可以有多条记录一般情况下,一个项目对应一个数据库,一个实体类对应一张表,表中的每一条记录对应一个java对象SQL:Structure Query Language。(结构化查询语言),通过sql操作数据库(操作数据库,操作表,操作数据)SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准各数据库厂商(MySql,oracle,sql server)都支持ISO的SQL标准。各数据库厂商在标准的基础上做了自己的扩展。 各个数据库自己特定的语法每条语句以分号结尾(命令行里面需要),如果在navicat,java代码中不是必须加的。SQL在window中不区分大小写,关键字中认为大写和小写是一样的Data Definition Language (DDL数据定义语言) 如:操作数据库,操作表Data Manipulation Language(DML数据操纵语言),如:对表中的记录操作增删改Data Query Language(DQL 数据查询语言),如:对表中的查询操作Data Control Language(DCL 数据控制语言),如:对用户权限的设置SQL:结构化查询语言,是关系型数据库的操作标准,但是每个数据库又会有其独有的方言SQL分类:数据增删改–DML数据查询 — DQL数据库表操作–DDL数据控制–DCL
我们把Sql介绍完成了, 那下面就通过DDL操作数据库
创建数据库(掌握)查看数据库删除数据库(掌握)修改数据库数据库的其它操作(掌握)语法
字符集(charset):是一套符号和编码。
练习
创建一个数据库(默认字符集)
创建一个day16_2的数据库,指定字符集为gbk(了解)
语法语法查看web14_1这个数据库的定义语法删除web14_2数据库语法修改web14_1这个数据库的字符集(gbk)
注意:
是utf8,不是utf-8不是修改数据库名切换数据库, 选定哪一个数据库练习: 使用web14_1查看正在使用的数据库创建数据库 create database db_name;修改数据库 alter database db_name;删除数据库 drop database db_name;查看数据库 show databases;
我们第四章已经把数据库的CRUD讲解完了,下面我们就学习创建表
创建表的语法介绍MySql常见的类型MySql约束整型 一般使用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即规则,规矩 限制;作用:保证用户插入的数据保存到数据库中是符合规范的约束约束关键字主键primary key唯一unique非空not null
约束种类:
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, 自动的增长进行填充进去, 避免重复了.
id列:
给id设置为int类型, 添加主键约束, 自动增长或者给id设置为字符串类型,添加主键约束, 不能设置自动增长创建一张学生表(含有id字段,姓名字段,性别字段. id为主键自动增长)语法类型数值:int bigint double 偶尔使用tinyint字符:char(n) 固定长度 varchar(n) 可变长度时间:Date DateTime TimeStamp约束not null 非空unique 唯一primary key 主键(非空+唯一)auto_increment 自动增长iid可以设置成int类型, 设置成primary key, 添加auto_increment 作为记录唯一标识注意:
我们把表创建好了, 下面就来介绍查看表
查看当前数据库所有的表查看表的定义结构语法desc 表名;练习: 查看student表的定义结构
我们表创建好了, 如果要增加一列,要删除一列呢? 那下面就来讲解修改表
增加列修改列的类型约束修改列的名称,类型,约束删除列修改表名增加一列;alter table 表 add 字段 类型 约束;修改列的类型约束; alter table 表 modify 字段 类型 约束 ;修改列的名称,类型,约束;alter table 表 change 旧列 新列 类型 约束;删除一列; alter table 表名 drop 列名;修改表名 ; rename table 旧表名 to 新表名;给学生表增加一个grade字段给学生表的sex字段改成字符串类型给学生表的grade字段修改成class字段把class字段删除把学生表修改成老师表(了解)修改表都是以alter table tb_name打头增加列 add修改列的类型 约束 modify修改列的名字 类型 约束 change删除列 drop修改表名 rename
表创建好了, 我们还可以删除。 掌握表的删除
删除表语法drop table 表名;把teacher表删除删除表语法创建表create table tb_name(
列名 类型 约束 ,…);修改表add 、modify 、change 、 drop 、rename查看表show tables;
desc tb_name;准备工作: 创建一张商品表(商品id,商品名称,商品价格,商品数量.)掌握插入记录两种方式插入数据使用命令行操作时候乱码的解决方式一: 插入指定列,==如果没有把这个列进行列出来, 以null进行自动赋值了==.eg: 只想插入pname, price , insert into t_product(pname, price) values(‘mac’,18000);方式二: 插入所有的列
命令行插入中文数据报错:
关闭服务, net stop MySql在数据库软件的安装目录下面, 修改配置文件 my.ini中客户端的编码为gbk重新打开命令行,开启服务, net start MySql语法插入特定的列
插入所有的列
多行插入
注意:
插入特定的列没有赋值的列,系统自动赋为null(前提是当前列没有设置not null 约束)在插入指定列数据时,可以省略不插入的是一些(可以为空的列、设置默认值的列、设置AUTO_INCREMENT的列)。列名与列值的类型、个数、顺序要一一对应。值不要超出列定义的长度。eg:password varchar(12) abcd123456789插入的日期和字符串,使用单引号括起来。
我们数据插入成功了, 还可以对已有的数据进行更新。
更新数据将所有商品的价格修改为5000元将商品名是Mac的价格修改为18000元将商品名是Mac的价格修改为17000,数量修改为5将商品名是方便面的商品的价格在原有基础上增加2元语法注意实际工作中,where 条件必不可少,不可省略掌握记录的删除使用delete删除使用truncate删除语法类型
删除表中名称为’Mac’的记录
删除价格小于5001的商品记录
删除表中的所有记录
删除记录delete 和truncate区别【面试题】 DELETE 删除表中的数据,表结构还在; 删除后的数据可以找回,一条一条的删除.TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。删除的数据不能找回。执行速度比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;
我们上面讲解了对数据的增删改, 下面就来重点讲解数据的简单查询.
基本查询语法查询所有的列查询某张表特定列去重查询别名查询运算查询(+,-,*,/等)基本条件查询语法查询商品表里面的所有的列语法查询商品名字和价格语法去重查询商品的价格语法查询商品名称和商品价格,商品价格通过别名‘价格’来显示把商品名,和商品价格+10查询出来运算查询字段,字段之间是可以的字符串等类型可以做运算查询,但结果没有意义between…and… 区间查询in(值,值..)like 模糊查询 一般和_或者%一起使用_ 占一位% 占0或者n位and 多条件同时满足or 任意条件满足查询商品价格>3000的商品查询id=1的商品查询id<>1的商品查询价格在3000到6000之间的商品查询id在1,5,7,15范围内的商品查询商品名以iPho开头的商品(iPhone系列)查询商品价格大于3000并且数量大于20的商品 (条件 and 条件 and…)查询id=1或者价格小于3000的商品语法条件where 条件between … and …inlike _|%能够使用SQL语句进行排序
有时候我们需要对查询出来的结果排序显示,那么就可以通过ORDER BY子句将查询出的结果进行排序。排序可以根据一个字段排,也可以根据多个字段排序,排序只是对查询的结果集排序,并不会影响表中数据的顺序。
语法: 只按某一个字段进行排序,单列排序练习: 以分数降序查询所有的学生语法: 同时对多个字段进行排序,如果第1个字段相等,则按第2个字段排序,依次类推练习: 以分数降序查询所有的学生, 如果分数一致,再以age降序排序的语法应用场景 商城里面 根据价格, 销量, 上架时间, 评论数… 社交里面 根据距离排序排序不改变表中数据的顺序,只是改变查询结果集的显示顺序能够使用聚合函数
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是==纵向查询==,它是对一列的值进行计算,然后返回==一个结果值==。聚合函数会忽略空值NULL
聚合函数用于数学计算统计!
聚合函数作用max(列名)求这一列的最大值min(列名)求这一列的最小值avg(列名)求这一列的平均值count(列名)统计这一列有多少条记录sum(列名)对这一列求总和语法练习
我们发现对于NULL的记录不会统计,建议如果统计个数则不要使用有可能为null的列,但如果需要把NULL也统计进去呢?我们可以通过 IFNULL(列名,默认值) 函数来解决这个问题. 如果列不为空,返回这列的值。如果为NULL,则返回默认值。
语法
2.聚合函数 用于数学统计:
max() 最大值min() 最小值sum() 求和avg() 平均值count() 统计数量:求一个表中的记录数,建议使用count(*)
3.注意事项
聚合函数会忽略null值的能够使用SQL语句进行分组查询
分组查询是指使用 GROUP BY语句对查询信息进行分组
GROUP BY怎么分组的? 将分组字段结果中相同内容作为一组,如按性别将学生分成两组
==GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用==
语法练习:根据性别分组, 统计每一组学生的总人数练习根据性别分组, 统计每一组学生的总人数> 5的(分组后筛选)分组语法注意事项根据某一列进行分组, 将分组字段结果中相同内容作为一组; 有几组 返回的记录就有几条单独分组 没有意义, 返回每一组的第一条记录分组的目的一般为了做统计使用, 所以经常和聚合函数一起使用在分组里面, 如果select后面的列没有出现在group by后面 展示这个组的这个列的第一个数据使用分组时,注意要进行查询显示的是分组列和分组统计结果。where和having的区别【面试】子名作用where 子句1) 对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,即先过滤再分组。2) where后面不可以使用聚合函数having字句1) having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤。2) having后面可以使用聚合函数掌握分页查询
LIMIT是限制的意思,所以LIMIT的作用就是限制查询记录的条数. 经常用来做分页查询
语法LIMIT a,b;a:起始行数,从0开始计数,如果省略,默认就是0; a=(当前页码-1)*b;b: 返回的行数练习语法应用场景如果数据库里面的数据量特别大, 我们不建议一次查询出来. 为了提升性能和用户体验, 使用分页
Mysql进阶:多表联合查询,外键约束,多表间关系,连接查询,内连接查询,隐式内连接,事务特性和隔离级别