基于版本:mysql-5.7.19-winx64,mysql-connector-java-5.1.47

初识MySQL

数据库分类

关系型数据库: (SQL)

  • MySQL,Qrcale,Sql Server
  • 通过表和表之间,行和列之间的关系进行数据的存储。
    • 学员信息表,考勤表 …

非关系型数据库: (NoSQL) Not Only

  • Redis,MongDB
  • 非关系型数据库,对象存储,通过对象的自身性质的属性来决定

DBMS(数据库管理系统)

  • 数据库关系软件,科学有效的管理数据。维护和获取数据;
  • MySQL,数据库管理系统。

配置MySQL

下载安装MySQL

尽量下载安装 压缩包版

path中添加mysql的安装文件的bin文件夹

在mysql目录下新建 my.ini文件

配置my.ini

  1. [mysqld]
  2. basedir=目录\
  3. datadir=目录\data\ #不用自己创建目录,会自动创建
  4. port=3306 #端口号
  5. skip-grant-tables #跳过密码验证

启动管理员模式下的CMD,将路径切换到mysql下的bin目录,

输入mysqld -install ——安装mysql

输入mysqld --initialize-insecure --user=mysql ——初始化数据文件

输入net start mysql ——启动mysql服务,进去修改密码(密码可以为空)

输入mysql -u root -p ——u为user,p为password

输入update mysql.user set authentication_string=password('123456') where user='root' and Host='localhost'; ——进入界面修改密码

最后输入flush privileges; ——刷新权限

修改my.ini文件删除跳过密码验证或者 # 注释掉


输入net stop mysql 停止 mysql服务

-p后不加空格, sql语句后要有分号;

exit ——暴力退出

sc delete mysql 清空服务——慎用


工具:

数据库名:xxx 引擎:InnoDB 字符集:utf8 核对:utf8_general_ci


SQL命令:

  1. -- 单行注释
  2. /*
  3. 释*/
  4. mysql -u root -p --连接欸数据库
  5. show databases; --查看全部数据库
  6. use school --切换数据库 use数据库名
  7. show tables; --查看数据库的所有的表
  8. describe student; --显示数据库中所有表的信息
  9. create database westos; --创建一个数据库
  10. exit; --退出连接

数据库xxx语言

DDL 定义

DML 操作

DQL 查询

DCL 控制

操作数据库

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

MySQL语句不区分大小写

操作数据库

创建数据库: [中括号里面的内容表示可选可不选]

  1. CREATE DATABASE [IF NOT EXISTS] westos;

删除数据库:

  1. DROP DATABASE [IF EXISTS] westos;

使用数据库:

  1. USE `school` --tab的上面,如果表名或者字段名是一个特殊字符,需要带
  1. 查看数据库:
  2. ```sql
  3. show databases --查看所有的数据库

数据库列类型

数值

  • tinyint 十分小的数据 1字节
  • smallint 较小的数据 2字节
  • mediumint 中等大小的数据 3个字节
  • int 标准的整数 4个字节
  • bigint 较大的数据 8个字节
  • float 浮点数 4个字节
  • double 浮点数 8个字节
  • 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

数据库的字段属性(重点)

Unsigned :

  • 无符号整数
  • 声明了该列不能声明为负数

zerofill :

  • 0填充的
  • 不足的位数,用0来填充

自增 :

  • 自动在上条记录上 +1(默认)
  • 通常用来设计唯一的主键~ index,必须为整数类型
  • 可以自定义初始值和步长

非空 : —— NULL / not null

  • 假设设置为 not null,如果不给它赋值,就会报错;
  • NULL,如果不填写,默认值为null;

默认 :

  • 设置为默认值
  • 不指定值就为默认值

拓展 :

  1. /*
  2. 每个表,都必须存在以下五个字段——做项目使用,表示记录存在的意义
  3. id 主键
  4. 'version' 乐观锁
  5. is_delete 伪删除
  6. gmt_create 创建时间
  7. gmt_update 修改时间
  8. */

创建数据库表

例:

  1. --AUTO_INCREMENT 自增
  2. --表的名称和字段尽量使用 `` 括起来
  3. --字符串使用单引号或双引号
  4. --所有语句结尾都要加 , 最后一个可不加
  5. --PRIMARY KEY 主键,一般一表只有唯一的主键
  6. --COMMIT 注释,DEFAULT 为默认值
  7. CREATE TABLE IF NOT EXISTS`teacher` (
  8. `id` INT(4) NOT NULL COMMENT '学号'
  9. `NAME` VARCHAR(30) NOT NULL DEFAULT '默认值' COMMIT '姓名',
  10. PRIMARY KRY(`id`)
  11. )ENGING=INNODB DEFAULT CHARSET=utf8
  12. CREATE IF NOT EXISTS DATABASE `school`
  13. CREATE TABLE IF NOT EXISTS `student`(
  14. `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT'序号',
  15. `name` VARCHAR(20) NOT NULL DEFAULT'匿名' COMMENT'姓名',
  16. `pwd` VARCHAR(20) NOT NULL DEFAULT'123456' COMMENT'密码',
  17. `sex` INT(2) NOT NULL DEFAULT'1' COMMENT'性别',
  18. `email` VARCHAR(50) NOT NULL COMMENT'邮箱',
  19. `bir` DATETIME DEFAULT NULL COMMENT'出生日期',
  20. `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
  21. PRIMARY KEY(`id`)
  22. )ENGINE=INNODB DEFAULT CHARSET=utf8

格式 :

  1. CREATE TABLE [IF NOT EXISTS] `表名`
  2. '字段名' 列类型 [属性] [索引] [注释],
  3. '字段名' 列类型 [属性] [索引] [注释],
  4. ……
  5. '字段名' 列类型 [属性] [索引] [注释]
  6. )[表类型][字符集设置][注释]

常用命令 :

  1. SHOW CREATE DATABASE school --查看创建数据库的语句
  2. SHOW CREATE TABLE student --查看student数据表的定义语句
  3. DESC student --显示表的结构

数据表类型

  1. --关于数据库引擎
  2. /*
  3. INNODB 默认使用
  4. MYISAM 早些年使用
  5. */
MYISAM INNODB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间的大小 较小 较大,约为2倍

常规使用操作:

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

在物理空间存在的位置

所有的数据库文件都存在data目录下,一个文件夹对应一个数据库,其本质还是文件的存储。

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

  • INNODB在数据库表中只有一个*.frm文件,以及上级目录下的 ibdata1 文件
  • MYISAM对应文件
    • *.frm 表结构的定义文件
    • *.MYD 数据文件 (data)
    • *.MYL 索引文件(index)

==设置数据库的字符集编码==

  1. CHARSET=utf8

不设置,回事mysql默认字符集编码

默认编码:Latin1,不支持中文

->可以在my.ini中配置默认编码

  1. charcater-set-server=utf8 --不推荐

修改删除表

修改

  1. SHOW CREATE DATABASE school -- 查看创建数据库的语句
  2. SHOW CREATE TABLE student -- 查看student数据表的定义语句
  3. DESC student -- 显示表的结构
  4. -- 修改表 ALTER TABLE 旧表名 RENAME AS 新表名
  5. ALTER TABLE teacher RENAME AS teacher1
  6. -- 增加表的字段 ALTER TABLE 表名 ADD 字段名 列属性
  7. ALTER TABLE teacher1 ADD age INT(11)
  8. -- 修改表的字段 (重命名,修改约束)
  9. -- ALTER TABLE 表名 MODIFY 字段名 列属性
  10. ALTER TABLE teacher1 MODIFY age VARCHAR(11) -- 修改约束
  11. -- ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性
  12. ALTER TABLE teacher1 CHANGE age agel INT(1) -- 字段重命名
  13. -- 删除表的字段
  14. -- ALTER TABLE 表名 DROP 字段
  15. ALTER TABLE teacher1 DROP age1


删除

  1. -- 删除表(如果表存在再删除)
  2. DROP TABLE IF EXISTS teacher1

所有的创建和删除操作尽量加上判断
注意点:

  • `` 字段名,使用这个包裹
  • 注释 — /**/
  • sql关键字大小写不敏感,建议写小写
  • 所有符号全部使用英文

MySQL数据管理

外键 (了解即可)

方式一,在创建表的时候,增加约束(麻烦,比较复杂)

  1. CREATE TABLE IF NOT EXISTS `grade` (
  2. `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年纪id',
  3. `gradename` VARCHAR(20) NOT NULL COMMENT '年纪名称',
  4. PRIMARY KEY (`gradeid`)
  5. )ENGINE=INNODB DEFAULT CHARSER=utf8
  6. -- 学生表的gradeid 字段 要去引用年纪表的 gradeid
  7. -- 定义外键key
  8. -- 给这个外键添加约束 (执行引用) references 引用
  9. CREATE TABLE IF NOT EXISTS `student` (
  10. `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
  11. `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  12. `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
  13. `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
  14. `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
  15. `gradeid` INT(10) NOT NULL COMMENT '学生的年级',
  16. `address` VARCHAR(100) NOT NULL COMMENT '家庭住址',
  17. `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
  18. PRIMARY KEY(`id`),
  19. KEY `FK_gradeid` (`graddid`),
  20. CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`aradeid`)
  21. )ENGINE=INNODB DEFAULT CHARSER=utf8
  1. 未测试: navicat注意第一段最后加;分号 --来自弹幕<br />删除有外键关系的表的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)

方式二 :创建表成功之后,增添外键约束

  1. CREATE TABLE IF NOT EXISTS `grade` (
  2. `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年纪id',
  3. `gradename` VARCHAR(20) NOT NULL COMMENT '年纪名称',
  4. PRIMARY KEY (`gradeid`)
  5. )ENGINE=INNODB DEFAULT CHARSER=utf8
  6. -- 学生表的gradeid 字段 要去引用年纪表的 gradeid
  7. -- 定义外键key
  8. -- 给这个外键添加约束 (执行引用) references 引用
  9. CREATE TABLE IF NOT EXISTS `student` (
  10. `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
  11. `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  12. `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
  13. `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
  14. `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
  15. `gradeid` INT(10) NOT NULL COMMENT '学生的年级',
  16. `address` VARCHAR(100) NOT NULL COMMENT '家庭住址',
  17. `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
  18. PRIMARY KEY(`id`)
  19. )ENGINE=INNODB DEFAULT CHARSER=utf8
  20. -- 创建表时无外键关系
  21. ALTER TABLE `srudent`
  22. ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `geade`(`gradeid`);
  23. -- ALTER TABLE `表` ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 那个表(那个字段);

以上操作均为物理外键,数据库级别的外键,不建议使用!(避免数据库过多造成的困扰,了解即可)
最佳实践

  • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
  • 我们想使用多张表的数据,想使用外键(程序去实现)

DML语言 (全部记住)

数据库的意义:数据存储,数据管理

DML语言

  • Insert
  • update
  • delete

添加

insert

  1. --- 插入语句(添加)
  2. -- insert into 表名([字段名1,字段2,字段3]) valuse('值1'),('值2'),('值3'),……
  3. INSERT INTO `grade`(`geadename`) VALUSE('大四')
  4. -- 由于主键自增我们可以省略(如果不写表的字段,他就会一一匹配)
  5. INSERT INTO `grade` VALUSE('大三')
  6. --- INSERT INTO `grade` VALUSE('大三'),null 类似这种
  7. -- 一般写插入语句,我们一定要数据和字段一一对应!
  8. --插入多个字段
  9. INSERT INTO `grade`(`geadename`)
  10. VALUSE('大二'),('大一')
  11. INSERT INTO `student`(`name`) VALUES ('张三')
  12. INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('张三','aaaaaa','男')
  13. INSERT INTO `student`(`name`,`pwd`,`sex`)
  14. VALUES ('李四','bbbbbb','男'),('王五','ccccccccc','男')

语法:insert into 表名([字段名1,字段2,字段3]) valuse('值1'),('值2'),('值3'),……

注意事项:

  1. 字段和字段之间使用英文逗号隔开
  2. 字段是可以省略的,但是后面的值必须要一一对应,不能少
  3. 可以同时插入多条数据,VALUES后面的值,需要使用,逗号隔开即可VALUES(),(), ...

修改

update 修改谁 (条件) set 原来的值 = 新值

  1. -- 修改学员名字,带了简介
  2. UPDATE `student` SET `name`='6b92d6' WHERE id = 1;
  3. -- 不指定条件的情况下,会改动所有的表
  4. UPDATE `student` SET `name`='dafran'
  5. -- 修改多个属性,逗号隔开
  6. UPDATE `student` SET `name`='dafran',`email`='1412148742@qq.com' WHERE id = 1;
  7. UPDATE `student` SET `name`='cola' WHERE id BETWEEN 1 AND 3;
  8. -- 通过多个条件定位数据
  9. UPDATE `student` SET `name`='6b92d6' WHERE `name`='dafran' AND sex='女'
  10. -- 语法:
  11. -- update 表名 set column_name = value,[column_name = value,……] where [条件]

条件:where子句 运算符 id 等于某值,大于某值,在某个区间内修改……

操作符会返回布尔值

操作符 含义 范围 结果
= 等于 5=6 false
<>或 != 不等于 5<>6 ture
> 大于
< 小于
>= 大于等于
<= 小于等于
between … and … 某个范围内 [2,5]
AND && 5>1 and 3< 1 false
OR || 5>1 and 3< 1 ture
  1. -- 通过多个条件定位数据
  2. UPDATE `student` SET `name`='6b92d6' WHERE `name`='dafran' AND sex='女'

语法:update 表名 set column_name = value,[column_name = value,……] where [条件]

注意:

  • column_name 是数据库列的值,尽量带上``
  • 条件,筛选的条件,如果没有指定的值,则会修改所有的列
  • value,是一个具体的值,也可以是一个变量
  • 多个条件,用英文,逗号隔开
  1. UPDATE `student` SET `birthday`= CURRENT_TIME WHERE `name`='长江7号' AND sex='女'

删除

delete 命令

语法:delete from 表名 [where 条件]
— 删除数据(避免这样写,会全部删除)
DELETE FROM student

— 删除指定数据
DELETE FROM student WHERE id = 1;

TRUNCATE 命令

作用:完全清空一个数据库表,表的结构和索引约束不会变!
—- 清空 student 表
TRUNCATE student

delete 的 TRUNCATE 区别

  • 相同点:都能删除数据,都不会删除表结构
  • 不同:
    • TRUNCATE 重新设置 自增列 计数器会归零
    • TRUNCATE 不会影响事务

— 测试 delete 和 TRUNCATE 区别

DELETE FROM test — 不会影响自增
TRUNCATE TABLE test — 自增会归零
了解即可:DELETE删除的问题,重启数据库,现象

  • InnoDB 自增会重新从1开始(存在内存当中,断电即失)
  • MyISAM 继续从上一个自增开始(存在文件种,不会丢失)

DQL查询数据 (最重点)

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

  • 所有的查询操作都用它 Select
  • 简单的查询,复杂的查询它都能做
  • 数据库中最核心的语言,重要的语句
  • 使用频率最高的语句

    查询指定字段

    ```sql — 查询全部的学生 select 字段 from 表 SELECT * FROM student

— 查询指定字段 SELECT StudentNo,StudentName FROM student

— 别名,给结果起一个名字 AS 可以给字段起别名,也可以给表起别名 SELECT StudentNo AS 学号,StudentName AS 学生姓名 FROM student AS S

—函数 Concat(a,b) SELECT CONCAT(‘姓名:’,StudentName) AS 新名字 FROM student

  1. 语法:`SELECT 字段,... FROM 表`
  2. <a name="fiu98"></a>
  3. #### 去重 distinct
  4. 作用:去除SELECT 查询出来的结果中重复的数据,重复的数据只显示一条
  5. ```sql
  6. -- 查询一下有哪些同学参加了考试,成绩
  7. SELECT * FROM result -- 查询全部的考试成绩
  8. SELECT `StudentNo` * FROM result -- 查询有哪些同学参加考试
  9. SELECT DISTINCT `StudentNo` * FROM result -- 发现重复数据,去重
  10. 数据库的列(表达式)
  11. SELECT VERSION() -- 查询系统版本(函数)
  12. SELECT 100*3-1 AS 计算结果 -- 用来计算(表达式)
  13. SELECT @@auto_increment_incrment -- 查询自增的步长(变量)
  14. -- 学员考试成绩 + 1分查看
  15. SELECT `StudentNo`,`StudentResult`+1 AS '提分后' FROM result

数据库中的表达式:文本值,列,NULL,函数,计算表达式,系统变量……
select 表达式 form 表


JDBC

  1. package com.dafran.lesson01;
  2. import java.sql.*;
  3. import java.text.MessageFormat;
  4. /**
  5. * @author dafran
  6. * @version 1.0
  7. * @date 2020-07-23 21:43
  8. */
  9. //第一个JDBC程序
  10. public class JdbcFirstDemo {
  11. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  12. //1.加载驱动
  13. Class.forName("com.mysql.jdbc.Driver"); //固定写法
  14. //2.用户信息和Url
  15. useUnicode=true&characterEncoding=uft8&useSSL=true
  16. String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
  17. String username = "root";
  18. String password = "123456";
  19. //3.连接成功,返回数据库对象
  20. Connection connection = DriverManager.getConnection(url, username, password);
  21. //4.执行SQL对象
  22. Statement statement = connection.createStatement();
  23. //5.执行SQL对象,去执行SQL,可能存在结果,执行返回结果
  24. String sql ="SELECT * FROM users";
  25. ResultSet resultSet = statement.executeQuery(sql); //返回结果集,结果集中封装了我们查询出来的结果
  26. while(resultSet.next()) {
  27. System.out.println("id="+resultSet.getObject("id"));
  28. System.out.println("name="+resultSet.getObject("NAME"));
  29. System.out.println("pwd="+resultSet.getObject("PASSWORD"));
  30. System.out.println("email="+resultSet.getObject("email"));
  31. System.out.println("birthday="+resultSet.getObject("birthday"));
  32. System.out.println("-------------------------------------------");
  33. }
  34. //6.释放连接
  35. resultSet.close();
  36. statement.close();
  37. connection.close();
  38. }
  39. }

步骤总结:

  • 1.加载驱动
  • 2.用户信息和Url
  • 3.连接成功,返回数据库对象 connection
  • 4.执行SQL对象 statement
  • 5.执行SQL对象,去执行SQL,可能存在结果,执行返回结果 resultSet ,遍历链表
  • 6.释放连接