有关数据库基础知识

DBA: 数据库管理员

数据库(DB DataBase)

作用:存数据,管理数据。

概念:数据仓库,软件,安装在操作系统(Windows,linux,mac...)之上的 sql可以存数据,500W!

数据库分类

关系型数据库(SQL):Mysql,Oracle,DB2,sqllite。通过表和表,行和列之间关系存储。

非关系型数据库(NoSQL not only sql):Redis,MongDB。对象存储,通过对象自身属性来存储。

操作数据库

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

==mysql关键字不区分大小写==

创建数据库

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` --显示表的结构

然后在结果上复制,粘贴到文本上

表的类型

 MYISAMINNODB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间大小 较小

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)

    limit 放在order之后

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:

原子性,要么都成功,要么都失败;

一致性,事务前后数据完整性一致;

隔离性,每个事务不能被其他事务所干扰;-------->导致的问题:脏读,不可重复读,幻读

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

手动提交事务流程

  1. SET TRANSACTION=0 --------关闭自动条件

  2. STAR TRANSACTION ----------标记一个事务开始

  3. INSERT

  4. COMMIT -----------提交 持久化

  5. ROLLBAKE --------------事务结束

  6. SET TRANSACTION=1 ------------------开启自动提交

  7. -------了解 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();

 

posted @ 2020-03-04 21:39  坚持_第一天  阅读(228)  评论(0)    收藏  举报