数据库1mysql安装,DDL/DML,DQL,外键约束,多表/子查询,事务,登陆案例,预编译,连接池,jdbcTemplate方法,redis安装,操作,持久化,Jedis,总结

Posted 码农编程录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库1mysql安装,DDL/DML,DQL,外键约束,多表/子查询,事务,登陆案例,预编译,连接池,jdbcTemplate方法,redis安装,操作,持久化,Jedis,总结相关的知识,希望对你有一定的参考价值。

文章目录


1.mysql安装:存储:集合(内存:临时),IO流(硬盘:持久化)

1.1 服务端:双击mysql-installer-community-5.6.22.0.msi

mysql安装包:链接:https://pan.baidu.com/s/18Ctus6BLVrECZP0W-QKtfw 提取码:94s9。




上面next,execute安装后,下面开始配置。



1.2 客户端:命令行输入mysql -u…实际是如下安装路径的bin文件夹的mysql.exe

命令行java -version要配环境变量,看mysql有没有运行,只能从任务管理器看有没有mysql的进程。

win下cmd输入:完整版没有括号:mysql -h(host) 127.0.0.1 -P(port) 3306 -u(username) root -p(password)。简略版:mysql -u root -p。

可视化工具navicat链接:https://pan.baidu.com/s/11qAEA7yEGSIz6J9GIC_S6A 提取码:1w9n。navicat免安装链接:https://pan.baidu.com/s/1zanhYyyNsUXajI-czfW7KA 提取码:om5g。

2.DDL/DML:char不用动态变化,效率高

如下中间蓝框里一个数据库相当于一个excel表,紫色框里一个table相当于excel表里的一个sheet。use 数据库相当于双击打开excel表格,select查看函数返回值,desc全称description,like复制表结构,change 旧字段 新字段 新类型

数据库名字不建议修改,用数据库备份改名(新建一个数据库,把原数据库数据复制过来)。mysql中utf-8中-无法识别,用utf8。ISO-8859-1用latin1。

注意(),逗号,分号。

如下数(整小)日字,oracle两个不同:number包含整小,varchar2。

选用timestamp而不用datetime,因为datetime不会自动设置时间。


int(11)默认11位不用写出来,2147483647即21亿10位,如果有负数还有最前面一位是符号位,所以一共11位

如下是表记录,select非常多,删除只是记录,表结构还在。


DDL后面不需要加from等词,D【cdat】CM【idu】Q。

如下单引号可加可不加。


如下要写两个add。





3.DQL:select(相当于System.out)第一个但在倒数第二执行

如下3中第一排序字段相同的里面再进行第二排序。




如下查询id是1或3或5的学生。



d低下降,只要有数字都比null大。



如下有英语成绩有6个,不能代表总人数,缺考没算入。


select后的第一个字段要和group by后同。



如下是select语句执行顺序,红字书写顺序必须这样。

sql只有一种情况报错:语法写错。如下索引越界不会报错。

page和count是前端传来的两个参数,count不用变。

数量(count(*))降序只要一个(limit 1)。

如下将db3数据库整个连数据备份,本质create,insert。

记住mysqldump和source。

4.约束和自增长:字段约束(字段的赋值规范)/主键约束(唯一非空且一张表只有一个主键)



如下验证主键唯一和非空,如下两个框都报错。








如下的Null列表示是否允许为空。

5.单表缺点和外键约束:多从外 引出

多表是外键约束的前提,外键约束解决下面多表的2个问题,add…多了一条线。alter table emploee drop foreign key fk_001。

如上是在已有表添加外键,如下建表就添加(开发中常用)。


如果要删除department表的id为001即整个研发部门,需要先在employee表中删除id=001的很多记录,很麻烦。现在想要删除department的001部门时employee为001的行也一起删了,所以用外键级联操作,如下create table …中省略同上。

6.三种多表关系:中间表两外键:一对一(简历),一对多(员工,部门),多对多(学生,课表)





7.多表查询:表…join表on

CREATE DATABASE day03;
USE day03;
-- 创建部门表
CREATE TABLE dept (
  id INT PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
-- 创建员工表
CREATE TABLE emp ( 
  id INT PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(10),
  gender CHAR(1),   -- 性别
  salary DOUBLE,   -- 工资
  join_date DATE,  -- 入职日期
  dept_id INT
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);

如下要查出有用的记录需要emp.dept_id(emp外键)=dept.id(dept主键)。



因为select * ,所以将两个橙色横框拼接起来,棕色框。

7.1 外连接:左外=左表+内连接

如下注意记住左表不动。

如下第一个内连接没有销售部(销售部没有和员工表任何数据相交),第二个有销售部。



union all不去重,左外连接+右外连接。

8.子查询:优先于主查询产生结果


如下执行两句sql,要连接两次数据库,子查询一般要写在()里。


如下1,2是dept_id,可以把in换成 = any

如下第一行和第二行效果相同。

如下两个select等价。

如下还是写上面的题目,如果用内连接,沙僧会没有,左外或右外连接都可以。

如下将上面的id1列去除(即将dept表的id列去除不显示)。

on比where先执行。

-- 11111111111111111111111111111111111111111111111111111111111111111部门表
CREATE TABLE dept (
  id INT PRIMARY KEY PRIMARY KEY, -- 部门id
  dname VARCHAR(50), -- 部门名称
  loc VARCHAR(50) -- 部门位置
);
-- 添加4个部门
INSERT INTO dept(id,dname,loc) VALUES 
(10,'教研部','北京'),
(20,'学工部','上海'),
(30,'销售部','广州'),
(40,'财务部','深圳');

-- 1111111111111111111111111111111111111111111111111111111职务表,职务名称,职务描述
CREATE TABLE job (
  id INT PRIMARY KEY,
  jname VARCHAR(20),
  description VARCHAR(50)
);
-- 添加4个职务
INSERT INTO job (id, jname, description) VALUES
(1, '董事长', '管理整个公司,接单'),
(2, '经理', '管理部门员工'),
(3, '销售员', '向客人推销产品'),
(4, '文员', '使用办公软件');

-- 11111111111111111111111111111111111111111111111111111111111111111111员工表
CREATE TABLE emp (
  id INT PRIMARY KEY, -- 员工id
  ename VARCHAR(50), -- 员工姓名
  job_id INT, -- 职务id
  mgr INT , -- 上级领导
  joindate DATE, -- 入职日期
  salary DECIMAL(7,2), -- 工资
  bonus DECIMAL(7,2), -- 奖金
  dept_id INT, -- 所在部门编号
  CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
  CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);
-- 添加员工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES 
(1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL,20),
(1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00',30),
(1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00',30),
(1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),
(1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),
(1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),
(1007,'刘备',2,1009,'2001-09-01','24500.00',NULL,10),
(1008,'猪八戒',4,1004,'2007-04-19','30000.00',NULL,20),
(1009,'罗贯中',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10);

-- 1111111111111111111111111111111111111111111111111111111111111111工资等级表
CREATE TABLE salarygrade (
  grade INT PRIMARY KEY,
  losalary INT,
  hisalary INT
);
-- 添加5个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES 
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);







如下以dept为主体,分组后再进行count聚合。



因为d.id是主键唯一,所以用group by d.id,效果如下。

坑1:如上财务部没人也需要写0,所以如下用外连,如下第一个sql产生效果同上面第一个,就多了财务部一行。



count(*)是整行记录。

9.事务:一组操作,要么同时成功,要么同时失败






如下若在执行一次sql前执行一次start transaction,若不commit,刷新数据库不显示。

10.四个接口:左java.sql包下的DCSR,右com.mysql.jdbc.Driver


如下jdbc是父类引用。

如下mchange. .和c3p0. .一起。第一个导入的是mysql-connector…。

如下代码第一行new Driver()是导入com.mysql.jdbc(用mysql实现好的,就是上面导入的mysql-connector..jar包)而不是java.sql(自己不会重写抽象方法)下,参数是接口类型需要传入接口的实现类对象即new Driver()。

registerDriver相当于set方法,get获取的是mysql.Driver.connect方法返回的Connection类即com.mysql.jdbc.JDBC4Connection(有mysql.的都是导入的jar包)。

加载DriverManager这个类用到打破双亲类加载:DriverManager是jdk自带的类,DriverManager类使用的是bootstrap引用类加载器。数据库是用户类用bootstrap加载不合适,所以DriverManager去加载h2的Driver需要把当前引用类加载器替换为当前系统或当前线程的应用app类加载器。

package com.itheima01.jdbc;
import com.mysql.jdbc.Driver;
import java.sql.*;

public class JdbcDemo  
    public static void main(String[] args) throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException 
        //1. 注册驱动 (注意: 导入的mysql的驱动)
        /*
        *   A. 查看mysql.Driver源码: 点new Driver()中Driver看源码
        *       发现static 代码块里 已经注册了驱动 -> 驱动自注册 相当于set一次就行
        *       带来问题: 外部的注册没有意义(重复注册)
        * 
        *       解决: 保证mysql.Driver类被加载(静态代码块就会执行),如下两种方案:
        *          1. 创建对象
        *          2. 反射:a. 节省内存
        *                  b. 跟驱动包的关联只剩一个字符串:"com.mysql.jdbc.Driver"
        *          待会将字符串写入配置文件,只要改配置文件就行 就会跟 mysql驱动包的彻底解耦 
        */

//111111111111111111111111111111111111111111111111111111111111111111111111111111111111
// DriverManager.registerDriver(new Driver()); //这行重复注册,下行new了就会加载 源码里的静态代码块,所以这行=下行

//new Driver(); // Class对象 + 普通实例 //只要用了这个类,这个类就会被加载内存中方法区 //自动导包
        // new Driver()的内存消耗等价于下面两行: 其实只需要calss对象,不需要实例                  
		// Class<?> clazz = Class.forName("com.mysql.jdbc.Driver"); //获取这个类的class对象
		// Object obj = clazz.newInstance(); //利用class对象调用其空参构造来创建一个实例

        Class.forName("com.mysql.jdbc.Driver"); //获取Class对象,没有普通实例,因为普通实例没有意义 //用反射,com.mysql.jdbc.Driver这个类也会被加载

//111111111111111111111111111111111111111111111111111111111111111111111111111111111111
		 //2. 获取连接
        /*
        *   只要涉及两个软件通信 : 网络三要素(必要非充分:一定要,但是有它们三不一定够如多了资源位置)
        *       1. 协议 :       jdbc:mysql  (主协议:子协议)
        *       2. ip :         数据库所在的计算机(自己:localhost或127.0.0.1)
        *       3. port :       mysql数据库3306
        *       资源位置:   数据仓库的名称
        *       
        *       协议://ip:port/资源位置
        *       https://www.baidu.com:443
        */
//        String url = "jdbc:mysql://localhost:3306/day03";  //day03是数据库
        String url = "jdbc:mysql:///day03"; //ip:localhost port:3306 可以省略
        String user = "root";
        String pwd = "1234";
        Connection conn = DriverManager.getConnection(url, user, pwd);
        System.out.println("conn:" + conn); //引用类型打印地址
        
//1111111111

以上是关于数据库1mysql安装,DDL/DML,DQL,外键约束,多表/子查询,事务,登陆案例,预编译,连接池,jdbcTemplate方法,redis安装,操作,持久化,Jedis,总结的主要内容,如果未能解决你的问题,请参考以下文章

什么是DQL,DML,DDL,DCL

DDL DML DQL DCL

DDL,DML,DQL

MySQL语句使用。

一张表格阐释DDL,DML,DCL,DQL

MySQL基础篇(DDL,DML,DQL,DCL详细讲解)