有关数据库基础知识
数据库(DB DataBase)
作用:存数据,管理数据。
概念:数据仓库,软件,安装在操作系统(Windows,linux,mac...)之上的 sql可以存数据,500W!
数据库分类
关系型数据库(SQL):Mysql,Oracle,DB2,sqllite。通过表和表,行和列之间关系存储。
非关系型数据库(NoSQL not only sql):Redis,MongDB。对象存储,通过对象自身属性来存储。
操作数据库
操作数据库>操作数据库的表>操作数据库表中的数据
创建数据库
CREATE DATABASE [IF NOT EXIT] westos
[Err] 1007 :数据库已存在。 记得创建完刷新。
删除数据库
DROP DATABASE [IF EXIT] westos
使用数据库
USE `westos`
查看所有数据库
SHOW DATABASES
数据库数据列类型
数值:常用的有 int 四个字节 ,bigint 八个字节,float 四个字节,double 八个字节 金融计算一般用decimal
字符串 : 常用的 char 0-255 , varchar 0-65535,tinytext 2^8-1,text2^16-1
时间和日期:data:yyyy-mm-dd time: hh:mm:ss datatime:data+time timestamp:1970.1.1到现在的毫秒数 year:年份表示。
null 不要使用null运算
数据库的字段属性
unsigned:无符号的整数,该列不能为负数
zerofill:0填充
自增:在上一条基础加1 通常设置主键。
非空:not null 不能为空的值
默认:设置默认值 不指定值则有默认值
拓展:
id 主键
`version` 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_updata 修改时间
创建表
CREATE TABLE [IF NOT EXISTS]`student1`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号' ,
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
comment 是注释,主键一般写在句子最后,default和comment后边都是单引号,AUTO_INCREMENT是自增
查看表的信息
SHOW CREATE TABLE `student1` --查看表的定义语句
SHOW CREATE DATABASE `student` --查看创建数据库的语句
DESC `student1` --显示表的结构
然后在结果上复制,粘贴到文本上
表的类型
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 大 |
MYISAM:节约空间,速度快
INNODB:安全性高,事务的处理,多表多用户操作
修改表名
ALTER TABLE student2 RENAME AS student1
增加表的字段
ALTER TABLE student2 ADD age INT(11)
修改表的字段
ALTER TABLE student2 MODIFY name VARCHAR(13)-- 修改属性 ALTER TABLE student2 CHANGE id id1 INT(100)--修改名字 记住一定要重新设置
删除表的字段
ALTER TABLE student2 DROP id1
所有的创建删除最好都加上 IF EXISTS
DML语言
-
insert :
-
INSERT INTO `student2`(`name`) VALUES('刘晗'),('刘东')。 插入多个值,INSERT INTO `student2`(`name`,`age`) VALUES('刘晗','19'),('刘东','18')
-
updata:
-
UPDATE `student2` SET `name`='通通' WHERE id1=3 换多个数,
-
delete,TRUNCATE
-
DELETE FROM `student2` WHERE `id1`=4 --不会影响自增 TRUNCATE TABLE `student2`--自增变为0
DQL(DATA QUERY LANGUAGE)
SELECT 字段 FROM 表 --查询表信息
给字段起别名
拼接字符串
SELECT `id`,`name` FROM `student` SELECT `id` AS 学号,`name`AS 名字 FROM `student` SELECT CONCAT('姓名':,name) AS 名字FROM `student`
去重:去除重复数据,只显示一条
SELECT DISTINCT `id` FROM `student`
where:检索数据
模糊查询:比较运算符,重点有(is null,is not null,between。。。and,like,in)
like的用法:where+字段+like+关键字(%或者_)
in:where+字段+in+(范围) 范围为具体的一个或者多个值
连表查询
操作 描述 Inner Join 如果表中至少有一个匹配就返回行 Left Join 会从左表中返回所有值,即使右表中没有匹配 Right Join 会从右表中返回所有值,即使左表中没有匹配
-
分页:limit ((n-1)*pagesize,pagesize)排序: order by(升序用 ASC,降序用DESC)
MySQL函数
前边都要加SELECT
ABS() 取整
CEILING()向上取整
FLOOR()向下取整
RAND()返回0-1随机值
SING()判断一个数的符号
CHAR_LENGTH()判断字符串长度
CONCAT()拼接字符串
INSERT() 替换字符串
LOWER()转小写
UPPER()转大写
INSTR()返回字符串位置
REPLACE()替换字符串
SUBSTR()截取字符串位置
REVERSE()反转
CURRENT_DATE()和now()和LOCALTIME()和SYSDATE() 获取时间
单独获取年 YEAR(NOW())---一次类推时分秒
聚合函数
COUNT()可以加字段名,可以是*,可以是1 查询总数
如果是字段名会忽略所有的null值 但是*和1不忽略 平时推荐使用1.
SUM(字段名)
AVG(字段名)
MAX(字段名)
MIN(字段名)
分组和过滤:GROUP BY和HAVING 先分组后过滤
事务
事务原则:ACID:
原子性,要么都成功,要么都失败;
一致性,事务前后数据完整性一致;
隔离性,每个事务不能被其他事务所干扰;-------->导致的问题:脏读,不可重复读,幻读
持久性,事务一旦提交则不可逆,被持久化到数据库
手动提交事务流程
-
SET TRANSACTION=0 --------关闭自动条件
-
STAR TRANSACTION ----------标记一个事务开始
-
INSERT
-
COMMIT -----------提交 持久化
-
ROLLBAKE --------------事务结束
-
SET TRANSACTION=1 ------------------开启自动提交
-
-------了解 SAVEPOINT 保存点名 -----回到保存点 ROLLBACK TO SAVEBACK 保存点名 ----撤销保存点 RELEASE SAVEBACK 保存点名
创建索引会减少查询时间
CREAT INDEX 索引名字 ON 表名(字段名)
数据库导出和导入
导出 mysqldump -h 主机 -u 用户名 -p 密码 数据库 表名 >物理磁盘位置/文件名
导入 登陆后 SOUCE d:/a.sql
规范数据库
分析需求:分析业务和处理数据库的需求
概要设计:设计u-r图
一些前端设计网址
element.elem
https://ant.design/index-cn
bootstrap
JDBC
Class.forName("com.mysql.jdbc.Driver");//加载驱动
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=UTF-8",
"root", "root");//连接数据库
Statement statement=c.createStatement(); //执行sql的对象
String sql="SELECT * FROM student2";
ResultSet resultSet = statement.executeQuery(sql);//执行sql语句
while (resultSet.next()){
System.out.println(resultSet.getObject("id1"));
System.out.println(resultSet.getObject("name"));
System.out.println(resultSet.getObject("age"));
}
//使用后关闭流
resultSet.close();
statement.close();
c.close();
--注意executeQuery只能用于查询。execute只能用于增删改。
注意statement存在sql注入问题,安全系数不高
所以平时用preparedstatement,安全性高,防止sql注入
String sql="INSERT INTO student2(id1,`name`,`age`) VALUES(?,?,?)";
PreparedStatement preparedStatement=connection.prepareStatement(sql);
preparedStatement.setInt(1,6);
preparedStatement.setString(2,"爱人2");
preparedStatement.setInt(3,19);
preparedStatement.executeUpdate();