MySQL

JavaEE:企业级Java开发 web阶段

分为1.前端(页面,展示数据库中的数据)

2.后台(连接点:链接数据库JDBC、Mybatis,链接前端(控制视图跳转,给前端传递数据))

3.数据库(存数据)

1、初始MySQL

1.1、为什么学习数据库

大数据时代,Java需要数据库

被迫需求:存数据

数据库是所有软件体系中最核心的存在

1.2、什么是数据库

数据库(DB,database)

概念:数据仓库,用来存储数据,是一个软件安装在操作系统上!SQL可以存储大量的数据大概500万之内的数据查询很快

作用:存储数据和管理数据

1.3、数据库分类

关系型数据库(类似Excel):有行和列

  • MySQL,Oracle,DB2等
  • 通过表和表之间,行和列之间的关系进行数据的存储。学员信息表,考勤表等
  • SQL

非关系型数据库:一般是key和value

  • Redis,MongoDB
  • 非关系型数据库存储的是对象,通过对象自身的属性来决定
  • NoSQL->Not Only SQL

DBMS:数据库管理系统

  • 是数据库的管理软件,科学有效地管理我们的数据,有效地维护和获取数据
  • MySQL本质就是一个数据库管理系统

1.4、MySQL简介

MySQL是一个关系型数据库管理系统

前世:由瑞典MySQL AB 公司开发

今生:属于 Oracle 旗下产品。

MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

开源的数据库软件

体积小、速度快、总体拥有成本低

官网:https://www.mysql.com

5.7版本稳定

安装建议:

1、尽量不要使用exe,因为有注册表,卸载非常麻烦

2、尽可能使用压缩包来安装

1.5、安装MySQL

1.6、安装Navicat

1.7、连接数据库

打开MySQL命令窗口

  • 在DOS命令行窗口进入 安装目录\mysql\bin
  • 可设置环境变量,设置了环境变量,可以在任意目录打开!

连接数据库语句 : mysql -h 服务器主机地址 -u 用户名 -p 用户密码

注意 : -p后面不能加空格,否则会被当做密码的内容,导致登录失败 !

几个基本的数据库操作命令 :

  1. update user set password=password('123456')where user='root'; 修改密码
  2. flush privileges; 刷新数据库
  3. show databases; 显示所有数据库
  4. use dbname;打开某个数据库
  5. show tables; 显示数据库mysql中所有的表
  6. describe user; 显示表mysql数据库中user表的列信息
  7. create database name; 创建数据库
  8. use databasename; 选择数据库
  9. exit; 退出Mysql
  10. ? 命令关键词 : 寻求帮助
  11. -- 表示注释(SQL当中原本的注释)
  12. /*
  13. 多行注释
  14. */

数据库xxx语言

DDL 定义

DML 操作

DQL 查询

DCL 控制

2、操作数据库

操作数据库->操作数据库中的表->操作数据库中表的数据

MySQL里面不区分大小写

2.1、操作数据库

  1. 创建数据库

    1. create database [if not exists] 数据库名;

    使用数据库 : use 数据库名;

  2. 删除数据库

    1. drop database [if exists] 数据库名;
  3. 使用数据库

    1. use 数据库名;

    如果你的表名或者字段名是一个特殊字符,就需要加`

  4. 查看数据库

    1. show databases; -- 查看所有的数据库

打开表就是查询,对照查看SQL语句

固定语法中的单词需要记忆

2.2、数据库的数据类型

数值

  • tinyint 十分小的数据 1个字节
  • smallint 较小的数据 2个字节
  • mediumint 中等大小的数据 3个字节
  • int 标准的整数 4个字节 常用
  • bigint 较大的数据 8个字节
  • float 浮点数 4个字节
  • double 浮点数 8个字节
  • decimal 字符串形式的浮点数,金融计算时一般使用decimal

字符串

  • char 字符串固定大小的 0-255
  • varchar 可变字符串 0-65535 常用的 String
  • tinytext 微型文本 2的8次方-1
  • text 文本串 2的16次方-1 保存大文本

时间日期

java.util.Date

  • date YYYY-MM-DD,日期
  • time HH:mm:ss,时间格式
  • datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
  • timestamp 时间戳,1970.1.1到现在的毫秒数,也较为常用
  • year 年份表示

null

  • 没有值,是未知的
  • 注意:不要使用NULL进行计算,结果一定为NULL

2.3、数据库的字段属性

UnSigned

  • 无符号的
  • 声明该数据列不允许负数 .

ZEROFILL

  • 0填充的
  • 不足位数的用0来填充 , 如int(3),5则为005

Auto_InCrement

  • 自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)

  • 通常用于设置主键 , 且为整数类型

  • 可定义起始值和步长

    • 当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表
    • SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局)

NULL 和 NOT NULL

  • 默认为NULL , 即没有插入该列的数值
  • 如果设置为NOT NULL , 则该列必须有值,如果不写值会报错

DEFAULT

  • 默认的
  • 用于设置默认值
  • 例如,性别字段,默认为"男" , 否则为 "女" ; 若无指定该列的值 , 则默认值为"男"的值

要求必须存在的东西

  1. /* 每一个表,都必须存在以下五个字段
  2. id 主键
  3. `version` 乐观锁
  4. is_delete 伪删除
  5. gmt_create 创建时间
  6. gmt_update 修改时间
  7. */

2.4、创建数据库表

注意点:使用英文(),表名称 和 字段 尽量使用``括起来

字符串使用 单引号括起来

所有的语句后面加,(英文逗号),最后一个不用加

primary key是主键,一般一个表只有一个唯一的主键

  1. -- 目标 : 创建一个school数据库
  2. -- 创建学生表(列,字段)
  3. -- 学号int 登录密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭住址,email
  4. -- 创建表之前 , 一定要先选择数据库
  5. CREATE TABLE IF NOT EXISTS `student` (
  6. `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
  7. `name` varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  8. `pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密码',
  9. `sex` varchar(2) NOT NULL DEFAULT '男' COMMENT '性别',
  10. `birthday` datetime DEFAULT NULL COMMENT '生日',
  11. `address` varchar(100) DEFAULT NULL COMMENT '地址',
  12. `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  13. PRIMARY KEY (`id`)
  14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  15. -- 查看数据库的定义
  16. SHOW CREATE DATABASE school;
  17. -- 查看数据表的定义
  18. SHOW CREATE TABLE student;
  19. -- 显示表结构
  20. DESC student; -- 设置严格检查模式(不能容错了)SET sql_mode='STRICT_TRANS_TABLES';

格式:

  1. create table [if not exists] `表名`(
  2. '字段名1' 列类型 [属性][索引][注释],
  3. '字段名2' 列类型 [属性][索引][注释],
  4. #...
  5. '字段名n' 列类型 [属性][索引][注释]
  6. )[表类型][表字符集][注释];

说明 : 反引号用于区别MySQL保留字与普通字符而引入的 (键盘esc下面的键)

2.5、数据表的类型

InnoDB 默认使用

MyISAM 早些年使用的

MyISAM InnoDB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键 不支持 支持
全文索引 支持 不支持
表空间的大小 较小 较大,约为MyISAM的2倍

常规使用:

  • MyISAM 节约空间,速度较快
  • InnoDB 安全性高,事务的处理,多表多用户操作

在物理空间中存在的位置

所有的数据库文件都存在data目录下,一个文件夹就对应着一个数据库

本质还是文件的存储!

MySQL引擎在物理文件上的区别

  • MySQL数据表以文件方式存放在磁盘中

    • 包括表文件 , 数据文件 , 以及数据库的选项文件
    • 位置 : Mysql安装目录\data\下存放数据表,目录名对应数据库名 , 该目录下文件名对应数据表
  • 注意 :

    • * . frm -- 表结构定义文件
    • * . MYD -- 数据文件 ( data )
    • * . MYI -- 索引文件 ( index )
    • InnoDB类型数据表只有一个 *.frm文件 , 以及上一级目录的ibdata1文件
    • MyISAM类型数据表对应以上三个文件

设置数据表字符集

我们可为数据库,数据表,数据列设定不同的字符集,设定方法 :

  • 创建时通过命令来设置 , 如 : CREATE TABLE 表名()CHARSET = utf8;
  • 如无设定 , 则根据MySQL数据库配置文件 my.ini 中的参数设定
  • 不设置的话,会是MySQL默认的字符集编码Latin1(不支持中文)

2.6、修改删除表

修改表 ( ALTER TABLE )

修改表名 :ALTER TABLE 旧表名 RENAME AS 新表名

添加字段 : ALTER TABLE 表名 ADD 字段名 列属性[属性]

修改字段 :

  • ALTER TABLE 表名 MODIFY 字段名 列类型[属性](修改约束)
  • ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[属性](修改表的字段名)

结论:change用来字段重命名,不能修改字段类型和约束

modify不用来字段重命名,只能修改字段类型和约束

删除字段 : ALTER TABLE 表名 DROP 字段名

删除数据表

语法:DROP TABLE [IF EXISTS] 表名

  • IF EXISTS为可选 , 判断是否存在该数据表
  • 如删除不存在的数据表会抛出错误

所有的创建和删除操作尽量加上判断,以免报错

其他

  1. 1. 可用反引号(`)为标识符(库名、表名、字段名、索引、别名)包裹,以避免与关键字重名!中文也可以作为标识符!
  2. 2. 每个库目录存在一个保存当前数据库的选项文件db.opt。
  3. 3. 注释:
  4. 单行注释 # 注释内容
  5. 多行注释 /* 注释内容 */
  6. 单行注释 -- 注释内容 (标准SQL注释风格,要求双破折号后加一空格符(空格、TAB、换行等))
  7. 4. 模式通配符:
  8. _ 任意单个字符
  9. % 任意多个字符,甚至包括零字符
  10. 单引号需要进行转义 \'
  11. 5. CMD命令行内的语句结束符可以为 ";", "\G", "\g",仅影响显示结果。其他地方还是用分号结束。delimiter 可修改当前对话的语句结束符。
  12. 6. SQL对大小写不敏感 (关键字)
  13. 7. 清除已有语句:\c

3、MySQL数据管理

3.1、外键

外键概念

如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表

在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreign key)。

外键作用

保持数据一致性完整性,主要目的是控制存储在外键表中的数据,约束。使两张表形成关联,外键只能引用外表中的列的值或使用空值。

创建外键

建表时指定外键约束

  1. -- 创建外键的方式一 : 创建子表同时创建外键
  2. -- 年级表 (id\年级名称)
  3. CREATE TABLE `grade` (
  4. `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',
  5. `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
  6. PRIMARY KEY (`gradeid`)
  7. ) ENGINE=INNODB DEFAULT CHARSET=utf8
  8. -- 学生信息表 (学号,姓名,性别,年级,手机,地址,出生日期,邮箱,身份证号)
  9. CREATE TABLE `student` (
  10. `studentno` INT(4) NOT NULL COMMENT '学号',
  11. `studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  12. `sex` TINYINT(1) DEFAULT '1' COMMENT '性别',
  13. `gradeid` INT(10) DEFAULT NULL COMMENT '年级',
  14. `phoneNum` VARCHAR(50) NOT NULL COMMENT '手机',
  15. `address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
  16. `borndate` DATETIME DEFAULT NULL COMMENT '生日',
  17. `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
  18. `idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
  19. PRIMARY KEY (`studentno`),
  20. KEY `FK_gradeid` (`gradeid`),
  21. CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
  22. ) ENGINE=INNODB DEFAULT CHARSET=utf8

建表后修改

  1. -- 创建外键方式二 : 创建子表完毕后,修改子表添加外键
  2. ALTER TABLE `student`
  3. ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);

删除外键

操作:删除 grade 表,发现报错

注意 : 删除具有主外键关系的表时 , 要先删子表 , 后删主表

  1. -- 删除外键
  2. ALTER TABLE student DROP FOREIGN KEY FK_gradeid;
  3. -- 发现执行完上面的,索引还在,所以还要删除索引
  4. -- 注:这个索引是建立外键的时候默认生成的
  5. ALTER TABLE student DROP INDEX FK_gradeid;

以上操作都是物理外键,数据库级别的外键不建议使用(避免数据库过多造成困扰)

最佳方法:

  • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)

  • 我们想使用多张表的数据当中的外键的时候,利用程序去实现

3.2、DML语言

数据库意义 : 数据存储、数据管理

管理数据库数据方法:

  • 通过SQLyog等管理工具管理数据库数据
  • 通过DML语句管理数据库数据

DML语言 :数据操作语言

  • 用于操作数据库对象中所包含的数据

  • 包括 :

    • INSERT (添加数据语句)
    • UPDATE (更新数据语句)
    • DELETE (删除数据语句)

3.3、添加数据

INSERT命令

语法:

  1. INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3',...),('值1','值2','值3',...)

[]是可选的,根据需求写

注意 :

  • 字段或值之间用英文逗号隔开
  • ' 字段1,字段2...' 该部分可省略,但添加的值务必与表结构,数据列**,顺序相对应,且数量一致 **
  • 可同时插入多条数据 ,values 后用英文逗号隔开
  1. -- 使用语句如何增加语句?
  2. -- 语法 : INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')
  3. INSERT INTO grade(gradename) VALUES ('大一');
  4. -- 主键自增,那能否省略呢?
  5. INSERT INTO grade VALUES ('大二');
  6. -- 查询:INSERT INTO grade VALUE ('大二')错误代码:1136
  7. Column count doesn`t match value count at row 1
  8. -- 结论:'字段1,字段2...'该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应,且数量一致.
  9. -- 一次插入多条数据,values后面的值需要使用,隔开即可
  10. INSERT INTO grade(gradename) VALUES ('大三'),('大四');

3.4、修改数据

update命令

语法:

  1. UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];

注意 :

  • column_name 为要更改的数据列,尽量带上``
  • value 为修改后的数据 , 可以为变量 , 具体值 , 表达式或者嵌套的SELECT结果
  • condition 为筛选条件 , 如不指定则修改该表的所有列数据
  • 不指定条件的情况下,会改动所有的列,所以尽量不要这样做

where条件子句

可以简单的理解为 : 有条件地从表中筛选数据

测试:

  1. -- 修改年级信息
  2. UPDATE grade SET gradename = '高中' WHERE gradeid = 1;

3.5、删除数据

DELETE命令

语法:

  1. DELETE FROM 表名 [WHERE condition];

注意:condition为筛选条件 , 如不指定则删除该表的所有列数据

  1. -- 删除最后一个数据
  2. DELETE FROM grade WHERE gradeid = 5

TRUNCATE命令

作用:用于完全清空表数据 , 但表结构 , 索引 , 约束等不变 ;

语法:

  1. TRUNCATE [TABLE] table_name;
  2. -- 清空年级表
  3. TRUNCATE grade

注意:区别于DELETE命令

  • 相同 : 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快

  • 不同 :

    • 使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器
    • 使用TRUNCATE TABLE不会对事务有影响

测试:

  1. -- 创建一个测试表
  2. CREATE TABLE `test` (
  3. `id` INT(4) NOT NULL AUTO_INCREMENT,
  4. `coll` VARCHAR(20) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=INNODB DEFAULT CHARSET=utf8
  7. -- 插入几个测试数据
  8. INSERT INTO `test`(`coll`) VALUES('row1'),('row2'),('row3');
  9. -- 删除表数据(不带where条件的delete)
  10. DELETE FROM test;
  11. -- 结论:如不指定Where则删除该表的所有列数据,自增当前值依然从原来基础上进行,会记录日志.
  12. -- 删除表数据(truncate)
  13. TRUNCATE TABLE test;
  14. -- 结论:truncate删除数据,自增当前值会恢复到初始值重新开始;不会记录日志.
  15. -- 同样使用DELETE清空不同引擎的数据库表数据.重启数据库服务后
  16. -- InnoDB : 自增列从初始值重新开始 (因为是存储在内存中,断电即失)
  17. -- MyISAM : 自增列依然从上一个自增数据基础上开始 (存在文件中,不会丢失)

4、DQL语言

DQL( Data Query Language 数据查询语言 )

  • 查询数据库数据 , 如SELECT语句
  • 简单的单表查询或多表的复杂查询和嵌套查询
  • 是数据库语言中最核心,最重要的语句
  • 使用频率最高的语句

SELECT语法

  1. SELECT [ALL | DISTINCT]
  2. {* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
  3. FROM table_name [as table_alias]
  4. [left | right | inner join table_name2] -- 联合查询
  5. [WHERE ...] -- 指定结果需满足的条件
  6. [GROUP BY ...] -- 指定结果按照哪几个字段来分组
  7. [HAVING] -- 过滤分组的记录必须满足的次要条件
  8. [ORDER BY ...] -- 指定查询记录按一个或多个条件排序
  9. [LIMIT {[offset,]row_count | row_countOFFSET offset}];
  10. -- 指定查询的记录从哪条至哪条

注意 : [ ] 括号代表可选的 , { }括号代表必选得

4.1、指定查询字段

  1. -- 查询表中所有的数据列结果 , 采用 **" \* "** 符号; 但是效率低,不推荐 .
  2. -- 查询所有学生信息
  3. SELECT * FROM student;
  4. -- 查询指定列(学号 , 姓名)
  5. SELECT studentno,studentname FROM student;

AS 子句作为别名

作用:

  • 可给数据列取一个新别名
  • 可给表取一个新别名
  • 可把经计算或总结的结果用另一个新名称来代替
  1. -- 这里是为列取别名(当然as关键词可以省略)
  2. SELECT studentno AS 学号,studentname AS 姓名 FROM student;
  3. -- 使用as也可以为表取别名
  4. SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;
  5. -- 使用as,为查询结果取一个新名字
  6. -- CONCAT()函数拼接字符串
  7. SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;

DISTINCT关键字的使用

作用 : 去掉SELECT查询返回的记录结果中重复的记录 ( 返回所有列的值都相同 ) , 只返回一条

  1. -- # 查看哪些同学参加了考试(学号) 去除重复项
  2. SELECT * FROM result; -- 查看考试成绩
  3. SELECT studentno FROM result; -- 查看哪些同学参加了考试
  4. SELECT DISTINCT studentno FROM result; -- 了解:DISTINCT 去除重复项 , (默认是ALL)

使用表达式的列

数据库中的表达式 : 一般由文本值 , 列值 , NULL , 函数和操作符等组成

应用场景 :

  • SELECT语句返回结果列中使用

  • SELECT语句中的ORDER BY , HAVING等子句中使用

  • DML语句中的 where 条件语句中使用表达式

    1. -- selcet查询中可以使用表达式
    2. SELECT @@auto_increment_increment; -- 查询自增步长
    3. SELECT VERSION(); -- 查询版本号
    4. SELECT 100*3-1 AS 计算结果; -- 表达式
    5. -- 学员考试成绩集体提分一分查看
    6. SELECT studentno,StudentResult+1 AS '提分后' FROM result;
  • 避免SQL返回结果中包含 ' . ' , ' * ' 和括号等干扰开发语言程序.

4.2、where条件语句

作用:用于检索数据表中 符合条件 的记录

搜索条件可由一个或多个逻辑表达式组成 , 结果一般为真或假.

逻辑操作符

测试

  1. -- 满足条件的查询(where)
  2. SELECT Studentno,StudentResult FROM result;
  3. -- 查询考试成绩在95-100之间的
  4. SELECT Studentno,StudentResult
  5. FROM result
  6. WHERE StudentResult>=95 AND StudentResult<=100;
  7. -- AND也可以写成 &&
  8. SELECT Studentno,StudentResult
  9. FROM result
  10. WHERE StudentResult>=95 && StudentResult<=100;
  11. -- 模糊查询(对应的词:精确查询)
  12. SELECT Studentno,StudentResult
  13. FROM result
  14. WHERE StudentResult BETWEEN 95 AND 100;
  15. -- 除了1000号同学,要其他同学的成绩
  16. SELECT studentno,studentresult
  17. FROM result
  18. WHERE studentno!=1000;
  19. -- 使用NOT
  20. SELECT studentno,studentresult
  21. FROM result
  22. WHERE NOT studentno=1000;

模糊查询 :比较操作符

注意:

  • 数值数据类型的记录之间才能进行算术运算 ;
  • 相同数据类型的数据之间才能进行比较 ;

测试:

  1. -- 模糊查询 between and \ like \ in \ null
  2. -- =============================================
  3. -- LIKE
  4. -- =============================================
  5. -- 查询姓刘的同学的学号及姓名
  6. -- like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符)
  7. SELECT studentno,studentname FROM student
  8. WHERE studentname LIKE '刘%';
  9. -- 查询姓刘的同学,后面只有一个字的
  10. SELECT studentno,studentname FROM student
  11. WHERE studentname LIKE '刘_';
  12. -- 查询姓刘的同学,后面只有两个字的
  13. SELECT studentno,studentname FROM student
  14. WHERE studentname LIKE '刘__';
  15. -- 查询姓名中含有 字的
  16. SELECT studentno,studentname FROM student
  17. WHERE studentname LIKE '%嘉%';
  18. -- 查询姓名中含有特殊字符的需要使用转义符号 '\'
  19. -- 自定义转义符关键字: ESCAPE ':'
  20. -- =============================================
  21. -- IN
  22. -- =============================================
  23. -- 查询学号为1000,1001,1002的学生姓名
  24. SELECT studentno,studentname FROM student
  25. WHERE studentno IN (1000,1001,1002);
  26. -- 查询地址在北京,南京,河南洛阳的学生
  27. SELECT studentno,studentname,address FROM student
  28. WHERE address IN ('北京','南京','河南洛阳');
  29. -- =============================================
  30. -- NULL 空
  31. -- =============================================
  32. -- 查询出生日期没有填写的同学
  33. -- 不能直接写=NULL , 这是代表错误的 , 用 is null
  34. SELECT studentname FROM student
  35. WHERE BornDate IS NULL;
  36. -- 查询出生日期填写的同学
  37. SELECT studentname FROM student
  38. WHERE BornDate IS NOT NULL;
  39. -- 查询没有写家庭住址的同学(空字符串不等于null)
  40. SELECT studentname FROM student
  41. WHERE Address='' OR Address IS NULL;

4.3、连接查询

JOIN 对比

七种Join:

测试

  1. /*
  2. 连接查询
  3. 如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
  4. 内连接 inner join
  5. 查询两个表中的结果集中的交集
  6. 外连接 outer join
  7. 左外连接 left join
  8. (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
  9. 右外连接 right join
  10. (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)
  11. 等值连接和非等值连接
  12. 自连接
  13. */
  14. -- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
  15. SELECT * FROM student;
  16. SELECT * FROM result;
  17. /*思路:
  18. (1):分析需求,确定查询的列来源于两个类,student result,连接查询
  19. (2):确定使用哪种连接查询?(内连接)
  20. */
  21. SELECT s.studentno,studentname,subjectno,StudentResult
  22. FROM student s
  23. INNER JOIN result r
  24. ON r.studentno = s.studentno
  25. -- 右连接(也可实现)
  26. SELECT s.studentno,studentname,subjectno,StudentResult
  27. FROM student s
  28. RIGHT JOIN result r
  29. ON r.studentno = s.studentno
  30. -- 等值连接
  31. SELECT s.studentno,studentname,subjectno,StudentResult
  32. FROM student s , result r
  33. WHERE r.studentno = s.studentno
  34. -- 左连接 (查询了所有同学,不考试的也会查出来)
  35. SELECT s.studentno,studentname,subjectno,StudentResult
  36. FROM student s
  37. LEFT JOIN result r
  38. ON r.studentno = s.studentno
  39. -- 查一下缺考的同学(左连接应用场景)
  40. SELECT s.studentno,studentname,subjectno,StudentResult
  41. FROM student s
  42. LEFT JOIN result r
  43. ON r.studentno = s.studentno
  44. WHERE StudentResult IS NULL
  45. -- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
  46. SELECT s.studentno,studentname,subjectname,StudentResult
  47. FROM student s
  48. INNER JOIN result r
  49. ON r.studentno = s.studentno
  50. INNER JOIN `subject` sub
  51. ON sub.subjectno = r.subjectno
操作 描述
Inner Join 如果表中至少有一个匹配,就返回行
Left Join 会从左表中返回所有的值,即使右表中没有匹配
Right Join 会从右表中返回所有的值,即使左表中没有匹配
  • left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录B表记录不足的地方均为NULL.

  • right join和left join的结果刚好相反,是以右表(B)为基础的,A表不足的地方用NULL填充.

  • inner join并不以谁为基础,它只显示符合条件的记录

sql的left join 、right join 、inner join之间的区别

  left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

  right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

  inner join(等值连接) 只返回两个表中联结字段相等的行

join on(判断条件)是一个连接查询

where是一个等值查询

自连接

  1. /*
  2. 自连接
  3. 数据表与自身进行连接
  4. 需求:从一个包含栏目ID , 栏目名称和父栏目ID的表中
  5. 查询父栏目名称和其他子栏目名称
  6. */
  7. -- 创建一个表
  8. CREATE TABLE `category` (
  9. `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id',
  10. `pid` INT(10) NOT NULL COMMENT '父id',
  11. `categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字',
  12. PRIMARY KEY (`categoryid`)
  13. ) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
  14. -- 插入数据
  15. INSERT INTO `category` (`categoryid`, `pid`, `categoryName`)
  16. VALUES('2','1','信息技术'),
  17. ('3','1','软件开发'),
  18. ('4','3','数据库'),
  19. ('5','1','美术设计'),
  20. ('6','3','web开发'),
  21. ('7','5','ps技术'),
  22. ('8','2','办公信息');
  23. -- 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
  24. -- 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
  25. SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'
  26. FROM category AS a,category AS b
  27. WHERE a.`categoryid`=b.`pid`
  28. -- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
  29. SELECT s.studentno,studentname,subjectname,StudentResult
  30. FROM student s
  31. INNER JOIN result r
  32. ON r.studentno = s.studentno
  33. INNER JOIN `subject` sub
  34. ON sub.subjectno = r.subjectno
  35. -- 查询学员及所属的年级(学号,学生姓名,年级名)
  36. SELECT studentno AS 学号,studentname AS 学生姓名,gradename AS 年级名称
  37. FROM student s
  38. INNER JOIN grade g
  39. ON s.`GradeId` = g.`GradeID`
  40. -- 查询科目及所属的年级(科目名称,年级名称)
  41. SELECT subjectname AS 科目名称,gradename AS 年级名称
  42. FROM SUBJECT sub
  43. INNER JOIN grade g
  44. ON sub.gradeid = g.gradeid
  45. -- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
  46. SELECT s.studentno,studentname,subjectname,StudentResult
  47. FROM student s
  48. INNER JOIN result r
  49. ON r.studentno = s.studentno
  50. INNER JOIN `subject` sub
  51. ON r.subjectno = sub.subjectno
  52. WHERE subjectname='数据库结构-1'

4.4、排序和分页

测试

  1. /*============== 排序 ================
  2. 语法 : ORDER BY
  3. ORDER BY 语句用于根据指定的列对结果集进行排序。
  4. ORDER BY 语句默认按照ASC升序对记录进行排序。
  5. 如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
  6. */
  7. -- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
  8. -- 按成绩降序排序
  9. SELECT s.studentno,studentname,subjectname,StudentResult
  10. FROM student s
  11. INNER JOIN result r
  12. ON r.studentno = s.studentno
  13. INNER JOIN `subject` sub
  14. ON r.subjectno = sub.subjectno
  15. WHERE subjectname='数据库结构-1'
  16. ORDER BY StudentResult DESC
  17. /*============== 分页 ================
  18. 语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
  19. 好处 : (用户体验,网络传输,查询压力)
  20. 推导:
  21. 第一页 : limit 0,5
  22. 第二页 : limit 5,5
  23. 第三页 : limit 10,5
  24. ......
  25. 第N页 : limit (pageNo-1)*pageSzie,pageSzie
  26. [pageNo:页码,pageSize:单页面显示条数]
  27. */
  28. -- 每页显示5条数据
  29. SELECT s.studentno,studentname,subjectname,StudentResult
  30. FROM student s
  31. INNER JOIN result r
  32. ON r.studentno = s.studentno
  33. INNER JOIN `subject` sub
  34. ON r.subjectno = sub.subjectno
  35. WHERE subjectname='数据库结构-1'
  36. ORDER BY StudentResult DESC , studentno
  37. LIMIT 0,5
  38. -- 查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)
  39. SELECT s.studentno,studentname,subjectname,StudentResult
  40. FROM student s
  41. INNER JOIN result r
  42. ON r.studentno = s.studentno
  43. INNER JOIN `subject` sub
  44. ON r.subjectno = sub.subjectno
  45. WHERE subjectname='JAVA第一学年'
  46. ORDER BY StudentResult DESC
  47. LIMIT 0,10

4.5、子查询

  1. /*============== 子查询 ================
  2. 什么是子查询?
  3. 在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句
  4. 嵌套查询可由多个子查询组成,求解的方式是由里及外;
  5. 子查询返回的结果一般都是集合,故而建议使用IN关键字;
  6. */
  7. -- 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列
  8. -- 方法一:使用连接查询
  9. SELECT studentno,r.subjectno,StudentResult
  10. FROM result r
  11. INNER JOIN `subject` sub
  12. ON r.`SubjectNo`=sub.`SubjectNo`
  13. WHERE subjectname = '数据库结构-1'
  14. ORDER BY studentresult DESC;
  15. -- 方法二:使用子查询(执行顺序:由里及外)
  16. SELECT studentno,subjectno,StudentResult
  17. FROM result
  18. WHERE subjectno=(
  19. SELECT subjectno FROM `subject`
  20. WHERE subjectname = '数据库结构-1'
  21. )
  22. ORDER BY studentresult DESC;
  23. -- 查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名
  24. -- 方法一:使用连接查询
  25. SELECT s.studentno,studentname
  26. FROM student s
  27. INNER JOIN result r
  28. ON s.`StudentNo` = r.`StudentNo`
  29. INNER JOIN `subject` sub
  30. ON sub.`SubjectNo` = r.`SubjectNo`
  31. WHERE subjectname = '高等数学-2' AND StudentResult>=80
  32. -- 方法二:使用连接查询+子查询
  33. -- 分数不小于80分的学生的学号和姓名
  34. SELECT r.studentno,studentname FROM student s
  35. INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
  36. WHERE StudentResult>=80
  37. -- 在上面SQL基础上,添加需求:课程为 高等数学-2
  38. SELECT r.studentno,studentname FROM student s
  39. INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
  40. WHERE StudentResult>=80 AND subjectno=(
  41. SELECT subjectno FROM `subject`
  42. WHERE subjectname = '高等数学-2'
  43. )
  44. -- 方法三:使用子查询
  45. -- 分步写简单sql语句,然后将其嵌套起来
  46. SELECT studentno,studentname FROM student WHERE studentno IN(
  47. SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
  48. SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2'
  49. )
  50. )
  51. /*
  52. 练习题目:
  53. 查 C语言-1 的前5名学生的成绩信息(学号,姓名,分数)
  54. 使用子查询,查询郭靖同学所在的年级名称
  55. */

4.6、分组和过滤

group by 和 having

题目:

  1. -- 查询不同课程的平均分,最高分,最低分
  2. -- 前提:根据不同的课程进行分组
  3. SELECT subjectname,AVG(studentresult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
  4. FROM result AS r
  5. INNER JOIN `subject` AS s
  6. ON r.subjectno = s.subjectno
  7. GROUP BY r.subjectno
  8. HAVING 平均分>80;
  9. /*
  10. where写在group by前面.
  11. 要是放在分组后面的筛选
  12. 要使用HAVING..
  13. 因为having是从前面筛选的字段再筛选,而where是从数据表中的>字段直接进行的筛选的
  14. */

5.MySQL当中常用函数

5.1、数据函数

  1. SELECT ABS(-8); /*绝对值*/
  2. SELECT CEILING(9.4); /*向上取整*/
  3. SELECT FLOOR(9.4); /*向下取整*/
  4. SELECT RAND(); /*随机数,返回一个0-1之间的随机数*/
  5. SELECT SIGN(0); /*符号函数: 负数返回-1,正数返回1,0返回0*/

5.2、字符串函数

  1. SELECT CHAR_LENGTH('坚持就能成功'); /*返回字符串包含的字符数*/
  2. SELECT CONCAT('我','爱','程序'); /*合并字符串,参数可以有多个*/
  3. SELECT INSERT('我爱编程helloworld',1,2,'超级热爱'); /*替换字符串,从某个位置开始替换某个长度*/
  4. SELECT LOWER('YuXue'); /*小写*/
  5. SELECT UPPER('YuXue'); /*大写*/
  6. SELECT LEFT('hello,world',5); /*从左边截取*/
  7. SELECT RIGHT('hello,world',5); /*从右边截取*/
  8. SELECT REPLACE('坚持就能成功','坚持','努力'); /*替换字符串*/
  9. SELECT SUBSTR('坚持就能成功',4,2); /*截取字符串,开始和长度*/
  10. SELECT REVERSE('坚持就能成功'); /*反转
  11. -- 查询姓周的同学,改成邹
  12. SELECT REPLACE(studentname,'周','邹') AS 新名字
  13. FROM student WHERE studentname LIKE '周%';

5.3、日期和时间函数

  1. SELECT CURRENT_DATE(); /*获取当前日期*/
  2. SELECT CURDATE(); /*获取当前日期*/
  3. SELECT NOW(); /*获取当前日期和时间*/
  4. SELECT LOCALTIME(); /*获取当前本地日期和时间*/
  5. SELECT SYSDATE(); /*获取当前系统日期和时间*/
  6. -- 获取年月日,时分秒
  7. SELECT YEAR(NOW());
  8. SELECT MONTH(NOW());
  9. SELECT DAY(NOW());
  10. SELECT HOUR(NOW());
  11. SELECT MINUTE(NOW());
  12. SELECT SECOND(NOW());

系统信息函数

  1. SELECT VERSION(); /*版本*/
  2. SELECT USER(); /*用户*/

5.4、聚合函数

函数名称 描述
COUNT() 返回满足Select条件的记录总和数,如 select count(*) 【不建议使用 *,效率低】
SUM() 返回数字字段或表达式列作统计,返回一列的总和。
AVG() 通常为数值字段或表达列作统计,返回一列的平均值
MAX() 可以为数值字段,字符字段或表达式列作统计,返回最大的值。
MIN() 可以为数值字段,字符字段或表达式列作统计,返回最小的值。
  1. -- 聚合函数
  2. /*COUNT:非空的*/
  3. SELECT COUNT(studentname) FROM student;
  4. SELECT COUNT(*) FROM student;
  5. SELECT COUNT(1) FROM student; /*推荐*/
  6. -- 从含义上讲,count(1) count(*) 都表示对全部数据行的查询。
  7. -- count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
  8. -- count(*) 包括了所有的列,相当于行数,在统计结果的时候,包含字段为null 的记录;
  9. -- count(1) 1代表代码行,在统计结果的时候,包含字段为null 的记录
  10. /*
  11. 很多人认为count(1)执行的效率会比count(*)高,原因是count(*)会存在全表扫描,而count(1)可以针对一个字段进行查询。其实不然,count(1)和count(*)都会对全表进行扫描,统计所有记录的条数,包括那些为null的记录,因此,它们的效率可以说是相差无几。而count(字段)则与前两者不同,它会统计该字段不为null的记录条数。
  12. 下面它们之间的一些对比:
  13. 1)在表没有主键时,count(1)比count(*)快
  14. 2)有主键时,主键作为计算条件,count(主键)效率最高;
  15. 3)若表格只有一个字段,则count(*)效率较高。
  16. */
  17. SELECT SUM(StudentResult) AS 总和 FROM result;
  18. SELECT AVG(StudentResult) AS 平均分 FROM result;
  19. SELECT MAX(StudentResult) AS 最高分 FROM result;
  20. SELECT MIN(StudentResult) AS 最低分 FROM result;

MD5 加密

一、MD5简介

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

二、实现数据加密

新建一个表 testmd5

  1. CREATE TABLE `testmd5` (
  2. `id` INT(4) NOT NULL,
  3. `name` VARCHAR(20) NOT NULL,
  4. `pwd` VARCHAR(50) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=INNODB DEFAULT CHARSET=utf8

插入一些数据

  1. INSERT INTO testmd5 VALUES(1,'yuxue','123456'),(2,'hejk','456789')

如果我们要对pwd这一列数据进行加密,语法是:

  1. update testmd5 set pwd = md5(pwd);

如果单独对某个用户(如kuangshen)的密码加密:

  1. INSERT INTO testmd5 VALUES(3,'yuxue2','123456')
  2. update testmd5 set pwd = md5(pwd) where name = 'hejk2';

插入新的数据自动加密

  1. INSERT INTO testmd5 VALUES(4,'yuxue3',md5('123456'));

查询登录用户信息(md5对比使用,查看用户输入加密后的密码进行比对)

  1. SELECT * FROM testmd5 WHERE `name`='hejk' AND pwd=MD5('123456');

小结

  1. -- ================ 内置函数 ================
  2. -- 数值函数
  3. abs(x) -- 绝对值 abs(-10.9) = 10
  4. format(x, d) -- 格式化千分位数值 format(1234567.456, 2) = 1,234,567.46
  5. ceil(x) -- 向上取整 ceil(10.1) = 11
  6. floor(x) -- 向下取整 floor (10.1) = 10
  7. round(x) -- 四舍五入去整
  8. mod(m, n) -- m%n m mod n 求余 10%3=1
  9. pi() -- 获得圆周率
  10. pow(m, n) -- m^n
  11. sqrt(x) -- 算术平方根
  12. rand() -- 随机数
  13. truncate(x, d) -- 截取d位小数
  14. -- 时间日期函数
  15. now(), current_timestamp(); -- 当前日期时间
  16. current_date(); -- 当前日期
  17. current_time(); -- 当前时间
  18. date('yyyy-mm-dd hh:ii:ss'); -- 获取日期部分
  19. time('yyyy-mm-dd hh:ii:ss'); -- 获取时间部分
  20. date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j'); -- 格式化时间
  21. unix_timestamp(); -- 获得unix时间戳
  22. from_unixtime(); -- 从时间戳获得时间
  23. -- 字符串函数
  24. length(string) -- string长度,字节
  25. char_length(string) -- string的字符个数
  26. substring(str, position [,length]) -- strposition开始,取length个字符
  27. replace(str ,search_str ,replace_str) -- str中用replace_str替换search_str
  28. instr(string ,substring) -- 返回substring首次在string中出现的位置
  29. concat(string [,...]) -- 连接字串
  30. charset(str) -- 返回字串字符集
  31. lcase(string) -- 转换成小写
  32. left(string, length) -- string2中的左边起取length个字符
  33. load_file(file_name) -- 从文件读取内容
  34. locate(substring, string [,start_position]) -- instr,但可指定开始位置
  35. lpad(string, length, pad) -- 重复用pad加在string开头,直到字串长度为length
  36. ltrim(string) -- 去除前端空格
  37. repeat(string, count) -- 重复count
  38. rpad(string, length, pad) --在str后用pad补充,直到长度为length
  39. rtrim(string) -- 去除后端空格
  40. strcmp(string1 ,string2) -- 逐字符比较两字串大小
  41. -- 聚合函数
  42. count()
  43. sum();
  44. max();
  45. min();
  46. avg();
  47. group_concat()
  48. -- 其他常用函数
  49. md5();
  50. default();

MySQL入门看这一篇就够了的更多相关文章

  1. Mybatis入门看这一篇就够了

    什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  2. Spring入门看这一篇就够了

    前言 前面已经学习了Struts2和Hibernate框架了.接下来学习的是Spring框架...本博文主要是引入Spring框架... Spring介绍 Spring诞生: 创建Spring的目的就 ...

  3. Git入门看这一篇就够了! (转)

    Git 的三种状态 Git 有三种状态,你的文件可能处于其中之一: 已提交(committed):数据已经安全的保存在本地数据库中. 已修改(modified):已修改表示修改了文件,但还没保存到数据 ...

  4. JSON入门看这一篇就够了

    什么是JSON JSON:JavaScript Object Notation [JavaScript 对象表示法] JSON 是存储和交换文本信息的语法.类似 XML. JSON采用完全独立于任何程 ...

  5. Python + Appium 自动化操作微信入门看这一篇就够了

    简介 Appium 是一个开源的自动化测试工具,支持 Android.iOS 平台上的原生应用,支持 Java.Python.PHP 等多种语言. Appium 封装了 Selenium,能够为用户提 ...

  6. RabbitMQ入门看这一篇就够了

    一文搞懂 RabbitMQ 的重要概念以及安装 一 RabbitMQ 介绍 这部分参考了 <RabbitMQ实战指南>这本书的第 1 章和第 2 章. 1.1 RabbitMQ 简介 Ra ...

  7. Spring Cloud入门看这一篇就够了

    目录 SpringCloud微服务 架构演进 服务调用方式: Euraka服务注册中心 注册中心 服务提供者(服务注册) 服务消费者(服务发现) 服务续约 失效剔除和自我保护 Consul 特性 Co ...

  8. jQuery入门看这一篇就够了

    一.选择器 1.基本 名称 用法 描述 #id $("#myDiv"); 根据给定的ID匹配一个元素 element $("div"); 根据给定的元素标签名匹 ...

  9. 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了

    title author date CreateTime categories win10 uwp win2d 入门 看这一篇就够了 lindexi 2019-5-25 20:0:52 +0800 2 ...

随机推荐

  1. win10,安装 vmware 后没有虚拟网卡,导致虚拟机没有 ip

    1.确认关闭windows firewall 服务,最保险的关闭时先把服务改为手动再关闭防止塔自动启动! 2.确认开启Device  Install Service .Device Setup Ser ...

  2. c++函数声明的位置对函数重载的影响

    c++为了兼容c,也是采用(假)单遍编译.这特别影响函数重载决议(当c++编译器读到一个函数调用语句时,它必须从目前已看到的同名函数中选出最佳函数,哪怕后面的代码中出现了更合适的匹配) 1 #incl ...

  3. oracle的迁移工作

    1.创建新数据库用户 1).创建用户和分配权限 sqlplus / as sysdba create user ENFRC_TEST_GZ_TMP identified by ENFRC_TEST_G ...

  4. MySQL获取webshell的几种方式

    select ... into outfile 需要满足的条件 对web目录有写权限 GPC关闭(GPC:是否对单引号转义) 有绝对路径(读文件可以不用,写文件需要) 没有配置secure-file- ...

  5. 02python开发之基本运算符

    02 python开发之基本运算符 目录 02 python开发之基本运算符 2 基本运算符 2.1 算数运算符 2.1.1 种类 2.1.2 用法 2.2 比较运算符 2.2.1 种类 2.2.2 ...

  6. MathType总结编辑括号的类型(中)

    MathType中的符号模板多种多样,能够满足各类用户的使用需求.即使是一些不常用的符号也有相应的模板,因为在工作学习中我们都需要他们,只是有的用的多有的用的少而已,下面我们就一起来看看公式编辑器编辑 ...

  7. 教你用Vegas Pro制作视频的遮罩转场特效

    很多小伙伴在接触了Vegas之后,都想利用Vegas制作出各种酷炫的特效.小编也是一样. 今天,小编就和大家分享一下,小编近期学会的遮罩转场特效. 首先想要制作遮罩转场效果,需要的素材有:至少两个图片 ...

  8. springboot打jar包将引用的第三方包、配置文件(.properties、.xml)、静态资源打在包外

    1.外置配置文件 Springboot读取核心配置文件(.properties)的外部配置文件调用方式为 jar包当前目录下的/config目录 因此要外置配置文件就在jar所在目录新建config文 ...

  9. echarts柱状图接口提供的数据是数值,要在顶部展示百分比

    查阅echarts配置文档,柱状图并没有类似于饼图的直接展示百分比的参数,所以需要自己配置. window.onload = function () { var list1=[25.02,19.76, ...

  10. IDEA创建web工程,不用Archetype(超简单)

    Idea不用Archetype创建Web项目 以新建模块为例. 新建Maven项目 不勾选[Create from artchetype],直接Next pom中添加一句话: <artifact ...