Mysql

``1,初识数据库
javaEE:企业级java开发 web
前端(页面:展示,数据!)
后台(连接点:连接数据库JDBC,连接前端(控制,控制视图跳转,和给1前端传递数据))
数据库(存数据,Txt,Excel,wor)

什么是数据库
数据库(DB:DataBase)
1.2数据库分类
关系型数据库(SQL):
Mysql ,Oracle,Sql Service ,DB2,SQLlite
通过表和表之间,行和列之间的关系进行数据的存储

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

DBMS(数据库管理系统)
数据库的管理软件,科学有效的管理我们的数据,维护和获取数据
MySQL
连接数据库
命令行连接
Mysql -uroot -p
123456
SHOW CREATE DATABASE hjc --查看创建数据库的语句
SHOW CREATE DATABASE student --查看数据表的定义
DESC xxxxxx – 显示表的结构
-------修改表
ALTER TABLE 表名 RENAME AS 新表名
-------增加表的字段
ALTER TABLE 表名 ADD 属性名 数据类型
-------修改表的字段(修改约束,重命名)
ALTER TABLE 表名 MODIFY 字段名 数据类型
ALTER TABLE 表名 CHANGE 字段名 新的字段名 数据类型
-------删除表的字段
ALTER TABLE 表名 DROP 字段名
------删除表(如果表存在再删除)
DROP TABLE IF EXISTS 表名
所有的创建和删除操作尽量加上判断,防止跑错

注意点
所有字段名使用``包裹
注释-- 或者/**/
Sql 关键字大小写不敏感 建议写小写
所有的符号都用英文半角

3Mysql 数据管理
3.1-------------外键(了解即可)
3.2------------DML语言(全部记住)
3.3添加
INSERT INTO 表名([字段1,字段2…])
Values(‘值1’,…)
写插入语句一定要一一对应
字段用`` 值用’’
字段可以省略但后面的值要一一对应,可以同时插入多个值,中间用逗号隔开
3.4修改
Update 修改谁 (条件) set 原来的值
Update 表的名字 set 要修改的字段=’值’ where id = 1(那一行)
UPDATE wdddd SET username=‘tom’ WHERE userid = 1;

多行数据用逗号隔开
UPDATE wdddd SET username=‘jack’,userage=28 WHERE userid = 2;
Where 子句 运算符 userid 等于某个值 大于某个值 或者在那个区间
BETWEEN…add… 在某个范围内
Add 等于&&
Or 等于 ||
注意
数据库的列要用``括起来
条件,筛选的条件,如果没有指定,则修改所有的列(不可逆)
多个属性之间,使用英文逗号隔开

3.5删除
delect命令
语法:delect from 表名 [where 条件]
删除数据 (避免这样写,会全部删除)
Delect from wdddd;
删除指定数据
Delect from wdddd where id =1;

完全清空一个数据表 可以使用 TRUNCATE命令
作用:完全清空一个数据库表 表的结构和索引约束不会变
重启数据库的现象
Innodb 自增会从1开始(存在内存当中的 断电即失)
Myisam 继续从上一个自增量开始(存在文件里,不会丢失)

4,DQL查询语句(最重点)
查询一张表
Select*from 表的名称;
查询某个字段
SELECT studentno,studentname FROM student;
查询时显示别名
也可以给表起别名,避免重复 AS 表名
SELECTstudentno AS 学号, studentname AS 名字 FROM student;

拼接字符串 函数(a,b)
SELECT CONCAT(‘姓名:’,studentname) AS 新名字 FROM student

去重重复 distinct
SELECT DISTINCT studentno FROM result;
数据库的列(表达式)
查看系统版本
Select version()
计算结果
SELECT 500*55-5 AS 计算结果
Select 表达式 from 表

Where 条件查询
条件运算符
And &&
Or ||
Not !=
SELECT address FROM student
WHERE address>=10 AND address<=100000
模糊查询(区间):本质也是一种比较运算符
Between 95 and 100;
运算符 语法 描述
IS NULL A is null 如果操作符为NULL,结果为真
IS NOT NULL A is not null 如果操作符不为null,结果为真
BETWEEN A between b and c 若A在 B和C之间,则结果为真
LIKE A like b SQL匹配 如果a匹配b,结果为真
Ln A in (a1,a2,a3…) 假设a在a1, 或者a2 其中的某一个值中,结果为真

连表查询
一共七种连接 基本的三种 left join(左连接) reght join(右连接) inner join(内连接)
– =联表查询====== –
/*
查询参加了考试的同学(学号,姓名,科目编号,分数)
selectfrom student
select
from result//需要查询两个表

思路
1,分析需求,分析查询的字段来自那些表(连接查询)
2,确定使用哪种连接查询? inner join 交集
确定交叉点(这两个表中的那个数据是相同的)
判断的条件:学生的表中 studentNo = 成绩表 studentno

*/

SELECT s.`studentno`,`studentName`,`SubjectNo`,`StudentResult`
FROM student AS s
INNER JOIN  result AS r
WHERE s.`studentno` = r.`studentno`

/* Right join    

*/
SELECT s.`studentno`,`studentName`,`SubjectNo`,`StudentResult`
FROM student AS s
RIGHT JOIN result  AS r
ON S.`studentno` = R.`studentno`
/* left join    */


SELECT s.`studentno`,`studentName`,`SubjectNo`,`StudentResult`
FROM student AS s
LEFT JOIN result  AS r
ON S.`studentno` = R.`studentno`


/* 查询缺考的同学  */
SELECT s.`studentno`,`studentName`,`SubjectNo`,`StudentResult`
FROM student AS s
LEFT JOIN result  AS r
ON S.`studentno` = R.`studentno`
WHERE SubjectNo IS NULL


| 操作 | 描述|
|-inner join-|-如果表中至少有一个匹配,就返回行-|
|-right join -| 会从右表中返回所有的值,即使左表没有匹配 |
|-left join-| |会从左表中返回所有的值,即使右表中没有匹配 |
join(连接的表) on(判断的条件)
where 等值判断

/* 思考题(查询参加考试得同学信息:学号,学生姓名,科目名,分数)   
思路
1,分析需求,分析查询的字段来自那些表   student,resule,subhect(连接查询)
2,确定使用哪种连接查询? inner join  left join
确定交叉点(这两个表中的那个数据是相同的)
判断的条件:学生的表中 studentNo = 成绩表 studentno


  */
SELECT s.`studentno`,`studentName`,`subjectname`,`StudentResult`
FROM student AS s
RIGHT JOIN result  AS r
ON S.`studentno` = R.`studentno`
INNER JOIN `subject` AS su
ON r.`subjectno` = su.`subjectno`

我要查询那些数据 select
从那几个表中查 from 主表
注意想清楚那个是主表 那个是从表
xxx join 连接的从表
on 两表交叉的条件

解题思路 如果遇到多张表连 两个表两个表的连接在与其他连 慢慢来

自连接
自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。

/*  查询父子信息 将一张表拆开为两张表    */
SELECT a.`categoryname` AS '父栏目',b.`categoryname` AS '子栏目'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`

代码结果
分页和排序

       /*分页 limit 和排序 order by 
       排序 : 升序ASC,降序DESC
       根据成绩排序
       ORDER BY studentresult ASC DESC
       
      加入有100万条数据
      为什么要分页?
      要缓解数据库压力 给人的体验更好
      分页 每页之显示五条数据
      语法: limit 当前页 页面的大小             
       limit 0,5
                          公式
      第一页 limit 0,5    (1-1)*5
      第二页 limit 5,5    (2-1)*5
      第三页 limit 10,5   (3-1)*5
      第N页 limit  0,5    (n-1)*pagesize,pagesize
      pagesize:页面大小 (n-1)*pagesize起始值 n:当前页
      总页数= 数据总数/页面大小 = 总页数
            
       
       */ 
          
SELECT s.`studentno`,`studentName`,`subjectname`,`StudentResult`
FROM student AS s
INNER JOIN result  AS r
ON S.`studentno` = R.`studentno`
INNER JOIN `subject` AS sub
ON r.`subjectno`= sub.`subjectno`
ORDER BY studentresult ASC
LIMIT 0,5

/* 查询 java第一学年 课程成绩排名前十的学生,并且分数要大于80的学生信息(学号,姓名,课程名称,分数)  */
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.`studentno` = r.`studentno`
INNER JOIN `subject` AS sub
ON sub.`subjectno` = r.`subjectno`
WHERE  studentresult>=80 
ORDER BY studentresult DESC
LIMIT 0,10

事务
ACID
原子性
要么都成功,要么都失败
一致性
事务前后的数据完整性要保持一致
隔离性
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务 不能被其他事务的操作数据所干扰 事务之间要相互隔离
隔离导致的一些问题

脏读:在事务A修改数据之后提交数据之前,这时另一个事务B来读取数据,如果不加控制,事务B读取到A修改过数据,之后A又对数据做了修改再提交,则B读到的数据是脏数据,此过程称为脏读Dirty Read。

不可重复读:一个事务内在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了变更、或者某些记录已经被删除了。

幻读:事务A在按查询条件读取某个范围的记录时,事务B又在该范围内插入了新的满足条件的记录,当事务A再次按条件查询记录时,会产生新的满足条件的记录(幻行 Phantom Row)

持久性
事务一旦提交就不可逆,被持久化到数据库之中

/*  事务  

mysql 是默认开启事务自动提交的
set autocommit = 0 关闭
set autocommit = 1 开启
*/
-- 手动处理事务
-- 事务开启
/*start transaction*/ -- 标记一个事务
-- 提交
-- commit (成功)
--  持久化
-- 回滚 (失败)
/*rollback*/
-- 事务结束
-- set autocommit = 1 开启自动提交
/*  事务  

mysql 是默认开启事务自动提交的
set autocommit = 0 关闭
set autocommit = 1 开启
*/
-- 手动处理事务
-- 事务开启
/*start transaction*/ -- 标记一个事务
-- 提交
-- commit (成功)
--  持久化
-- 回滚 (失败)
/*rollback*/
-- 事务结束
-- set autocommit = 1 开启自动提交


CREATE DATABASE shou CHARACTER SET utf8 COLLATE utf8_general_ci
USE shou
CREATE TABLE `account`(
`id` INT(3) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money` DECIMAL(9,1) NOT NULL,
 PRIMARY KEY (`id`)


) ENGINE = INNODB DEFAULT CHARSET = utf8

SELECT*FROM account
INSERT INTO `account`(`name`,`money`)
VALUES ('A',2000.00),('B',10000.00)

-- 模拟转账:事务
SET autocommit = 0 -- 关闭自动提交
START TRANSACTION -- 开启一个事务

UPDATE account SET money=money-500 WHERE `name` = 'A' -- 'a'500
UPDATE account SET money=money+500 WHERE `name` = 'B' -- 'B'500
COMMIT; -- 提交事务
ROLLBACK; -- 如果失败 回滚

SET autocommit = 1 -- 结束后恢复默认值

索引
MYSQL官方对索引的定义为:索引(index) 是帮助MySQL高校获取数据的数据结构,索引的本质就是数据结构
索引的分类

1.主键索引(PRIMARY KEY)
唯一的标识,不可重复,一个表只能有一个主键
2. 唯一索引 (UNIQUE KEY)
避免重重复的列出现 唯一索引可以重复 多个列都可以标识为唯一索引
3. 常规索引 (KET/INDEX)
默认的 可以用 key,index关键字来设置

  • 全文索引 (FullText)
    快速定义数据
-- 索引的使用
-- 1,在创建表的时候给字段增加索引
-- 2,创建完毕后 增加索引
-- 显示所有的索引信息
SHOW INDEX FROM student

-- 增加一个全文索引(索引名 列明)
ALTER TABLE school.student ADD FULLTEXT INDEX `studentname`(`studentname`);

-- EXPLAIN 分析sql的执行情况
EXPLAIN SELECT * FROM student; -- 非全文索引

SELECT *FROM student WHERE MATCH(studentName) AGAINST('赵');

-- 建立一个常规的索引 id_表名_字段名 on 表(字段)
CREATE INDEX id_app_user_name ON app_user(`name`);

索引原则
索引不是越多越好
不要对进程变动数据加索引
小数据量表不需要加索引
索引一般用来加在常用来查询的字段上

索引的数据结构
数据库三大范式
第一范式
原子性
要求数据库表的每一列都是不可分割的原子数据项
第二范式
前提:必须满足第一范式
每张表只描述一件事情
第三范式
前提:满足第一和第二范式
需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关

规范性 和 性能的问题
关联查询的表不得超过三张表
考虑商业化的需求和目标 数据库的性能更加重要
在规范性能的问题的时候 需要适当的考虑一下规范性
故意给某些表增加一些冗余的字段(从多表查询变为单表查询)
故意增加一些计算列

JDBC
sun公司为了简化开发人员的(对数据库的统一)操作,提供了一个(JAVA操作数据的)规范,俗称JDBC 这些规范由厂商去做
对于开发人员 只需要掌握JDBC接口的操作即可
在架构里面有一句话,没有什么是加一层解决不了的,如果有就在加一层
java.sql
javax.sql

import java.sql.*;

public class 我的第一个JDBC {
    public static void main(String[] args) throws ClassNotFoundException,SQLException {
        //1,加载驱动
        Class.forName("com.mysql.jdbc.Driver");
//2,用户信息和url
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode-true&characterEncoding=utf8&useSSL=true&verifyServerCertificate=false";
        String username = "root";
        String password = "123456";
//3,连接成功 数据库对象
        Connection connection = DriverManager.getConnection(url,username,password);
//4,执行SQL的对象
     Statement statement = connection.createStatement();
    // statement.executeQuery();  查询操作返回 Resultset
      // statement.execute();    执行任何SQL
       //statement.executeUpdate()//更新,插入,删除 都是用这个 返回一个受影响的行数
//5,执行SQL的对象去执行SQL
        String sql = "SELECT*FROM users";
        ResultSet resultSet = statement.executeQuery(sql);//返回的结果集,结果中封装了我问全部查询出来的结果
        while(resultSet.next()){
            System.out.println("id="+resultSet.getObject("id"));
            System.out.println("name="+resultSet.getObject("NAME"));
            System.out.println("pwd="+resultSet.getObject("PASSWORD"));
            System.out.println("email="+resultSet.getObject("email"));
            System.out.println("birthday="+resultSet.getObject("birthday"));
            System.out.println("************************************");

        }
//6,释放连接
        resultSet.close();
        statement.close();
        connection.close();
    }

}

DirveManager对象
原本的写法
DriverManger.registerDriver(new com.mysql.jdbc.Driver());//因为已经封装了所以使用这个方法
Class.forName(“com.mysql.jdbc.Driver”);

URL

String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode-true&characterEncoding=utf8&useSSL=true&verifyServerCertificate=false";

//mysql – 3306
/协议://主机地址:端口号/数据库名?参数1&参数2…
//oracle – 1521
//jdbc:oracle:thin:@localhost:1521:isid

Resultset
返回结果
resultSet.getObject();//在不知道列的类型的情况下使用
// resultSet.getString();//如果知道列的类型就用指定的类型,效率更高

遍历 指针
resultSet.next()//移动到下一个

statement对象
jdbc中的statement对象用于向数据库中发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可
Statement对象的executeUpdate方法,用于向数据库发送曾,删,改的SQL语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)
Statement.executeQuery方法用于向数据库发生查询语句,executeQuery方法返回代表查询结果的ResultSet对象

CRUD操作–create
使用executeUpdate(String sql) 方法完成数据库添加操作

Statment st = conn.createStatement();
string sql = "insert into user() values()";
int num = st.executeUpdate(sql);
if(num>0){
 System.out.println("插入成功!!");
}

数据库连接池
数据库连接—执行完毕—释放
连接–释放 十分浪费系统资源
池化技术:准备一些预先的资源,过来就连接预先准备好的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值