博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库学习记录 Day1(MySql)
阅读量:3899 次
发布时间:2019-05-23

本文共 34297 字,大约阅读时间需要 114 分钟。

文章目录

Day 1

2019年6月29日。

这是我学习数据库的第一天。
这一天,我学到了以下的知识。

什么是数据库

数据库(DataBase,简称DB)

概念:长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据"仓库"

作用:保存,并能安全管理数据(如:增删改查等),减少冗余…

数据库总览 :

  • 关系型数据库 (SQL)
    MySQL , Oracle , SQL Server , SQLite , DB2 , …
    关系型数据库通过外键关联来建立表与表之间的关系
  • 非关系型数据库(NOSQL)
    Redis , MongoDB , …
    非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定

DBMS

数据库管理系统 ( DataBase Management System ):数据库管理软件 , 科学组织和存储数据 , 高效地获取和维护数据
在这里插入图片描述
Mysqly也算是数据库管理系统,这里主要介绍Mysql的安装和使用

安装Mysql

建议参考此篇博客: 进行安装

安装Mysql常见问题

  • 缺少一个.dll组件
    去百度上下载相关组件
  • 发现net命名不存在
    需要配置path环境变量:$SystemRoot%\system32s

Mysql常用控制台命令

在管理员模式下:

  • 启动Mysql服务:net start mysql
    - 若提示拒绝访问(发生系统错误5),说明没有管理员权限
  • 关闭Mysql服务:net stop mysql
  • 卸载Mysql:sc delete mysql
  • 登录(以root的身份初次登录,会进入MySql管理页面):user -uroot -p123456
    - MySql初始密码为123456

在MySql管理页面下:

  • 创建名字为name的数据库:create database name;
  • 删除名字为name的数据库:drop database name;
  • 查看所有数据库:show databases;
  • 使用数据库:use database;
  • 查看数据库下的所有表:show tables;
  • 刷新数据库:flush privileges;
  • 查询名为use的命令的使用方法:? use;
  • 退出MySql管理页面:exit;

注意:

1.sql语句不区分大小写

2.每行sql语句都要以分号结尾(可以没有分号,但最好加上)

SQLyog

SQLyog,可手动操作,管理MySQL数据库的软件,建议在安装Mysql后安装此软件。

该工具特点 : 简洁 , 易用 , 图形化

打开SQLyog后,新建连接,如下图所示:

在这里插入图片描述
单击“测试连接”,出现如下图所示的弹窗,说明连接成功,再次点击“连接”即可:
在这里插入图片描述
使用SQLyog管理工具自己完成以下操作 :

  • 连接本地MySQL数据库

  • 新建MySchool数据库

    • 数据库名称myschool
      在这里插入图片描述
    • 新建数据库表(grade)
      在这里插入图片描述
      • 字段
        • gradeID:int(11) ,Primary Key (pk)
        • gradeName:varchar(50)
          在这里插入图片描述
  • 在历史记录中可以看到相对应的数据库操作的语句

    在这里插入图片描述

创建数据库、表

根据上一小节的例子,可以在“信息”选项卡中查看创建此表(grade)的sql语句

在这里插入图片描述
创建grade表的sql语句如下:

CREATE TABLE grade (  gradeId int(11) NOT NULL COMMENT '年级Id',  gradeName varchar(50) DEFAULT NULL COMMENT '年级名字',  PRIMARY KEY (gradeId)) ENGINE=InnoDB DEFAULT CHARSET=utf8

根据此段代码,创建表的sql语句如下:

#创建表格式CREATE TABLE 表名(	字段名 数据类型(长度) 修饰符,	字段名 数据类型(长度) 修饰符,	字段名 数据类型(长度) 修饰符)

而创建数据库的sql语句如下:

#创建数据库CREATE DATABASE 数据库名;

结构化查询语句SQL

结构化查询语句分类:

名称 解释 命令
DDL(数据定义语言) 定义和管理数据对象,如数据库,数据表等 CREATE、DROP、ALTER
DML(数据操作语言) 用于操作数据库对象中所包含的数据 INSERT、UPDATE、DELETE
DQL(数据查询语言) 用于查询数据库数据 SELECT
DCL(数据控制语言) 用来管理数据库的语言,包括管理权限及数据更改 GRANT、COMMIT、ROLLBACK

数据值和列类型

  • 数值类型
类型 说明 取值范围 存储需求
tinyint 非常小的数据 有符号值 -27 ~ 27;无符号值 0~28 1字节
smallint 较小的数据 有符号值 -215 ~215-1;无符号值 0~216-1 2字节
mediumint 中等大小的数据 有符号值 -223 ~223-1;无符号值 0~224-1 3字节
int 标准整数 有符号值 -221 ~221-1;无符号值 0~222-1 4字节
bigint 较大的整数 有符号值 -243 ~243-1;无符号值 0~244-1 8字节
float 单精度浮点数 ±1.1754351e-38 4字节
double 双精度浮点数 ±2.22507e-306 8字节
decimal 字符串形式的浮点数 decimal(m,d) m字节
  • 字符串类型
类型 说明 最大长度
char 固定长字符串,检索快但浪费空间 0 <= M <= 255 M字符
varchar 可变字符串 0 <= M <= 65535 变长度
tinytext 微型文本串 28-1 字节
text 文本串 216-1 字节
  • 日期和时间型数值类型
类型 说明 取值范围
DATE YYYY-MM-DD,日期格式 1000-01-01~9999-12-31
TIME Hh:mm:ss,时间格式 -838:59:59~838:59:59
DATETIME YY-MM-DD hh:mm:ss 1000-01-01 00:00:00 至 9999-12-31 23:59:59
TIMESTAMP YYYYMMDDhhmmss格式表示的时间戳 197010101000000~2037年的某个时刻
YEAR YYYY格式的年份值 1901~2155
  • NULL值
    - 理解为"没有值"或"未知值"
    - 不要用NULL进行算术运算 , 结果仍为NULL

数据字段属性

结构化查询语句分类:

UnSigned :

  • 无符号的
  • 声明该数据列不允许负数

ZEROFILL :

  • 0填充的
  • 不足位数的用0来填充 , 如int(3),5则为005

Auto_InCrement :

  • 自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)
  • 通常用于设置主键 , 且为整数类型
  • 可定义起始值和步长
    - 当前表设置步长(AUTO_INCREMENT=100):只影响当前表
    - SET @@auto_increment_increment=5:影响所有使用自增的表(全局)

NULL 和 NOT NULL :

  • 默认为NULL , 即没有插入该列的数值
  • 如果设置为NOT NULL,则该列必须有值

DEFAULT :

  • 默认的
  • 用于设置默认值
    - 例如,性别字段,默认为"男" , 否则为 “女” ; 若无指定该列的值 , 则默认值为"男"的值

修改数据表

  • 修改表名 :
ALTER TABLE 旧表名 RENAME AS 新表名
  • 添加字段 :
ALTER TABLE 表名 ADD字段名 列属性[属性]
  • 修改字段 :
ALTER TABLE 表名 MODIFY 字段名 列类型[属性] ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[属性]
  • 删除字段 :
ALTER TABLE 表名 DROP 字段名

外键

概念:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。

在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreign key)。

作用:保持数据一致性,完整性,主要目的是控制存储在外键表中的数据,约束。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。

创建外键有两种方式:

  1. 建表时指定外键约束
# 创建外键的方式一 : 创建子表同时创建外键# 年级表(id\年级名称)CREATE TABLE `grade` (  `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',  `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',  PRIMARY KEY (`gradeid`)) ENGINE=INNODB DEFAULT CHARSET=utf8# 学生信息表#(学号,姓名,性别,年级,手机,地址,出生日期,邮箱,身份证号)CREATE TABLE `student` (  `studentno` INT(4) NOT NULL COMMENT '学号',  `studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',  `sex` TINYINT(1) DEFAULT '1' COMMENT '性别',  `gradeid` INT(10) DEFAULT NULL COMMENT '年级',  `phoneNum` VARCHAR(50) NOT NULL COMMENT '手机',  `address` VARCHAR(255) DEFAULT NULL COMMENT '地址',  `borndate` DATETIME DEFAULT NULL COMMENT '生日',  `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',  `idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',  PRIMARY KEY (`studentno`),  KEY `FK_gradeid` (`gradeid`),  CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)) ENGINE=INNODB DEFAULT CHARSET=utf8
  1. 建表后修改
# 创建外键方式二 : 创建子表完毕后,修改子表添加外键ALTER TABLE studentADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);

增删查改

  1. 增加
INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')

注意 :

  • 字段或值之间用英文逗号隔开.
  • '字段1,字段2…'该部分可省略 , 但添加的值务必与表结构、数据列、顺序相对应,且数量一致
    可同时插入多条数据,values 后用英文逗号隔开
# 语法 : INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')INSERT INTO grade(gradename) VALUES ('大一');# 主键自增,那能否省略呢?INSERT INTO grade VALUES ('大二');# 查询:INSERT INTO grade VALUE ('大二')错误代码: 1136# Column count doesn`t match value count at row 1# 得出结论:'字段1,字段2...'该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应,且数量一致.# 一次插入多条数据INSERT INTO grade(gradename) VALUES ('大三'),('大四');
  1. 删除
DELETE FROM 表名 [WHERE condition];

注意 : condition为筛选条件 , 如不指定则删除该表的所有列数据

或者

TRUNCATE [TABLE] table_name;

用于完全清空表数据 , 但表结构 , 索引 , 约束等不变 ;

注意 : 区别于DELETE命令

  • 相同 : 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快

  • 不同 :

    - 使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器
    - 使用TRUNCATE TABLE不会对事务有影响

# 创建一个测试表CREATE TABLE `test` (  `id` INT(4) NOT NULL AUTO_INCREMENT,  `coll` VARCHAR(20) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=INNODB DEFAULT CHARSET=utf8# 插入几个测试数据INSERT INTO test(coll) VALUES('row1'),('row2'),('row3');# 删除表数据(不带where条件的delete)DELETE FROM test;# 结论:如不指定Where则删除该表的所有列数据,自增当前值依然从原来基础上进行,会记录日志.# 删除表数据(truncate)TRUNCATE TABLE test;# 结论:truncate删除数据,自增当前值会恢复到初始值重新开始;不会记录日志.# 同样使用DELETE清空不同引擎的数据库表数据.重启数据库服务后# InnoDB : 自增列从初始值重新开始 (因为是存储在内存中,断电即失)# MyISAM : 自增列依然从上一个自增数据基础上开始 (存在文件中,不会丢失)
  1. 修改
UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];

注意 :

  • column_name:为要更改的数据列

  • value:为修改后的数据 , 可以为变量 , 具体指 , 表达式或者嵌套的SELECT结果

  • condition:为筛选条件 , 如不指定则修改该表的所有列数据

  1. 查询
SELECT [ALL | DISTINCT]{
* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}FROM table_name [as table_alias] [left | right | inner join table_name2] #联合查询 [WHERE ...] #指定结果需满足的条件 [GROUP BY ...] #指定结果按照哪几个字段来分组 [HAVING] #过滤分组的记录必须满足的次要条件 [ORDER BY ...] #指定查询记录按一个或多个条件排序 [LIMIT {
[offset,]row_count | row_countOFFSET offset}]; # 指定查询的记录从哪条至哪条

以接下来的sql语句作为模板,运用select可以实现三种功能:

/*SQLyog Ultimate v10.00 Beta1MySQL - 5.7.19 : Database - school**********************************************************************//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;CREATE DATABASE /*!32312 IF NOT EXISTS*/`school` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `school`;/*Table structure for table `grade` */DROP TABLE IF EXISTS `grade`;CREATE TABLE `grade` (  `GradeID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号',  `GradeName` VARCHAR(50) NOT NULL COMMENT '年级名称',  PRIMARY KEY (`GradeID`)) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;/*Data for the table `grade` */INSERT  INTO `grade`(`GradeID`,`GradeName`) VALUES (1,'大一'),(2,'大二'),(3,'大三'),(4,'大四'),(5,'预科班');/*Table structure for table `result` */DROP TABLE IF EXISTS `result`;CREATE TABLE `result` (  `StudentNo` INT(4) NOT NULL COMMENT '学号',  `SubjectNo` INT(4) NOT NULL COMMENT '课程编号',  `ExamDate` DATETIME NOT NULL COMMENT '考试日期',  `StudentResult` INT(4) NOT NULL COMMENT '考试成绩',  KEY `SubjectNo` (`SubjectNo`)) ENGINE=INNODB DEFAULT CHARSET=utf8;/*Data for the table `result` */INSERT  INTO `result`(`StudentNo`,`SubjectNo`,`ExamDate`,`StudentResult`) VALUES (1000,1,'2013-11-11 16:00:00',94),(1000,2,'2012-11-10 10:00:00',75),(1000,3,'2011-12-19 10:00:00',76),(1000,4,'2010-11-18 11:00:00',93),(1000,5,'2013-11-11 14:00:00',97),(1000,6,'2012-09-13 15:00:00',87),(1000,7,'2011-10-16 16:00:00',79),(1000,8,'2010-11-11 16:00:00',74),(1000,9,'2013-11-21 10:00:00',69),(1000,10,'2012-11-11 12:00:00',78),(1000,11,'2011-11-11 14:00:00',66),(1000,12,'2010-11-11 15:00:00',82),(1000,13,'2013-11-11 14:00:00',94),(1000,14,'2012-11-11 15:00:00',98),(1000,15,'2011-12-11 10:00:00',70),(1000,16,'2010-09-11 10:00:00',74),(1001,1,'2013-11-11 16:00:00',76),(1001,2,'2012-11-10 10:00:00',93),(1001,3,'2011-12-19 10:00:00',65),(1001,4,'2010-11-18 11:00:00',71),(1001,5,'2013-11-11 14:00:00',98),(1001,6,'2012-09-13 15:00:00',74),(1001,7,'2011-10-16 16:00:00',85),(1001,8,'2010-11-11 16:00:00',69),(1001,9,'2013-11-21 10:00:00',63),(1001,10,'2012-11-11 12:00:00',70),(1001,11,'2011-11-11 14:00:00',62),(1001,12,'2010-11-11 15:00:00',90),(1001,13,'2013-11-11 14:00:00',97),(1001,14,'2012-11-11 15:00:00',89),(1001,15,'2011-12-11 10:00:00',72),(1001,16,'2010-09-11 10:00:00',90),(1002,1,'2013-11-11 16:00:00',61),(1002,2,'2012-11-10 10:00:00',80),(1002,3,'2011-12-19 10:00:00',89),(1002,4,'2010-11-18 11:00:00',88),(1002,5,'2013-11-11 14:00:00',82),(1002,6,'2012-09-13 15:00:00',91),(1002,7,'2011-10-16 16:00:00',63),(1002,8,'2010-11-11 16:00:00',84),(1002,9,'2013-11-21 10:00:00',60),(1002,10,'2012-11-11 12:00:00',71),(1002,11,'2011-11-11 14:00:00',93),(1002,12,'2010-11-11 15:00:00',96),(1002,13,'2013-11-11 14:00:00',83),(1002,14,'2012-11-11 15:00:00',69),(1002,15,'2011-12-11 10:00:00',89),(1002,16,'2010-09-11 10:00:00',83),(1003,1,'2013-11-11 16:00:00',91),(1003,2,'2012-11-10 10:00:00',75),(1003,3,'2011-12-19 10:00:00',65),(1003,4,'2010-11-18 11:00:00',63),(1003,5,'2013-11-11 14:00:00',90),(1003,6,'2012-09-13 15:00:00',96),(1003,7,'2011-10-16 16:00:00',97),(1003,8,'2010-11-11 16:00:00',77),(1003,9,'2013-11-21 10:00:00',62),(1003,10,'2012-11-11 12:00:00',81),(1003,11,'2011-11-11 14:00:00',76),(1003,12,'2010-11-11 15:00:00',61),(1003,13,'2013-11-11 14:00:00',93),(1003,14,'2012-11-11 15:00:00',79),(1003,15,'2011-12-11 10:00:00',78),(1003,16,'2010-09-11 10:00:00',96),(1004,1,'2013-11-11 16:00:00',84),(1004,2,'2012-11-10 10:00:00',79),(1004,3,'2011-12-19 10:00:00',76),(1004,4,'2010-11-18 11:00:00',78),(1004,5,'2013-11-11 14:00:00',81),(1004,6,'2012-09-13 15:00:00',90),(1004,7,'2011-10-16 16:00:00',63),(1004,8,'2010-11-11 16:00:00',89),(1004,9,'2013-11-21 10:00:00',67),(1004,10,'2012-11-11 12:00:00',100),(1004,11,'2011-11-11 14:00:00',94),(1004,12,'2010-11-11 15:00:00',65),(1004,13,'2013-11-11 14:00:00',86),(1004,14,'2012-11-11 15:00:00',77),(1004,15,'2011-12-11 10:00:00',82),(1004,16,'2010-09-11 10:00:00',87),(1005,1,'2013-11-11 16:00:00',82),(1005,2,'2012-11-10 10:00:00',92),(1005,3,'2011-12-19 10:00:00',80),(1005,4,'2010-11-18 11:00:00',92),(1005,5,'2013-11-11 14:00:00',97),(1005,6,'2012-09-13 15:00:00',72),(1005,7,'2011-10-16 16:00:00',84),(1005,8,'2010-11-11 16:00:00',79),(1005,9,'2013-11-21 10:00:00',76),(1005,10,'2012-11-11 12:00:00',87),(1005,11,'2011-11-11 14:00:00',65),(1005,12,'2010-11-11 15:00:00',67),(1005,13,'2013-11-11 14:00:00',63),(1005,14,'2012-11-11 15:00:00',64),(1005,15,'2011-12-11 10:00:00',99),(1005,16,'2010-09-11 10:00:00',97),(1006,1,'2013-11-11 16:00:00',82),(1006,2,'2012-11-10 10:00:00',73),(1006,3,'2011-12-19 10:00:00',79),(1006,4,'2010-11-18 11:00:00',63),(1006,5,'2013-11-11 14:00:00',97),(1006,6,'2012-09-13 15:00:00',83),(1006,7,'2011-10-16 16:00:00',78),(1006,8,'2010-11-11 16:00:00',88),(1006,9,'2013-11-21 10:00:00',89),(1006,10,'2012-11-11 12:00:00',82),(1006,11,'2011-11-11 14:00:00',70),(1006,12,'2010-11-11 15:00:00',69),(1006,13,'2013-11-11 14:00:00',64),(1006,14,'2012-11-11 15:00:00',80),(1006,15,'2011-12-11 10:00:00',90),(1006,16,'2010-09-11 10:00:00',85),(1007,1,'2013-11-11 16:00:00',87),(1007,2,'2012-11-10 10:00:00',63),(1007,3,'2011-12-19 10:00:00',70),(1007,4,'2010-11-18 11:00:00',74),(1007,5,'2013-11-11 14:00:00',79),(1007,6,'2012-09-13 15:00:00',83),(1007,7,'2011-10-16 16:00:00',86),(1007,8,'2010-11-11 16:00:00',76),(1007,9,'2013-11-21 10:00:00',65),(1007,10,'2012-11-11 12:00:00',87),(1007,11,'2011-11-11 14:00:00',69),(1007,12,'2010-11-11 15:00:00',69),(1007,13,'2013-11-11 14:00:00',90),(1007,14,'2012-11-11 15:00:00',84),(1007,15,'2011-12-11 10:00:00',95),(1007,16,'2010-09-11 10:00:00',92),(1008,1,'2013-11-11 16:00:00',96),(1008,2,'2012-11-10 10:00:00',62),(1008,3,'2011-12-19 10:00:00',97),(1008,4,'2010-11-18 11:00:00',84),(1008,5,'2013-11-11 14:00:00',86),(1008,6,'2012-09-13 15:00:00',72),(1008,7,'2011-10-16 16:00:00',67),(1008,8,'2010-11-11 16:00:00',83),(1008,9,'2013-11-21 10:00:00',86),(1008,10,'2012-11-11 12:00:00',60),(1008,11,'2011-11-11 14:00:00',61),(1008,12,'2010-11-11 15:00:00',68),(1008,13,'2013-11-11 14:00:00',99),(1008,14,'2012-11-11 15:00:00',77),(1008,15,'2011-12-11 10:00:00',73),(1008,16,'2010-09-11 10:00:00',78),(1009,1,'2013-11-11 16:00:00',67),(1009,2,'2012-11-10 10:00:00',70),(1009,3,'2011-12-19 10:00:00',75),(1009,4,'2010-11-18 11:00:00',92),(1009,5,'2013-11-11 14:00:00',76),(1009,6,'2012-09-13 15:00:00',90),(1009,7,'2011-10-16 16:00:00',62),(1009,8,'2010-11-11 16:00:00',68),(1009,9,'2013-11-21 10:00:00',70),(1009,10,'2012-11-11 12:00:00',83),(1009,11,'2011-11-11 14:00:00',88),(1009,12,'2010-11-11 15:00:00',65),(1009,13,'2013-11-11 14:00:00',91),(1009,14,'2012-11-11 15:00:00',99),(1009,15,'2011-12-11 10:00:00',65),(1009,16,'2010-09-11 10:00:00',83),(1010,1,'2013-11-11 16:00:00',83),(1010,2,'2012-11-10 10:00:00',87),(1010,3,'2011-12-19 10:00:00',89),(1010,4,'2010-11-18 11:00:00',99),(1010,5,'2013-11-11 14:00:00',91),(1010,6,'2012-09-13 15:00:00',96),(1010,7,'2011-10-16 16:00:00',72),(1010,8,'2010-11-11 16:00:00',72),(1010,9,'2013-11-21 10:00:00',98),(1010,10,'2012-11-11 12:00:00',73),(1010,11,'2011-11-11 14:00:00',68),(1010,12,'2010-11-11 15:00:00',62),(1010,13,'2013-11-11 14:00:00',67),(1010,14,'2012-11-11 15:00:00',69),(1010,15,'2011-12-11 10:00:00',71),(1010,16,'2010-09-11 10:00:00',66),(1011,1,'2013-11-11 16:00:00',62),(1011,2,'2012-11-10 10:00:00',72),(1011,3,'2011-12-19 10:00:00',96),(1011,4,'2010-11-18 11:00:00',64),(1011,5,'2013-11-11 14:00:00',89),(1011,6,'2012-09-13 15:00:00',91),(1011,7,'2011-10-16 16:00:00',95),(1011,8,'2010-11-11 16:00:00',96),(1011,9,'2013-11-21 10:00:00',89),(1011,10,'2012-11-11 12:00:00',73),(1011,11,'2011-11-11 14:00:00',82),(1011,12,'2010-11-11 15:00:00',98),(1011,13,'2013-11-11 14:00:00',66),(1011,14,'2012-11-11 15:00:00',69),(1011,15,'2011-12-11 10:00:00',91),(1011,16,'2010-09-11 10:00:00',69),(1012,1,'2013-11-11 16:00:00',86),(1012,2,'2012-11-10 10:00:00',66),(1012,3,'2011-12-19 10:00:00',97),(1012,4,'2010-11-18 11:00:00',69),(1012,5,'2013-11-11 14:00:00',70),(1012,6,'2012-09-13 15:00:00',74),(1012,7,'2011-10-16 16:00:00',91),(1012,8,'2010-11-11 16:00:00',97),(1012,9,'2013-11-21 10:00:00',84),(1012,10,'2012-11-11 12:00:00',82),(1012,11,'2011-11-11 14:00:00',90),(1012,12,'2010-11-11 15:00:00',91),(1012,13,'2013-11-11 14:00:00',91),(1012,14,'2012-11-11 15:00:00',97),(1012,15,'2011-12-11 10:00:00',85),(1012,16,'2010-09-11 10:00:00',90),(1013,1,'2013-11-11 16:00:00',73),(1013,2,'2012-11-10 10:00:00',69),(1013,3,'2011-12-19 10:00:00',91),(1013,4,'2010-11-18 11:00:00',72),(1013,5,'2013-11-11 14:00:00',76),(1013,6,'2012-09-13 15:00:00',87),(1013,7,'2011-10-16 16:00:00',61),(1013,8,'2010-11-11 16:00:00',77),(1013,9,'2013-11-21 10:00:00',83),(1013,10,'2012-11-11 12:00:00',99),(1013,11,'2011-11-11 14:00:00',91),(1013,12,'2010-11-11 15:00:00',84),(1013,13,'2013-11-11 14:00:00',98),(1013,14,'2012-11-11 15:00:00',74),(1013,15,'2011-12-11 10:00:00',92),(1013,16,'2010-09-11 10:00:00',90),(1014,1,'2013-11-11 16:00:00',64),(1014,2,'2012-11-10 10:00:00',81),(1014,3,'2011-12-19 10:00:00',79),(1014,4,'2010-11-18 11:00:00',74),(1014,5,'2013-11-11 14:00:00',65),(1014,6,'2012-09-13 15:00:00',88),(1014,7,'2011-10-16 16:00:00',86),(1014,8,'2010-11-11 16:00:00',77),(1014,9,'2013-11-21 10:00:00',86),(1014,10,'2012-11-11 12:00:00',85),(1014,11,'2011-11-11 14:00:00',86),(1014,12,'2010-11-11 15:00:00',75),(1014,13,'2013-11-11 14:00:00',89),(1014,14,'2012-11-11 15:00:00',79),(1014,15,'2011-12-11 10:00:00',73),(1014,16,'2010-09-11 10:00:00',68),(1015,1,'2013-11-11 16:00:00',99),(1015,2,'2012-11-10 10:00:00',60),(1015,3,'2011-12-19 10:00:00',60),(1015,4,'2010-11-18 11:00:00',75),(1015,5,'2013-11-11 14:00:00',78),(1015,6,'2012-09-13 15:00:00',78),(1015,7,'2011-10-16 16:00:00',84),(1015,8,'2010-11-11 16:00:00',95),(1015,9,'2013-11-21 10:00:00',93),(1015,10,'2012-11-11 12:00:00',79),(1015,11,'2011-11-11 14:00:00',74),(1015,12,'2010-11-11 15:00:00',65),(1015,13,'2013-11-11 14:00:00',63),(1015,14,'2012-11-11 15:00:00',74),(1015,15,'2011-12-11 10:00:00',67),(1015,16,'2010-09-11 10:00:00',65),(1016,1,'2013-11-11 16:00:00',97),(1016,2,'2012-11-10 10:00:00',90),(1016,3,'2011-12-19 10:00:00',77),(1016,4,'2010-11-18 11:00:00',75),(1016,5,'2013-11-11 14:00:00',75),(1016,6,'2012-09-13 15:00:00',97),(1016,7,'2011-10-16 16:00:00',96),(1016,8,'2010-11-11 16:00:00',92),(1016,9,'2013-11-21 10:00:00',62),(1016,10,'2012-11-11 12:00:00',83),(1016,11,'2011-11-11 14:00:00',98),(1016,12,'2010-11-11 15:00:00',94),(1016,13,'2013-11-11 14:00:00',62),(1016,14,'2012-11-11 15:00:00',97),(1016,15,'2011-12-11 10:00:00',76),(1016,16,'2010-09-11 10:00:00',82),(1017,1,'2013-11-11 16:00:00',100),(1017,2,'2012-11-10 10:00:00',88),(1017,3,'2011-12-19 10:00:00',86),(1017,4,'2010-11-18 11:00:00',73),(1017,5,'2013-11-11 14:00:00',96),(1017,6,'2012-09-13 15:00:00',64),(1017,7,'2011-10-16 16:00:00',81),(1017,8,'2010-11-11 16:00:00',66),(1017,9,'2013-11-21 10:00:00',76),(1017,10,'2012-11-11 12:00:00',95),(1017,11,'2011-11-11 14:00:00',73),(1017,12,'2010-11-11 15:00:00',82),(1017,13,'2013-11-11 14:00:00',85),(1017,14,'2012-11-11 15:00:00',68),(1017,15,'2011-12-11 10:00:00',99),(1017,16,'2010-09-11 10:00:00',76);/*Table structure for table `student` */DROP TABLE IF EXISTS `student`;CREATE TABLE `student` (  `StudentNo` INT(4) NOT NULL COMMENT '学号',  `LoginPwd` VARCHAR(20) DEFAULT NULL,  `StudentName` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名',  `Sex` TINYINT(1) DEFAULT NULL COMMENT '性别,取值0或1',  `GradeId` INT(11) DEFAULT NULL COMMENT '年级编号',  `Phone` VARCHAR(50) NOT NULL COMMENT '联系电话,允许为空,即可选输入',  `Address` VARCHAR(255) NOT NULL COMMENT '地址,允许为空,即可选输入',  `BornDate` DATETIME DEFAULT NULL COMMENT '出生时间',  `Email` VARCHAR(50) NOT NULL COMMENT '邮箱账号,允许为空,即可选输入',  `IdentityCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',  PRIMARY KEY (`StudentNo`),  UNIQUE KEY `IdentityCard` (`IdentityCard`),  KEY `Email` (`Email`)) ENGINE=MYISAM DEFAULT CHARSET=utf8;/*Data for the table `student` */INSERT  INTO `student`(`StudentNo`,`LoginPwd`,`StudentName`,`Sex`,`GradeId`,`Phone`,`Address`,`BornDate`,`Email`,`IdentityCard`) VALUES (1000,'111111','郭靖',1,1,'13500000001','北京海淀区中关村大街1号','1986-12-11 00:00:00','test1@bdqn.cn','450323198612111234'),(1001,'123456','李文才',1,2,'13500000002','河南洛阳','1981-12-31 00:00:00','test1@bdqn.cn','450323198112311234'),(1002,'111111','李斯文',1,1,'13500000003','天津市和平区','1986-11-30 00:00:00','test1@bdqn.cn','450323198611301234'),(1003,'123456','武松',1,3,'13500000004','上海卢湾区','1986-12-31 00:00:00','test1@bdqn.cn','450323198612314234'),(1004,'123456','张三',1,4,'13500000005','北京市通州','1989-12-31 00:00:00','test1@bdqn.cn','450323198612311244'),(1005,'123456','张秋丽 ',2,1,'13500000006','广西桂林市灵川','1986-12-31 00:00:00','test1@bdqn.cn','450323198612311214'),(1006,'123456','肖梅',2,4,'13500000007','地址不详','1986-12-31 00:00:00','test1@bdqn.cn','450323198612311134'),(1007,'111111','欧阳峻峰',1,1,'13500000008','北京东城区','1986-12-31 00:00:00','test1@bdqn.cn','450323198612311133'),(1008,'111111','梅超风',1,1,'13500000009','河南洛阳','1986-12-31 00:00:00','test1@bdqn.cn','450323198612311221'),(1009,'123456','刘毅',1,2,'13500000011','安徽','1986-12-31 00:00:00','test1@bdqn.cn','450323198612311231'),(1010,'111111','大凡',1,1,'13500000012','河南洛阳','1986-12-31 00:00:00','test1@bdqn.cn','450323198612311044'),(1011,'111111','奥丹斯',1,1,'13500000013','北京海淀区中关村大街*号','1984-12-31 00:00:00','test1@bdqn.cn','450323198412311234'),(1012,'123456','多伦',2,3,'13500000014','广西南宁中央大街','1986-12-31 00:00:00','test1@bdqn.cn','450323198612311334'),(1013,'123456','李梅',2,1,'13500000015','上海卢湾区','1986-12-31 00:00:00','test1@bdqn.cn','450323198612311534'),(1014,'123456','张得',2,4,'13500000016','北京海淀区中关村大街*号','1986-12-31 00:00:00','test1@bdqn.cn','450323198612311264'),(1015,'123456','李东方',1,4,'13500000017','广西桂林市灵川','1976-12-31 00:00:00','test1@bdqn.cn','450323197612311234'),(1016,'111111','刘奋斗',1,1,'13500000018','上海卢湾区','1986-12-31 00:00:00','test1@bdqn.cn','450323198612311251'),(1017,'123456','可可',2,3,'13500000019','北京长安街1号','1981-09-10 00:00:00','test1@bdqn.cn','450323198109108311'),(10066,'','Tom',1,1,'13500000000','','0000-00-00 00:00:00','email@22.com','33123123123123123');/*Table structure for table `subject` */DROP TABLE IF EXISTS `subject`;CREATE TABLE `subject` (  `SubjectNo` INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',  `SubjectName` VARCHAR(50) DEFAULT NULL COMMENT '课程名称',  `ClassHour` INT(4) DEFAULT NULL COMMENT '学时',  `GradeID` INT(4) DEFAULT NULL COMMENT '年级编号',  PRIMARY KEY (`SubjectNo`)) ENGINE=INNODB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;/*Data for the table `subject` */INSERT  INTO `subject`(`SubjectNo`,`SubjectName`,`ClassHour`,`GradeID`) VALUES (1,'高等数学-1',110,1),(2,'高等数学-2',110,2),(3,'高等数学-3',100,3),(4,'高等数学-4',130,4),(5,'C语言-1',110,1),(6,'C语言-2',110,2),(7,'C语言-3',100,3),(8,'C语言-4',130,4),(9,'JAVA第一学年',110,1),(10,'JAVA第二学年',110,2),(11,'JAVA第三学年',100,3),(12,'JAVA第四学年',130,4),(13,'数据库结构-1',110,1),(14,'数据库结构-2',110,2),(15,'数据库结构-3',100,3),(16,'数据库结构-4',130,4),(17,'C#基础',130,1);/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

指定查询字段

查询表结果时 , 可指定查询结果的数据列

  • 查询表中所有的数据列结果 , 采用 " * " 符号;
  • 如 : SELECT * FROM student;
  • 但是效率低 , 不推荐
# 查询所有学生信息SELECT * FROM student;# 查询指定列(学号 , 姓名)SELECT studentno,studentname FROM student;

AS子句作为别名

AS子句作用 :

  • 可给数据列取一个新别名
  • 可给表去一个新别名
  • 可把经计算或总结的结果用另一个新名称来代替
# 这里是为列取别名(当然as关键词可以省略)SELECT studentno AS 学号,studentname AS 姓名 FROM student;# 使用as也可以为表取别名SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;# 使用as,为查询结果取一个新名字# CONCAT()函数拼接字符串SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;

DISTINCT关键字的使用

作用 : 去掉SELECT查询返回的记录结果中重复的记录(返回所有列的值都相同),只返回一条

# 查看哪些同学参加了考试(学号)--去除重复项SELECT * FROM result; # 查看考试成绩SELECT studentno FROM result; # 查看哪些同学参加了考试SELECT DISTINCT studentno FROM result;# 了解:DISTINCT 去除重复项 , (默认是ALL)

SELECT基本语法

#1.[ALL | DISTINCT] 全部/去重复 【+】#2.选择的字段可以是表,可以是列,通过as取别名 【+】#3.从哪个表选择 通过as 取别名#4.连接查询(左连接,右连接,内连接)【+】#5.where 条件子句【+】#6.GROUP BY 通过什么列分组,返回每个列的数量#7.HAVING 次条件子句#8 ORDER BY 通过什么列进行排序,升序ASC 降序DESC#9.Limit startRows,PagesRows 【+】SELECT [ALL | DISTINCT]{
* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}FROM table_name [as table_alias] [left | right | inner join table_name2] #联合查询 [WHERE ...] #指定结果需满足的条件 [GROUP BY ...] #指定结果按照哪几个字段来分组 [HAVING] #过滤分组的记录必须满足的次要条件 [ORDER BY ...] #指定查询记录按一个或多个条件排序 [LIMIT {
[offset,]row_count | row_countOFFSET offset}]; # 指定查询的记录从哪条至哪条

where条件语句

  • 用于检索数据表中 符合条件 的记录
  • 搜索条件可由一个或多个逻辑表达式组成 , 结果一般为真或假.
  • 用于模糊查询
  • 逻辑操作符
操作符名称 语法 描述
AND 或 && a and b 或 a && b 逻辑与,同时为真结果才为真
OR 或 || a OR b 或 a||b 逻辑或,只要一个为真,则结果为真
NOT或! NOT a 或 !a 逻辑非,若操作数为假,结果则为真
  • 比较操作符
操作符名称 语法 描述
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,则结果为真
IN a IN (a1,a2,a3,…,) 若a等于a1,a2…中的某一个,则结果为真

以上面的查询小节的sql语句为例子,where的运用示例l如下:

# 满足条件的查询(where)SELECT Studentno,StudentResult FROM result;# 查询考试成绩在95-100之间的SELECT Studentno,StudentResult FROM resultWHERE StudentResult>=95 AND StudentResult<=100;# AND也可以写成 &&SELECT Studentno,StudentResult FROM resultWHERE StudentResult>=95 && StudentResult<=100;# 模糊查询(对应的词:精确查询)SELECT Studentno,StudentResult FROM resultWHERE StudentResult BETWEEN 95 AND 100;# 除了1000号同学,要其他同学的成绩SELECT studentno,studentresultFROM resultWHERE studentno!=1000;# 使用NOTSELECT studentno,studentresultFROM resultWHERE NOT studentno=1000;

注意:

  • 数值数据类型的记录之间才能进行算术运算
  • 相同数据类型的数据之间才能进行比较

模糊查询

#模糊查询 between and \ like \ in \ null#=============================================# LIKE#=============================================#查询姓李的同学的学号及姓名#like结合使用的通配符 : % (代表0到任意个字符)  _ (一个字符)SELECT studentno,studentname FROM studentWHERE studentname LIKE '李%';#查询姓李的同学,后面只有一个字的SELECT studentno,studentname FROM studentWHERE studentname LIKE '李_';#查询姓李的同学,后面只有两个字的SELECT studentno,studentname FROM studentWHERE studentname LIKE '李__';#查询姓名中含有 文 字的SELECT studentno,studentname FROM studentWHERE studentname LIKE '%文%';#查询姓名中含有特殊字符的需要使用转义符号 '\'#自定义转义符关键字:  ESCAPE ':'#=============================================# IN#=============================================#查询学号为1000,1001,1002的学生姓名SELECT studentno,studentname FROM studentWHERE studentno IN (1000,1001,1002);#查询地址在北京,南京,河南洛阳的学生SELECT studentno,studentname,address FROM studentWHERE address IN ('北京','南京','河南洛阳');#=============================================# NULL 空#=============================================#查询出生日期没有填写的同学#不能直接写=NULL , 这是代表错误的 , 用 is null SELECT studentname FROM studentWHERE BornDate IS NULL;#查询出生日期填写的同学SELECT studentname FROM studentWHERE BornDate IS NOT NULL;#查询没有写家庭住址的同学(空字符串不等于null)SELECT studentname FROM studentWHERE Address='' OR Address IS NULL;

连表查询

  • join列表如下:
操作符名称 描述
INNER JOIN(JOIN) 如果表中有至少一个匹配,则返回行
LEFT JOIN 即使右表中没有匹配,也从左表中返回所有的行
RIGHT JOIN 即使左表中没有匹配,也从右表中返回所有的行

在这里插入图片描述

/*连接查询    如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询内连接 inner join    查询两个表中的结果集中的交集外连接 outer join    左外连接 left join        (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)    右外连接 right join        (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)        等值连接和非等值连接自连接*/#查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)SELECT * FROM student;SELECT * FROM result;/*思路:(1):分析需求,确定查询的列来源于两个类,student  result,连接查询(2):确定使用哪种连接查询?(内连接)*/SELECT s.studentno,studentname,subjectno,StudentResultFROM student sINNER JOIN result rON r.studentno = s.studentno# 右连接(也可实现)SELECT s.studentno,studentname,subjectno,StudentResultFROM student sRIGHT JOIN result rON r.studentno = s.studentno# 等值连接SELECT s.studentno,studentname,subjectno,StudentResultFROM student s , result rWHERE r.studentno = s.studentno# 左连接 (查询了所有同学,不考试的也会查出来)SELECT s.studentno,studentname,subjectno,StudentResultFROM student sLEFT JOIN result rON r.studentno = s.studentno#查一下缺考的同学(左连接应用场景)SELECT s.studentno,studentname,subjectno,StudentResultFROM student sLEFT JOIN result rON r.studentno = s.studentnoWHERE StudentResult IS NULL#思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)SELECT s.studentno,studentname,subjectname,StudentResultFROM student sINNER JOIN result rON r.studentno = s.studentnoINNER JOIN `subject` subON sub.subjectno = r.subjectno
  • 自连接
    本质:就是一张表,自己对应自己查询
    核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询
/*自连接    数据表与自身进行连接需求:从一个包含栏目ID , 栏目名称和父栏目ID的表中      查询父栏目名称和其他子栏目名称*/# 创建一个表CREATE TABLE `category` (  `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id',  `pid` INT(10) NOT NULL COMMENT '父id',  `categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字',  PRIMARY KEY (`categoryid`)) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8# 插入数据INSERT INTO `category` (`categoryid`, `pid`, `categoryName`) VALUES('2','1','信息技术'),('3','1','软件开发'),('4','3','数据库'),('5','1','美术设计'),('6','3','web开发'),('7','5','ps技术'),('8','2','办公信息');# 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)# 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'FROM category AS a,category AS bWHERE a.`categoryid`=b.`pid`#思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)SELECT s.studentno,studentname,subjectname,StudentResultFROM student sINNER JOIN result rON r.studentno = s.studentnoINNER JOIN `subject` subON sub.subjectno = r.subjectno# 查询学员及所属的年级(学号,学生姓名,年级名)SELECT studentno AS 学号,studentname AS 学生姓名,gradename AS 年级名称FROM student sINNER JOIN grade gON s.`GradeId` = g.`GradeID`# 查询科目及所属的年级(科目名称,年级名称)SELECT subjectname AS 科目名称,gradename AS 年级名称FROM SUBJECT subINNER JOIN grade gON sub.gradeid = g.gradeid# 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)SELECT s.studentno,studentname,subjectname,StudentResultFROM student sINNER JOIN result rON r.studentno = s.studentnoINNER JOIN `subject` subON r.subjectno = sub.subjectnoWHERE subjectname='数据库结构-1'

排序和分页

/*============== 排序 ================语法 : ORDER BY     ORDER BY 语句用于根据指定的列对结果集进行排序。    ORDER BY 语句默认按照ASC升序对记录进行排序。    如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。    */# 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)# 按成绩降序排序SELECT s.studentno,studentname,subjectname,StudentResultFROM student sINNER JOIN result rON r.studentno = s.studentnoINNER JOIN `subject` subON r.subjectno = sub.subjectnoWHERE subjectname='数据库结构-1'ORDER BY StudentResult DESC , studentno/*============== 分页 ================语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset好处 : (用户体验,网络传输,查询压力)推导:     第一页 : limit 0,5    第二页 : limit 5,5    第三页 : limit 10,5    ......    第N页 : limit (pageNo-1)*pageSzie,pageSzie    [pageNo:页码,pageSize:单页面显示条数]    */# 每页显示5条数据SELECT s.studentno,studentname,subjectname,StudentResultFROM student sINNER JOIN result rON r.studentno = s.studentnoINNER JOIN `subject` subON r.subjectno = sub.subjectnoWHERE subjectname='数据库结构-1'ORDER BY StudentResult DESC , studentnoLIMIT 0,5#查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)SELECT s.studentno,studentname,subjectname,StudentResultFROM student sINNER JOIN result rON r.studentno = s.studentnoINNER JOIN `subject` subON r.subjectno = sub.subjectnoWHERE subjectname='JAVA第一学年'ORDER BY StudentResult DESCLIMIT 0,10

MySql事务

  • 事务就是将一组SQL语句放在同一批次内去执行
  • 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
  • MySQL事务处理只支持InnoDB和BDB数据表类型

事务的ACID原则

原子性(Atomic)
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(ROLLBACK)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性(Consist)

一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性。

隔离性(Isolated)

隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

持久性(Durable)

在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

/* 使用set语句来改变自动提交模式 */SET autocommit = 0;   /*关闭*/SET autocommit = 1;   /*开启*//* 注意    1.MySQL中默认是自动提交    2.使用事务时应先关闭自动提交*//*开始一个事务,标记事务的起始点*/START TRANSACTION   /*提交一个事务给数据库*/COMMIT/*将事务回滚,数据回到本次事务的初始状态*/ROLLBACK/*还原MySQL数据库的自动提交*/SET autocommit =1;-- 保存点    SAVEPOINT 保存点名称 -- 设置一个事务保存点    ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点    RELEASE SAVEPOINT 保存点名称 -- 删除保存点

处理步骤:

在这里插入图片描述
示例如下:

/*课堂测试题目A在线买一款价格为500元商品,网上银行转账.A的银行卡余额为2000,然后给商家B支付500.商家B一开始的银行卡余额为10000创建数据库shop和创建表account并插入2条数据*/CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci; USE `shop`; CREATE TABLE `account` (  `id` INT(11) NOT NULL AUTO_INCREMENT,  `name` VARCHAR(32) NOT NULL,  `cash` DECIMAL(9,2) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO account (`name`,`cash`)VALUES('A',2000.00),('B',10000.00)# 转账实现SET autocommit = 0;START TRANSACTION;UPDATE account SET cash=cash-500 WHERE `name`='A';UPDATE account SET cash=cash+500 WHERE `name`='B';COMMIT;# rollback;SET autocommit = 1;

数据库索引

作用 :

  • 提高查询速度
  • 确保数据的唯一性
  • 可以加速表和表之间的连接 , 实现表与表之间的参照完整性
  • 使用分组和排序子句进行数据检索时 , 可以显著减少分组和排序的时间
  • 全文检索字段进行搜索优化.

分类 :

主键索引 (Primary Key)

唯一索引 (Unique)
常规索引 (Index)
全文索引 (FullText)

主键索引

主键 : 某一个属性组能唯一标识一条记录

特点 :

  • 最常见的索引类型
  • 确保数据记录的唯一性
  • 确定特定数据记录在数据库中的位置

唯一索引

作用 : 避免同一个表中某数据列中的值重复

与主键索引的区别

  • 主键索引只能有一个
  • 唯一索引可能有多个
    在这里插入图片描述

常规索引

作用 : 快速定位特定数据

注意 :

  • index 和 key 关键字都可以设置常规索引
  • 应加在查询找条件的字段
  • 不宜添加太多常规索引,影响数据的插入,删除和修改操作
    在这里插入图片描述

全文索引

作用 : 快速定位特定数据

注意 :

  • 只能用于MyISAM类型的数据表
  • 只能用于CHAR , VARCHAR , TEXT数据列类型
  • 适合大型数据集

创建/删除索引

/*#方法一:创建表时      CREATE TABLE 表名 (                字段名1  数据类型 [完整性约束条件…],                字段名2  数据类型 [完整性约束条件…],                [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY                [索引名]  (字段名[(长度)]  [ASC |DESC])                 );#方法二:CREATE在已存在的表上创建索引        CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名                      ON 表名 (字段名[(长度)]  [ASC |DESC]) ;#方法三:ALTER TABLE在已存在的表上创建索引        ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX                             索引名 (字段名[(长度)]  [ASC |DESC]) ;                                                          #删除索引:DROP INDEX 索引名 ON 表名字;#删除主键索引: ALTER TABLE 表名 DROP PRIMARY KEY;#显示索引信息: SHOW INDEX FROM student;*//*增加全文索引*/ALTER TABLE `school`.`student` ADD FULLTEXT INDEX `studentname` (`StudentName`); /*EXPLAIN : 分析SQL语句执行性能*/EXPLAIN SELECT * FROM student WHERE studentno='1000';/*使用全文索引*/EXPLAIN SELECT *FROM student WHERE MATCH(studentname) AGAINST('love');复制代码索引的两大类型hash与btree复制代码#我们可以在创建上述索引的时候,为其指定索引类型,分两类hash类型的索引:查询单条快,范围查询慢btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)#不同的存储引擎支持的索引类型也不一样InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;

索引准则

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表建议不要加索引
  • 索引一般应加在查找条件的字段

MySql备份

  • 数据库备份必要性
    • 保证重要数据不丢失
    • 数据转移
  • MySQL数据库备份方法
    • mysqldump备份工具
    • 数据库管理工具,如SQLyog
    • 直接拷贝数据库文件和相关配置文件

mysqldump客户端

作用 :

  • 转储数据库
  • 搜集数据库进行备份
  • 将数据转移到另一个SQL服务器,不一定是MySQL服务器

语法 :

在这里插入图片描述

-- 导出1. 导出一张表  mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql)2. 导出多张表  mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 文件名(D:/a.sql)3. 导出所有表  mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql)4. 导出一个库   mysqldump -u用户名 -p密码 -B 库名 > 文件名(D:/a.sql)可以-w携带备份条件-- 导入1. 在登录mysql的情况下:  source  备份文件2. 在不登录的情况下  mysql -u用户名 -p密码 库名 < 备份文件

三大范式

不合规范的表设计:

  • 信息重复
  • 更新异常
  • 插入异常
  • 无法正确表示信息
  • 删除异常
  • 丢失有效信息

第一范式 (1st NF)

第一范式的目标是确保每列的原子性,如果每列都是不可再分的最小数据单元,则满足第一范式(数据表的列尽量不要有歧义,不可再分)

第二范式(2nd NF)

第二范式要求每个表只描述一件事情(每个表只专心于一件事情)

第三范式(3rd NF)

如果一个关系满足第二范式,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(一个表尽量保持一个主键)

规范化和性能的关系

为满足某种商业目标,数据库性能比规范化数据库更重要

在数据规范化的同时,要综合考虑数据库的性能

通过在给定的表中添加额外的字段,以大量减少需要从中搜索信息所需的时间

通过在给定的表中插入计算列,以方便查询

规范化数据库设计

为什么需要设计数据库 ?

答:当数据库比较复杂时我们需要设计数据库

糟糕的数据库设计 :

  • 数据冗余,存储空间浪费
  • 数据更新和插入的异常
  • 程序性能差

良好的数据库设计 :

  • 节省数据的存储空间
  • 能够保证数据的完整性
  • 方便进行数据库应用系统的开发

软件项目开发周期中数据库设计 :

  • 需求分析阶段: 分析客户的业务和数据处理需求
  • 概要设计阶段:设计数据库的E-R模型图 , 确认需求信息的正确和完整.

设计数据库步骤

  • 收集信息
    - 与该系统有关人员进行交流 , 座谈 , 充分了解用户需求 ,理解数据库需要完成的任务.
    标识实体[Entity]
    - 标识数据库要管理的关键对象或实体,实体一般是名词
  • 标识每个实体需要存储的详细信息[Attribute]
  • 标识实体之间的关系[Relationship]

转载地址:http://iicen.baihongyu.com/

你可能感兴趣的文章
Spring学习(四)
查看>>
java解惑——易错知识点归纳总结
查看>>
Memcached 集群部署
查看>>
Memcached与Spring AOP构建数分布式据库前端缓存框架
查看>>
数据挖掘常用算法整理
查看>>
JNDI学习总结(一)——JNDI数据源的配置
查看>>
JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI数据源
查看>>
JNDI学习总结(三)——Tomcat下使用Druid配置JNDI数据源
查看>>
JavaWeb学习总结(四十九)——简单模拟Sping MVC
查看>>
Struts1和Struts2的区别和对比(完整版)
查看>>
在Eclipse中初用lucene
查看>>
lucene在eclipse下运行
查看>>
eclipse 安装struts2 插件
查看>>
Liferay配置文件Tag标签参考
查看>>
JavaLiferay研究之十六:FCKeditor如何插入服务器上的资源?
查看>>
Liferay研究之十二:对Liferay框架的几点分析总结 收藏
查看>>
Eclipse快捷键大全(转载)
查看>>
Google爬虫如何抓取JavaScript的?
查看>>
SAP HANA SQL/MDX及TCP/IP端口介绍
查看>>
SAP HANA使用XS和HTTP创建proxy
查看>>