01.数据库基础、JDBC
一、数据库
- 数据库:用于存储和管理数据的仓库。
- 数据库的特点
- 持久化储存数据,数据库就是一个文件系统。
- 方便储存和管理数据。
- 使用了统一的方式操作数据库——SQL。
- 配置
- Mysql 服务启动
- 手动
- 运行 —— services.msc,打开服务窗口启动。
- 使用管理员打开 cmd
- net start mysql : 启动 mysql 服务。
- net stop mysql : 停止 mysql 服务。
- Mysql 登录
- mysql -u root -p
- Mysql 退出
- exit
- quit
- Mysql 目录结构
- Mysql 安装目录:D:\Program Files\MySQL\MySQL Server 5.5
- 配置文件:my.ini
- Mysql 数据目录:C:\ProgramData\MySQL\MySQL Server 5.5\data
- 几个概念
- 数据库:文件夹
- 表:文件
- 数据:数据
- 几个概念
- Mysql 安装目录:D:\Program Files\MySQL\MySQL Server 5.5
- Mysql 服务启动
二、SQL
- 什么是 SQL ?
- Structured Query Language:结构化查询语言。
- 其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
- SQL 通用语法
- SQL 语句可以单行或多行书写,以分号结尾。
- 可使用空格和缩进来增强语句的可读性。
- MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
- 3 种注释
- 单行注释
- -- 注释内容
- # 注释内容(mysql 特有)
- 多行注释
- /* 注释 */
- SQL 分类
- DDL (Data Definition Language)数据定义语言
- 用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
- DML(Data Manipulation Language)数据操作语言
- 用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
- DQL(Data Query Language)数据查询语言
- 用来查询数据库中表的记录(数据)。关键字:select, where 等
- DCL(Data Control Language)数据控制语言(了解)
- 用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等
- DDL (Data Definition Language)数据定义语言
- DDL
- 操作数据库,表。
- C(Create):创建
- 创建数据库
- create database 数据库名称 ;
- 创建数据库,判断不存在,再创建
- create database if not exits 数据库名称 ;
- 创建数据库,并指定字符集
- create database 数据库名称 character set 字符集名 ;
- 创建数据库
- R(Retrieve):查询
- 查询所有数据库的名称
- show databases ;
- 查询某个数据库的字符集:查询某个数据库的创建语句。
- show create database 数据库名称 ;
- 查询所有数据库的名称
- U(Update):修改
- 修改数据库的字符集
- alter database 数据库名称 character set 字符集 ;
- 修改数据库的字符集
- D(Delete):删除
- 删除数据库名称
- drop database 数据库名称 ;
- 判断数据库存在,存在再删除
- drop database if exists 数据库名称 ;
- 删除数据库名称
- 使用数据库
- 查询当前正在使用的数据库名称
- select database() ;
- 使用数据库
- use 数据库名称 ;
- 查询当前正在使用的数据库名称
- 操作表
- C(Create):创建
- create table 表名(
- 列名1 数据类型1,
- 列名2 数据类型2,
- ...
- 列名n 数据类型n
- ) ;
- 注意事项
- 最后一列末尾不加 "逗号" 。
- 数据类型
- int:整型
- double:小数类型
- source double(5,2)
- date:日期
- 只包含年月日:yyyy-MM-dd
- datetime:日期,包含年月日时分秒。
- yyyy-MM-dd HH:mm:ss
- timestamp:时间戳类型,包含年月日时分秒。
- 如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值。
- varchar:字符串
- 复制表
- create table 表名 like 被复制的表名 ;
- create table 表名(
- R(Retrieve):查询
- 查询某个数据库中所有的表名称
- show tables ;
- 查询表结构
- desc 表名 ;
- 查询某个数据库中所有的表名称
- U(Update):修改
- 修改表名
- alter table 表名 rename to 新表名 ;
- 修改表的字符集
- alter table 表名 character set 字符集名称 ;
- 添加一列
- alter table 表名 add 列名 数据类型 ;
- 修改列名称、数据类型
- alter table 表名 change 列名 新列名 新数据类型 ;
- 修改列数据类型
- alter table 表名 modify 列名 新数据类型 ;
- 删除列
- alter table 表名 drop 列名 ;
- 修改表名
- D(Delete):删除
- drop table 表名;
- drop table if exists 表名 ;
- C(Create):创建
- DML:增删改表中数据。
- 添加数据
- insert into 表名(列名1,列名2 ... 列名n) values(值1,值2 ... 值n) ;
- 注意事项
- 列名和值一一对应。
- 如果表名后,不定义列名,则表示给所有列名赋值。
- 除了数字类型,其他类型需要用引号(单双都可以)引起来。
- 注意事项
- insert into 表名(列名1,列名2 ... 列名n) values(值1,值2 ... 值n) ;
- 删除数据
- delete from 表名 [where 条件] ;
- 注意事项
- 如果不加条件,则删除表中所有数据。
- 如果要删除所有记录
- delete from 表名:不推荐使用,有多少条记录就会执行多少次删除操作。
- TRUNCATE table 表名:推荐使用,先删除表,再创建一张一模一样的表,效率更高。
- 注意事项
- delete from 表名 [where 条件] ;
- 修改数据
- update 表名 set 列名1=值1,列名2=值2 ... [where 条件] ;
- 注意事项
- 如果不加任何条件,则会将表中所有记录全部修改。
- 注意事项
- update 表名 set 列名1=值1,列名2=值2 ... [where 条件] ;
- 添加数据
- DQL:查询表中记录
- select * from 表名 ;
- 高级查询
- select
- 字段列表
- from
- 表名
- where
- 条件查询
- group by
- 分组字段
- having
- 分组之后条件
- order by
- 排序
- limit
- 分页限定 ;
- 别名:AS
- 可以给字段、表取别名。
- AS 可以省略。
- 别名有特殊符号
- 对于字段,建议给别名加引号(单双都行)。
- 对于表,不能加引号,也不能有特殊符号。
- 去重:DISTINCT
- SELECT DISTINCT 列名 FROM 表名 ;
- '着重号'
- 用单引号把列名或表名引起来。
- select * from 表名 ;
三、关联查询(联合查询)
- 七种结果
- 如何实现
- 内连接
- 外连接:左外连接,右外连接,全外连接(Mysql 使用 union 代替全外连接)
- 准备数据库
- 内连接:实现 A ∩ B
- 语法
select 字段列表 from A表 inner join B表 on 关联条件 where 等其他子句;
或
select 字段列表 from A表 , B表 where 关联条件 and 等其他子句;代码示例
#查询员工的姓名和他所在的部门的名称
SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e INNER JOIN dept d ON e.`did` = d.`did`;查询结果
- 左外连接
- 语法
#实现查询结果是 A
select 字段列表 from A表 left join B表 on 关联条件 where 等其他子句;
#实现 A - A∩B
select 字段列表 from A表 left join B表 on 关联条件 where 关联字段 is null and 等其他子句;代码示例
#查询所有员工的姓名和他所在的部门的名称
SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e LEFT JOIN dept d ON e.`did` = d.`did`; #查询所有没有部门的员工
SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e LEFT JOIN dept d ON e.`did` = d.`did` WHERE e.did IS NULL;查询结果
- 右外连接
- 语法
#实现查询结果是 B
select 字段列表 from A表 right join B表 on 关联条件 where 等其他子句;
#实现 B - A∩B
select 字段列表 from A表 right join B表 on 关联条件 where 关联字段 is null and 等其他子句;代码示例
#查询所有部门,以及所有部门下的员工信息
SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e RIGHT JOIN dept d ON e.did = d.did; #查询那些没有员工的部门
SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e RIGHT JOIN dept d ON e.did = d.did WHERE e.did IS NULL;查询结果
- 使用 UNION 代替全外连接
- 语法
#实现查询结果是 A∪B
#用左外的 A,union 右外的 B
select 字段列表 from A表 left join B表 on 关联条件 where 等其他子句
union
select 字段列表 from A表 right join B表 on 关联条件 where 等其他子句; #实现 A∪B - A∩B 或 (A - A∩B) ∪ (B - A∩B)
#使用左外的 (A - A∩B) union 右外的(B - A∩B)
select 字段列表 from A表 left join B表 on 关联条件 where 关联字段 is null and 等其他子句
union
select 字段列表 from A表 right join B表 on 关联条件 where 关联字段 is null and 等其他子句代码示例
#查询所有员工,所有部门,包括没有员工的部门,和没有部门的员工
SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e LEFT JOIN dept d ON e.`did` = d.`did`
UNION
SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e RIGHT JOIN dept d ON e.`did` = d.`did`; #查询那些没有部门的员工和所有没有员工的部门
SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e LEFT JOIN dept d ON e.`did` = d.`did` WHERE e.did IS NULL
UNION
SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e RIGHT JOIN dept d ON e.`did` = d.`did` WHERE e.did IS NULL;查询结果
四、SELECT 语句的 6 大字句
- 6 大字句排序
- from:从哪些表中筛选
- where:从表中筛选的条件
- group by:分组依据
- having:在统计结果中再次筛选
- order by:排序
- 降序:desc
- 升序:用么默认,要么加 asc
- limit:分页
- imit m,n
- m = (第几页 - 1)* 每页的数量
- n = 每页的数量
- imit m,n
- 代码示例
#查询每个部门的男生的人数,并且显示人数超过5人的,按照人数降序排列,
SELECT did ,COUNT(*) "人数" FROM employee WHERE sex = '男' GROUP BY did HAVING COUNT(*) > 1 ORDER BY 人数 DESC LIMIT 0,10;查询结果
- GROUP BY 与分组函数
- 语法
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression];代码示例
#求每个部门的平均成绩
SELECT did,AVG(score) FROM employee WHERE did IS NOT NULL GROUP BY did ;查询结果
- HAVING 与分组函数
- HAVING 和 WHERE 的区别?
- WHERE 是从表中筛选的条件,而 HAVING 是统计结果中再次筛选。
- WHERE 后面不能加“分组/聚合函数”,而 HAVING 后面可以跟。
- 代码示例
#统计部门平均工资高于 85 的部门和平均工资
SELECT did,AVG(score) FROM employee WHERE did IS NOT NULL GROUP BY did HAVING AVG(score) > 85 ;查询结果
- HAVING 和 WHERE 的区别?
五、子查询
- 嵌套在另一个查询中的查询。
- 根据位置不同,分为
- where型
- from型
- 必须给子查询取别名
- exists型
- 注意事项
- 不管子查询在哪里,子查询必须使用 () 括起来。
- 代码示例
#查询全公司最高分数的员工信息
SELECT * FROM employee WHERE score = (SELECT MAX(score) FROM employee); #查询每个部门的编号,名称,平均成绩
SELECT d.did,d.dname,temp.avgs FROM dept d INNER JOIN (SELECT did,AVG(score) avgs FROM employee GROUP BY did) temp ON d.did = temp.did; #查询那些有员工的部门
SELECT did, dname FROM dept WHERE EXISTS (SELECT * FROM employee WHERE dept.did = employee.did);查询结果
六、忘记 root 密码问题
- 通过任务管理器或者服务管理,关掉 mysqld (服务进程) 。
- 通过命令行+特殊参数开启 mysqld 。
- mysqld --skip-grant-tables
- 此时,mysqld 服务进程已经打开,并且,不需要权限检查。
- mysql -uroot 无密码登陆服务器。
- 修改权限表
- use mysql;
- update user set Password = password('root') where User = 'root';
- flush privileges;
- 通过任务管理器,关掉mysqld服务进程。
- 再次通过服务管理,打mysql服务。
- 即可用修改后的新密码登陆。
七、JDBC
- 概念
- Java DataBase Connectivity Java 数据库连接, Java语言操作数据库。
- 本质
- 其实是官方(sun 公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动 jar 包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类。
- 快速入门
- 导入驱动 jar 包
- mysql-connector-java-5.1.37-bin.jar
- 注册驱动
- Class.forName("com.mysql.jdbc.Driver");
- 获取数据库连接对象 Connection
- DriverManager.getConnection(String url , String username , String password)
- uri:指定连接的路径
- jdbc:mysql://ip地址(域名):端口号/数据库名称
- username
- 数据库用户名
- password
- 数据库密码
- uri:指定连接的路径
- DriverManager.getConnection(String url , String username , String password)
- 定义 sql
- 预编译的SQL:参数使用 ? 作为占位符。
- 获取执行 sql 语句的对象 Statement
- 执行 sql,接受返回结果
- 处理结果
- 释放资源
- 导入驱动 jar 包
- 详解几个对象
- Connection:数据库连接对象。
- 功能:
- 1. 获取执行 sql 的对象。
- Statement createStatement()
- PreparedStatement prepareStatement(String sql)
- 2. 管理事务
- 开启事务:setAutoCommit(boolean autoCommit);
- 调用该方法设置参数为 false,即开启事务。
- 提交事务:commit();
- 回滚事务:rollback();
- 开启事务:setAutoCommit(boolean autoCommit);
- 1. 获取执行 sql 的对象。
- 功能:
- Statement:执行 sql 的对象。
- boolean execute(String sql)
- 可以执行任意的 sql 。(了解)
- int executeUpdate(String sql)
- 执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
- 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
- ResultSet executeQuery(String sql)
- 执行 DQL (select) 语句。
- boolean execute(String sql)
- ResultSet:结果集对象,封装查询结果。
- boolean next()
- 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true 。
- getXxx(参数):获取数据。
- Xxx:代表数据类型 如: int getInt() , String getString()
- 参数
- int:代表列的编号,从1开始。如: getString(1)
- String:代表列名称。 如:getDouble("balance")
- boolean next()
- PreparedStatement:执行 sql 的对象。
- 作用:解决 sql 注入问题。
- 预编译的SQL:参数使用 ? 作为占位符。
- 如:select * from user where username = ? and password = ?;
- 给?赋值的方法
- setXxx(参数1,参数2)
- 参数1:? 的位置编号,从1 开始。
- 参数2:? 的值。
- setXxx(参数1,参数2)
- Connection:数据库连接对象。
01.数据库基础、JDBC的更多相关文章
- ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库
1.MySQL存储过程 1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if while)等等 的sql语句 1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...
- Java基础之MySQL数据库与JDBC
一.数据库 DBMS 数据库管理系统 是由多个程序构成的专门用来管理大量数据的计算机系统 Server 提供数据存储.检索.计算等服务的网络程序+系统服务 Notifier ...
- SQL Server 进阶 01 数据库的设计
SQL Server 进阶 01 数据库的设计 本篇目录 课程内容回顾及介绍 为什么需要规范的数据库设计 设计数据库的步骤 绘制E-R(实体-关系)图 实体-关系模型 如何将E-R图转换为表 数据规范 ...
- Sql Server数据库基础
--------------------------------------第一章 Sql Server数据库基础------------------------------------------ ...
- 数据库基础SQL知识面试题二
数据库基础SQL知识面试题二 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.选课系统SQL语法练习 course数据库中有以下四张表: •students表(学生表): si ...
- 数据库基础SQL知识面试题一
数据库基础SQL知识面试题一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如标题所示,本篇博客主要介绍基础知识的面试题.大家可以用来测试面试者的技术水平,由于个人水平所限,难免 ...
- 【Python全栈-数据库】数据库基础
数据库的简介 数据库 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展性, ...
- JAVA数据库编程(JDBC技术)-入门笔记
本菜鸟才介入Java,我现在不急着去看那些基本的语法或者一些Java里面的版本的特征或者是一些晋级的知识,因为有一点.Net的OOP编程思想,所以对于Java的这些语法以及什么的在用到的时候在去发现学 ...
- 转 MySQL数据库基础
http://lib.csdn.net/article/mysql/57883 1 数据库基础 一.数据库与数据库管理系统 1.数据库(DB):存放数据的仓库,从广义来说,数据不仅包括数字,还包括了文 ...
- Java操作数据库——使用JDBC连接数据库
Java操作数据库——使用JDBC连接数据库 摘要:本文主要学习了如何使用JDBC连接数据库. 背景 数据持久化 数据持久化就是把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应 ...
随机推荐
- php 图片加水印插件
问题:背景透明的水印图片,在加到原图上后不显示,待解决 <?php /** * 图片加水印(适用于png/jpg/gif格式) * * @author flynetcn * * @param $ ...
- 使用JavaHTTPClient发送请求
import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpHeaders ...
- 什么是bootstrap?
In computing, the term bootstrap means to boot or to load a program into a computer using a much sma ...
- iOS底层原理02-alloc源码分析
首先,从最熟悉的入手 - 对象,看看这三个对象的内容,内存地址和指针地址. LGPerson *p1 = [LGPerson alloc]; LGPerson *p2 = [p1 init]; ...
- js 三维数组转对象数组 二维数组转对象数组
1. 三维数组转对象数组 输出: 代码如下: let dataArr = [ [ [109.654541015625, 29.34387539941801], [110.467529296875, ...
- 11 个Chrome骚技巧让你为所欲为
1.曾经,在线调伪类样式困扰过你? 2.源代码快速定位到某一行 ctrl + p 3.联调接口失败时,后台老哥总管你要 response? 4.你还一层层展开 dom:Alt + Click 5.是不 ...
- jmeter非GUI模式运行-分布式测试
上一篇文章我们说到了jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存.cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要对j ...
- POJ--1852-c++实现
因为蚂蚁的朝向不明确,所以,可以根据需要假定朝向方向 首先,当每只蚂蚁朝着离自己最近的端点前进,且不回头则,所需总时间最少 当每只蚂蚁朝着离自己最远的端点前进,所需时间最多,在这期间,会碰到其他蚂蚁, ...
- vxe-table 合并单元格
<vxe-table @cell-click="handleClickCell" :span-method="spanMethods" //自动合并单元格 ...
- 使用 Application Loader 上传 IPA 包失败。提示信息:Please sign in with an app-specific password. You can create one at appleid.apple.com
摘自:https://www.cnblogs.com/strengthen/p/10881085.html 更新APP,使用 Application Loader 上传 IPA 包失败.提示信息:Pl ...