推荐学Java——数据表操作

推荐学java 等级 552 0 0
标签:

本文首发在公众号推荐学java,这是原文

说明

上节内容学习了数据库 MySQL 的安装、验证、数据库管理工具、数据库的基本操作命令,还没有学习的同学可以从主页去看上一篇推送内容。

本节内容就学习有关数据库中表的操作,这其中包括 表内表关联 的:创建、列数据类型、数据查询、筛选、删除、添加、修改等等操作,这块内容极为重要,重点不但需要掌握基本的 SQL使用规则,还要掌握一些系统提供的SQL函数。

提示:你可以将sql理解为一种编程语言格式,那么这其中用到的所有标点符号都是英文的,括号都是成对出现的,这种低级错误千万别给自己养成"习惯"。

推荐学Java——数据表操作

表(CRUD)

创建表语法

create table 表名(
列名 列的类型(长度) 列的约束,
列名2 列的类型(长度) 列的约束);

MySQL中列的数据类型

int:和 Java中相同

bigint :等同于Java中的Long.

char:固定长度(长度指的是字符个数),使用不当会导致空间的浪费。

varchar:可变长度(长度指的是字符个数),会根据实际的数据长度动态分配空间。

double:双精度浮点型。

float:单精度浮点型。

boolean

date:短日期,格式:%Y-%m-%d

time:hh:mm:ss

datetime:长日期,格式:%Y-%m-%d %h:%i:%s,默认值是 null. 与之对应的获取时间函数是:now()

timestamp:YYYY-MM-DD hh:mm:ss,默认使用当前时间

text:主要用来存放文本。

blob:全称Binary Large OBject ,二进制大对象,专门用来存储图片、视频、音频等流媒体数据。

clob:全称Character Large OBject ,字符大对象,最多可存储4G的的字符串。比如存储一篇文章、一个说明。超过255个字符的都要采用 clob .

约束

约束的作用
  • 对字段的约束,为了保证表中数据的有效性。
约束分类
  • 主键约束:primary key

    • 单一主键:一个字段做主键
    • 复合主键:多个字段联合做主键(不建议使用)
    • 主键值类型建议
      • int
      • bigint
      • char
      • 不建议使用 varchar ,主键一般都是定长的,整数居多。
    • 自然主键(推荐使用,主键尽量不要和业务数据挂钩)
    • 业务主键(比如用学号做主键,一单业务有变化,主键相关表可能就会有问题)
  • 外键约束:foreign key

    • 一张表中的某个字段在另外一张表中被标记为外键约束。

    • 被标记字段的表称为子表,另外一张表叫父表

    • 删除数据,先删除子表,再删除父表

    • 插入数据,先插入父表,再插入子表

    • 语法格式:

      foreign key(列名) references 父表表名(父表中要被添加的列名);
    • 外键(父表中的列)不一定要是主键,但至少具有 unique 约束;外键可以为Null .

  • 唯一约束:unique 约束的字段不能重复,但可以为 NULL .

    -- 多个列联合约束 这种约束叫做 表级约束
    create table 表名(
    id int not null unique, -- 非空唯一联合约束
    name varchar(50),
    address varchar(255),
    unique(name,address) -- 表级约束
    );

    当一列 同时使用 not nullunique 约束时,该字段自动成为主键字段。(Oracle不是这样的)

  • 非空约束:not null

  • 检查约束:check(Mysql不支持,oracle支持)

举例,创建学生表

  1. 登录MySql

    mysql -uroot -p密码
  2. 进入指定数据库(如果没有数据库,则利用前面的创建数据库语句进行创建)

    use 数据库名字;

这两步是必须的,我们的表都是在库的基础上才有的,所以在创建表之前我们需要选对要使用的数据库。

创建表

通用语法格式:

create table t_student(
    sid int primary key,
    sname varchar(30),
    ssex int default 0, -- default 指定默认值
    sage int
);
  • 表名建议以 t_tbl_ 开头,可读性强。
  • 表名和列名(字段名)都属于标识符。

复制表(了解即可)

create table 表名 as select * from 已存在的表名;

这样原表中的数据也会保留。

查看表

查看当前数据库下所有表:
show tables;
查看表的创建过程
show create table 表名;
查看表结构
desc 表名;

插入数据

通用语法格式:

-- 插入一条记录
insert into 表名(列名1,列名2...) values (对应列名值1,对应列名值2...);
-- 一次插入多条记录
insert into 表名(列名1,列名2...) 
values
(对应列名值1,对应列名值2...),
(对应列名值1,对应列名值2...)
;
  • 列名要一一对应
  • 列的数据类型也要一一对应
  • 列的顺序可以调整
  • 如果插入的某列值为空,则默认给 null 值(创建表设置了默认值的列除外)
插入日期
  • mySQL的日期格式:

    • %Y
    • %m
    • %d
    • %h
    • %m
    • %s
  • str_to_date('日期字符串','日期格式')

    比如数据表中员工的入职日期字段 hiredate 的类型是 date ,现在要新增一名员工,sql如下:

    insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno,`language`)
    values
    (7021,'耶律小乔','前台',7876,str_to_date('2021-12-01','%Y-%m-%d'),3566,0,40,'English');

    如果正好你传入的日期字符串满足格式 %Y-%m-%d 那么可以不用显示地写该函数,MySQL会自动转换。

    该函数的参数日期和格式,只需要满足对应格式就行,如下也是可以成功执行的:

    insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno,`language`)
    values
    (7022,'小乔','客服',7876,str_to_date('12-02-2021','%m-%d-%Y'),2566,50,40,'普通话');
  • date_format(date类型的列名,'日期格式')

    多用在查询时,将 date 类型的结果按照给定的格式展示出来。

    select e.ename, date_format(e.hiredate,'%m-%d-%Y') as hiredate from emp e;

    结果:

    推荐学Java——数据表操作

    同样,如果你的日期都是按照mysql的标准日期格式存入的,那么查询的时候如果没有特殊要求,可以直接查询。

更新记录

// 更新记录
UPDATE 表名
SET 列名1=列1对应的值,列名2=列2对应的值
WHERE 更新的条件
;

修改表中的列、列名、表名

  • 添加列(add)

    alter table 表名 add 列名 列的类型 列的约束
    alter table student add chengji int not null;
  • 修改列(modify)

    alter table 表名 modify 列名 列的类型(长度);
  • 修改列名(change)

    alter table 表名 change 原列名 新列名 列名的类型(长度);
  • 删除列(drop)

    alter table 表名 drop chengji;
  • 修改表名(rename)

    rename table 原表名 to 新表名;
  • 修改表的字符集

    alter table 表名 character set 字符集名称;

删除表中数据

delete from 表名;

表还在,只是数据被清空了。缺点 占用的硬盘空间不会释放;优点 这种删除方式支持回滚。

truncate table 表名;

这种方式适合删除表中的数据比较多(比如上万条或更多)的情况,速度快,不支持回滚,表还在,但无任何数据。

删除表

drop table if exists 表名; -- 如果存在就删除,否则删除一张不存在的表会报错

不会删除表中的数据,只是把表删除了。

表内常用 SQL

1,插入数据

insert into 表名(列名1,列名2,列名3...) values (列名1对应的值,列名2对应的值,列名3对应的值);

批量插入

insert into student values(103,'lunzima',1,18),(104,'houyi',0,20),(105,'hanbin',1,22);

批量插入效率高于单条插入,但是批量插入其中一条如果出错,可能引起同批插入的其他条数据错误。

  • 如果是全列名插入,则可以省略表名后的列名不写,例如下面这样:
insert into student values(100,'yasuo',0,25);
  • 设置了主键的列,插入时要保证主键不重复。

  • 插入中文乱码解决方法

    在 MySql 的安装目录(比如我的是:C:\Program Files\MySQL\MySQL Server 5.5)下,找到my.ini文件,打开后编辑default-character-set=gbk这句代码即可,默认是utf8

然后在命令行重新登录账户,操作即可。

  • 部分列插入时,列名不能省略。

    insert into 表名(要插入的列1,列2...) values(对应列的值...);

2,查询表中记录

select * from 表名;
  • 查看表中指定列的数据
select 列名1,列名2 from 表名;
  • 别名as查询

    select 表名的别名.列名1,表名的别名.列名2 from 表名 as 表名的别名;

    别名as是可以省略的。也可以给列名加别名,像下面这样

    select 表名的别名.列名1 列名1的别名,表名的别名.列名2 列名2的别名 from 表名 表名的别名;
  • 去重查询

    // 查询表中某列数据,并去掉重复值
    select distinct 列名 from 表名;
    // distinct 只能出现在多列的最前面,表示这几列联合去重
    select distinct 列名1, 列名2 from 表名;
  • select 运算查询

    select *,列名*0.85 from 表名;

    这里的运算符可以是+,-,*,/。增加的列也可以添加别名;增加的列仅仅是在查询结果上显示,不会真正改变表中的结构。

  • where后的条件写法

    关系运算符>,>=,<,<=,!=,<>

    select * from 表名 where 列名 关系运算符 限定条件的值;
    // 比如这样
    select * from product where price <> 500;

    其中,!=不是标准的 SQL 语法,<>才是标准的不等于。

    sql中要查询某个null值,要使用 is null ,而不是= null ;相反,要查询不为null,那么使用is not null .

逻辑运算符and,or,no

  // 举例
  select * from product where price > 10 and price < 2000;
  // 上面这句和下面这句等价
  select * from product where price between 11 and 1999;

  select * from product where price = 88 or price = 99;
  • between...and... 语句包含左右两边的值,且只能是左小右大。
  • andor 同时出现,前者优先级高,如果要确定优先级,使用 () 即可。

模糊查询:like

  • _:代表一个字符。

  • %:代表多个字符。

    // 查询商品名字中带有'代码'两个字的所有商品
    select * from product where pname like '%代码%';
    // 查询商品名字中第二个字符是'一'的所有商品
    select * from product where pname like '_一%';
    // 查询商品名字以'电'开头的所有商品
    select * from product where pname like '电%';
    // 查询商品名字中带有下划线的所有商品
    select * from product where pname like '%\_%';

    如果要查询的列名中本身有_,那么要把列名中带有_的所有记录查出来,这个时候需要用到转义符号 \

在某个范围获得值in

  // 查出商品编号为 3 和 5 的所有商品
  select * from product where cno in (3,5);
  // 查询商品编号不为 3 和 5 的所有商品
  select * from product where cno not in(3,5);

in 相当于多个 or ,并不是区间的意思。

  • 排序查询:order by

    最后执行,对select的结果进行操作。

    • asc:升序(默认排序方式)
    • desc:降序
    // 按照某列进行排序
    select * from 表名 order by 列名 desc/asc;
    // 结合 where 条件的结果,在进行排序
    select * from 表名 where 列名 条件运算符 条件值 order by desc/asc;

    如果排序列有相同的值,那么可以指定按照另外列排序,语法格式如下:

    select * from 表名 order by 列名 desc,列名 asc;
  • 聚合函数

    • sum():求和
    • avg():求平均值
    • max():最大值
    • min():最小值
    • count():统计数量
    // 求和
    select sum(要求和的列名) from 表名;
    // 求平均值
    select avg(要求平均值的列名) from 表名;
    // 求最大值
    select max(要求最大值的列名) from 表名;
    // 求最小值
    select min(要求最小值的列名) from 列名;
    // 统计数量 只统计不为null的记录条数
    select count(表中任意不存在Null值的列或者直接写`*`) from 表名;

    注意:聚合函数不能直接跟在where后面。

    // 比如:查出价格大于平均值的所有商品
    select * from product where price > (select avg(price) from product); 
  • 分组查询:group by

    将表中某列值相同的记录放在一起,称为一组。

    sql语句的执行顺序:

    select ... from ... where ... group by ... order by ... 

    顺序:from -> where -> group by -> select -> order by

  // 按照某列去分组,对于列名相同的记录默认会显示排在前面的
  select * from 表名 group by 列名;
  // 按照某列排序,并统计该列的数量
  select 列名,count(列名) from 表名 group by 列名;

  // 两个字段联合一起查询,示例:查找各部分,各个岗位工资最高的记录
  select deptno,job,max(sal) from emp group by deptno,job;
  • having

    条件筛选。出现在分组之后,其后可以接聚合函数。where关键字出现在分组之前,其后不可接聚合函数。

    // 比如:查询商品表中,按照商品编号分组显示每组的平均价格,并查询平均价格大于 60元的所有商品。
    select cno,avg(price) from product group by cno having avg(price) > 60;
    
    // 以下两句sql作用相同,其中后者效率更高。找出各部门 最高薪资大于3000的
    select deptno,max(sal) from emp group by deptno having max(sal)>3000;
    select deptno ,max(sal) from emp where sal > 3000 group by deptno;

3,删除表中记录

  • 删除指定某条记录

    delete from 表名 where 条件;
    // 例如
    delete from student where sid=105;

    :如果不指定条件,则会将表中的数据一条一条全部删除。

  • truncatedelete from 表名; 删除表中数据有何区别?

    前者是将表直接删除,然后重新创建表,表中无数据。后者是一条一条删除表中所有数据。

    在数据量较少的情况下,后者效率高;反之,前者高。

4,更新表中记录

  • 更新某条记录

    update 表名 set 要更新的列名1=列的值1,要更新的列名2=列的值2 where 条件;

    比如这样:

    update student set sname='寒冰',sage=23 where sid=105;
  • 更新所有记录的某些列

    update 表名 set 要更新的列1=值1,要更新的列2=值2;

总结

  • 表的操作,根据个人职位和功能需求来定,一个完整体系表的构建是一个具体业务的逻辑体现。
  • 大多开发者在表内和表与表之间进行操作的时候多,其中最主要也是用的做多的操作是查询和筛选。

小编特意创建了一个公众号:推荐学java,分享与java相关的内容,并且以原创为主,欢迎大家搜索关注(关注即送小编挑选的精品视频教程),一起学Java!

推荐学Java——数据表操作

收藏
评论区

相关推荐

Java基础入门之多态和对象类型转换
点击上方“ **Java进阶学习交流** ”,进行关注 后台回复“**Java**”即可获赠Java学习资料 今 日 鸡 汤 人随沙岸向江村,余亦乘舟归鹿门。 前面几篇文章用Java带大家一起了解Java的部分基础知识,感兴趣的小伙伴们可以去学习下了,[一篇文章带你了解Java类的设计和封装及类成员的访问控制](https://www.osc
Java基础入门篇——面向对象和类的定义
点击上方“ **Java进阶学习交流** ”,进行关注 后台回复“**Java**”即可获赠Java学习资料 今 日 鸡 汤 十三学得琵琶成,名属教坊第一部。 前面几篇文章用Java带大家一起了解了几个游戏小项目,感兴趣的小伙伴可以点击文章观摩下,[手把手教你用Java打造一款简单故事书(上篇)](https://www.oschina.ne
Java大佬精心为小白整理的十个学习心德
零基础学习 java 能学会吗? 零基础如何学习 java? 有什么方法吗? 今天由我来分享下关于零基础学习 java 的方法。 Java发展前景 -------- 据权威统计,在所有软件开发类人才的需求中,对 Java 工程师的需求达到全部需求量的 60%~70%,Java 软件人才的缺口巨大,对应薪水也是随之水涨船高。 越来越多的大学生看好
Java学习
> 转载自 [知乎](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.zhihu.com%2Fquestion%2F34544815%2Fanswer%2F733871268%3Futm_source%3Dqq%26utm_medium%3Dsocial%26utm_oi%3D928
Java学习
 症状:Tomcat停止后,提示Quartz一堆错,总之就是无法停止,然后tomcat的进程还有残留,要手动再停止一下,不然无法再次运行 (Exception in thread "DefaultQuartzScheduler\_Worker-8" java.lang.NoClassDefFoundError: org/apache/log4j/spi/T
Java学习流程图(学习路线、书籍、教程推荐)
Java的火爆袭来,吸引了大批的初学者涉猎,想入行Java,却苦于自己没有基础,担心学不好。我告诉你,这些担心都是浮云,你只是惧怕走进一个新天地,人都是一样的,面对自己不熟悉的领域总会有莫名的恐惧感。不是不可以,只是你缺乏的是勇敢迈出去的勇气。 最近整理了一份关于Java自学的学习路线图、书籍推荐、视频教程,希望帮助每一位想学习Java的小伙伴快速成长为J
Java学习路线!
java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。   在大家看之前,我要先声明两点。1、由于我本人是Java后端开
Java学习路线(完整详细版)
 科技在进步,时代也在发展,很多人的理想再也不是骑马喝酒走四方,而是学习掌握java技术,真正的实现高薪就业,说到学习Java,我们今天就来说说Java开发需要学习的内容,说说java学习路线,说说Java学习的课程内容。   Java学习大致分为四大阶段,具体内容如下:   **第一阶段——Java基础**   Java的学习内容从计算机基本概念,D
Java学到什么程度才能找到工作?从国内各阶层互联网公司分析
Java学到什么程度才能找到工作?从国内各阶层互联网公司分析 ============================== 刚开始学习Java的小伙伴,尤其是那种又没钱又没有背景的,刚开始学习Java都关心这么一个问题:到底把Java学到何种程度才能找到第一份工作呢? 每个人都很现实,目标都是相当的一致,都是为了能拿到像别人高薪的工作。那到底一个Java
Java网络编程和NIO详解3:IO模型与Java网络编程模型
> **微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)** ![](https://img-blog.
Java自学
Java的 If 条件语句 ------------- **条件判断** 示例 1 : **if** if(表达式1){ 表达式2; } 如果表达式1的值是true, 就执行表达式2 ![if](https://oscimg.oschina.net/oscnet/9bbaf72c54f9849129e8a039
java下载和环境变量配置
初学java,以前没有接触过这方面内容,所以简要记录一下我2个月的学习流程。 首先,我在慕课上学习java的基础,浙江大学翁恺老师的课程。 ![](https://oscimg.oschina.net/oscnet/3bbff5b61befb445bac636684fb5666fd7e.png) 下载ECLIPSE-java 进入官网:https:/
java基础学习 了解这些很有必要
对于java初学者来说,入门才是关键。而入门的关键就在于,需要先熟悉大环境,然后对java基础理论知识进行学习,不要着急实践,相对于实践,你更需要对技术的整体把控! 在具体谈论Java知识点之前,我们先聊聊Java技术语言自身的一些特点、生态系统以及适用的场景,这有助于我们更好的学习语言本身。 ![java基础学习 了解这些很有必要](https://o
2017.7.26开始学习
上个月学多学少一些些,基础,从今天开始重新复习下。 1、java程序本身不是开发单机版程序的语言,是开发网络的。 2、一般在java中是很少使用图形界面进行操作的。 3、java的核心知识点: ![](https://static.oschina.net/uploads/space/2017/0726/231334_um5Z_3607205.jpg)
推荐学Java——应该了解的前端内容
导读本文是推荐学Java 系列第四篇,通过前三篇内容已经搞定了 JavaSE 的内容,接下来是真正进入Java后端开发的视界。先来了解基本学习路线,可能你会有这样的疑问:前端的内容到底该不该学?Java开发需不需要会前端?下面就来一一剖析。 Java正则表达式在开始之前,先带大家学习一下Java中的正则表达式,这块内容既可以放到Java基础部分学习,也可以放