数据存储

集合
数组

容器----->使用完毕就不存在了集合对象/数组—被回收!
IO流
字节流/字符流 将数据存储到配置文件/xxx.txt文件中 ,效率低(耗时)

在计算机上–按照数据库软件

关系型数据库

     SQLServer,Oracle,db2,Mysql(开源,小型化)

非关型数据库

     典型代表:mangodb/redis(key-value形式)---(缓存一些数据)

验证是否安装完毕(登录成功,说明mysql的环境变量也配置了)
C:\Users>mysql -uroot -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.40 MySQL Community Server (GPL)

Copyright © 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>

DDL语句:数据库的定义:对数据库以及表的操作

四个:mysql默认带的四个库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |   相关配置信息库
| mysql              |   存储相关表:user 用户表(管理员)
| performance_schema |   mysql性能相关的
| test               |   测试的库
+--------------------+
4 rows in set (0.00 sec)

– 创建数据库

create  database 数据库名;
mysql> create database mydb_01;
Query OK, 1 row affected (0.01 sec)

– 方式2: create database if not exists 数据库名; 如果不存在这个库,创建一个新的

mysql> create database if not exists my_db02;
Query OK, 1 row affected (0.02 sec)

– 查看数据库的信息 (数据库名,以及数据库的默认的编码格式)

mysql> show create database mydb_01;
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| mydb_01  | CREATE DATABASE `mydb_01` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.01 sec)

– 修改数据库的这个编码格式gbk

alter databse 数据库名 DEFAULT(省略不写) CHARACTER set  gbk ;
mysql> alter database mydb_01 default character set gbk;
Query OK, 1 row affected (0.01 sec)mysql> show create database mydb_01;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| mydb_01  | CREATE DATABASE `mydb_01` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)

– 删除数据库

drop database 数据库名;
mysql> drop database my_db02;
Query OK, 0 rows affected (0.02 sec)

– 方式2

drop database if exists 数据库名; 如果存在,删除该库
mysql> drop database if exists mydb_02;
Query OK, 0 rows affected (0.00 sec)

– 修改库的字符集:创建数据库的时候直接修改了库的字符集

 create database if not exists 数据库名 default(不写) character set 字符集 ;
mysql> create database if not exists mydb_04 default character set gbk ;
Query OK, 1 row affected (0.01 sec)

DDL语句操作表

创建表

create table 表名(
字段名称1 字段类型1,
字段名称2 字段类型2,
字段名称3 字段类型3,

字段名称n 字段端类型n
);

常见字段类型:

varchar(m):m多少个字符-------------mysql字符串类型
int: 默认int(11):11位(记录实际字符) int(num):参数指定长度 mysql:整数类型
int(4) 1 ------>0001
double(5,2) mysql的小数类型 :表示小数5位,小数点后保留2位
时间:
date mysql的日期时间(仅仅是日期,不包含具体时间): 年月日 2020/11/5
datetime mysql的日期时间:是日期+具体时间 2020/11/5 时分秒…
timestamp(时间戳) 具体哪个时间操作的表 2020//11/15 16:16这个时间修改了表的字段

在创建表之前,先使用这个库
use 数据库名

mysql> use mydb_01;
Database changed

查询该库中的表

mysql> show tables;
Empty set (0.00 sec)

在mydb_01创建一个学生表
学生表 数据类型
姓名 varchar(3)
年龄 int
性别 varchar(2)
分数 double
出生日期 date

mysql> create table student(-> name varchar(3),-> age int,-> gender varchar(2),-> socre double(3,1),-> birthday date-> );
Query OK, 0 rows affected (0.03 sec)mysql> show tables;
+-------------------+
| Tables_in_mydb_04 |
+-------------------+
| student           |
+-------------------+
1 row in set (0.00 sec)

— 查询表的结构
desc 表名;

mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| name     | varchar(3)  | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| gender   | varchar(2)  | YES  |     | NULL    |       |
| socre    | double(3,1) | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

– 修改表
– 给表中新增一列 (加入一个新的字段)

mysql> alter table student add address varchar(10);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| name     | varchar(3)  | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| gender   | varchar(2)  | YES  |     | NULL    |       |
| socre    | double(3,1) | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
| address  | varchar(10) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.04 sec)

– 修改表的数据类型

mysql> alter table student modify gender varchar(3);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| name     | varchar(3)  | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| gender   | varchar(3)  | YES  |     | NULL    |       |
| socre    | double(3,1) | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
| address  | varchar(10) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.05 sec)

– 修改表的名称 change

mysql> alter table student change gender sex varchar(3);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| name     | varchar(3)  | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| sex      | varchar(3)  | YES  |     | NULL    |       |
| socre    | double(3,1) | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
| address  | varchar(10) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.05 sec)

– 修改表的名称
alter table 表名 rename to 新表名;

mysql> alter table student rename to teacher;
Query OK, 0 rows affected (0.01 sec)mysql> show tables;
+-------------------+
| Tables_in_mydb_04 |
+-------------------+
| teacher           |
+-------------------+
1 row in set (0.00 sec)

– 删除表

mysql> drop table teacher;
Query OK, 0 rows affected (0.01 sec)mysql> show tables;
Empty set (0.00 sec)mysql> drop table if exists teacher;
Query OK, 0 rows affected (0.01 sec)

对数据库表的增删改查

desc 表名: 查询表的结构 (字段名称/字段类型)
#注释(类上语法语气词)

USE mydb_04;

– 在mydb_04数据库中创建一张表 student
– 编号 int类型
– 姓名 varchar(5)
– 年龄 int类型
– 性别 varchar(2)
– 成绩 double(3,1)
– 出生日期 data(日期)

CREATE TABLE student(id INT, -- 编号NAME VARCHAR(5), -- 姓名age INT , -- 年龄gender VARCHAR(2) , -- 性别socre DOUBLE(3,1) , -- 成绩birthday DATE);

– 查询表的结构

DESC student;

– DML语句:操作语句

插入数据1) (给表中的每一个字段赋值)

insert into 表名 values(值1,值2,值3,…)

INSERT INTO student VALUES(1,'小姐姐',27,'女',99.8,'1990-2-3') ;

– 插入部分字段2)

注意事项:没有赋值的字段都是NULL(空值)
– insert into 表名(id,name,age,gender) values(值1,…) ;

INSERT INTO student(id,NAME,age,gender) VALUES(2,'张冲',23,'男') ;

– 注意事项:

1)插入数据的时候,插入字段顺序必须要表的字段对应上
INSERT INTO student VALUES(‘李文擘’,3,23,‘男’,90.8,‘1997-11-5’) ;
– 2)如果是给全部字段插入数据,中间逗号隔开,依次插入多条语句!

INSERT INTO student VALUES (3,'赵又廷',38,'男',66.9,'1987-11-5'),(4,'啦啦',26,'男',89.9,'1995-11-2') ;

– 删除表的记录

delete from 表名 条件(where)

– 带条件删除

DELETE FROM student WHERE socre = 90.8 ;

– 删除全表数据:

TRUNCATE table student;

TRUNCATE table 表名 和 delete from 表名 有什么区别?

1)delete from 表名:删除全表数据 TRUNCATE table 表名 :删除表以及表中的数据–创建一张一模一样的表
– 2)是否对自增长的主键影响?
delete from 表名 不会影响自增长的主键(删除全表的数据)(不会清除自增长主键!)
TRUNCATE TABLE 表名 :直接删除了表(并且同时创建一张一模一样的表):自增长主键会清除掉!

CREATE TABLE stu(id INT PRIMARY KEY AUTO_INCREMENT  , -- 增长的主键 NAME VARCHAR(5),age INT
) ;
DROP TABLE stu ;
SELECT * FROM stu ;
INSERT INTO stu VALUES(1,'张三',20),(2,'李四',22) ;
INSERT INTO stu(NAME,age) VALUES('张钰',29) ;

– delete from 表名

DELETE FROM stu;
TRUNCATE TABLE stu ;

– 修改表

带条件修改单个字段

update 表名 set 字段名 = 赋值 where 字段 = 值;

UPDATE student SET NAME = '张慧' WHERE id = 2 ;

– 注意:update语句都需要带上where条件,否则就是"批量修改"

UPDATE student SET NAME = '三个' ;

– 修改多个字段

将id=4的这个人 name=‘张冲’ 并将年龄改成23

UPDATE student SET NAME = '张冲',age = 23 WHERE id = 4 ;

– DQL语句 数据库的查询语句

基本的查询语句

select 全部字段(*) from 表名; 查询全表数据

SELECT * FROM student ;

– 查询指定的字段

需求:查询id,name,age字段

SELECT id,NAME,ageFROM student ;

– msyql的基础语法使用

CREATE TABLE student3( id INT, -- 编号 NAME VARCHAR(20), -- 姓名 age INT, -- 年龄sex VARCHAR(5), -- 性别 address VARCHAR(100), -- 地址 math INT, -- 数学 english INT -- 英语
);
INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES
(1,'马云',55,'男',' 杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩 ',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港 ',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);

– 查询全表数据

SELECT * FROM student3;

– 查询语句

条件查询

基本条件查询:where语句

条件:使用表达式符号<,>,<=,<=

– !=(java的语法),<>(不等于 mysql的语法)
– 并列关系:and &&
– >=xx and <= xx 等价于 between xx and xx
– 或的关系:or ||
– 集合in(18,25,19)
– 条件: is null :xxx是null值 不是null (is not null)

– 基本查询
– 需求:查询指定的学生信息 姓名和年龄

SELECT NAME,age FROM student3;

– 需求:查询address地址信息

SELECT  address FROM student3;

– 将地址去重(select distinct 字段名称:将该字段去查询)

SELECT DISTINCT address FROM student3;
-- select name,address from student3;

– 需求:查询name,总分成绩

SELECT NAME,   (math+english) FROM student3;

– 查询的时候想给某个字段起别名 需要查询的字段名称 as(省略不写) ‘名称’

SELECTNAME AS '姓名',(math+english) AS '总分'
FROM student3;

– 注意事项:对两个字段进行求和 两个字段必须一致:int类型(math+english)
– 当前柳青的英语成绩为null
– 在获取英语成绩的时候提供一个函数IFNULL(字段名,默认值):如果当前字段名称是null值,
– 使用默认值给它赋值

SELECT NAME '姓名',(math+IFNULL(english,0))FROM student3;
SELECT NAME '姓名',age '年龄',sex '性别',address '地址',math '数学',english '英语'FROM student3;
SELECT * FROM student3;

– 条件:使用表达式符号<,>,<=,<=
– !=(java的语法),<>(不等于 mysql的语法)
– 并列关系:and &&
– >=xx and <= xx 等价于 between xx and xx
– 或的关系:or ||
– 集合in(18,25,19)
– 条件: is null :xxx是null值 不是null (is not null)

DESC student3 ;

– 数据库的约束

约束:通过一些特定的关键字 保证数据的安全性,正确性和有效性!

– 数据库的约束

默认约束 字段名称 类型 default ‘值’
– 非空约束 not null
– 唯一约束 unique
– 主键约束 primary key
– 自增长约束 auto_increment
– 外键约束 foreign key

USE mydb_04;

– 新建一张表

CREATE TABLE stu(id INT ,-- 学号NAME VARCHAR(3) -- 姓名
) ;
DROP TABLE stu ;

I

NSERT INTO stu VALUES(1,'张三','男') ,(2,'王五','男') ;
SELECT * FROM stu ;

– 加入一列 :修改表
– 加入性别字段

ALTER TABLE stu ADD gender VARCHAR(2) ;

– 问题当前表中存在null值(没意义的)
– 插入的时候:插入部分字段,没有赋值的字段是null

INSERT INTO stu(id,NAME) VALUES(3,'赵六') ;

– 为了防止没有插入的字段是null值,可以在创建表的时候加入非空约束
– default默认约束:是当某个字段没有赋值的时候起作用,如果赋值了,那么按照实际值 赋值即可!

CREATE TABLE stu(id INT ,-- 学号NAME VARCHAR(3), -- 姓名gender VARCHAR(2) DEFAULT '男'
) ;
INSERT INTO stu(id,NAME) VALUES(1,'张冲') ;
INSERT INTO stu VALUES(2,'王五','女') ;
INSERT INTO stu VALUE(3,'一鸣',NULL) ;

– 数据不安全(默认约束还是存在问题!)

SELECT * FROM stu ;
DROP TABLE stu ;

– 非空约束 not null

创建表的时候加入非空约束

CREATE TABLE stu(id INT,NAME VARCHAR(3) NOT NULL -- 姓名不能null值
);

– 插入全部字段数据

INSERT INTO stu VALUES(1,'张佳宁'),(2,'高圆圆'),(3,'王晓晨') ;INSERT INTO stu VALUES(4,NULL) ;-- 当前name值不能null -- Column 'name' cannot be null  列name不能为空
INSERT INTO stu VALUE(4,' ') ;    -- 插入空字符串
DELETE FROM stu WHERE id = 4 ;

– 将非空约束干掉
– 修改表的字段类型

ALTER TABLE stu MODIFY NAME VARCHAR(3) ;
INSERT INTO stu VALUES(4,NULL) ;
DELETE FROM stu WHERE id = 4 ;

– 修改表:再加入非空约束

ALTER TABLE stu MODIFY NAME VARCHAR(3) NOT NULL ;SELECT * FROM stu ;
DROP TABLE stu ;

– 唯一约束 unique

创建表的时候加入唯一约束

CREATE TABLE stu(id INT,phone_number VARCHAR(11) UNIQUE
) ;

– 插入数据

INSERT INTO stu VALUES(1,'18666668888') ;
-- insert into stu values(2,'18666668888') ;-- 字段不能重复 (UNIQUE 唯一)
INSERT INTO stu VALUES(2,'18266668888') ;
INSERT INTO stu VALUES(3,'18266668888') ;
DELETE FROM stu WHERE id  = 3 ;
SELECT * FROM stu ;

– 修改表:删除唯一约束

-- alter table stu modify phone_number varchar(11) ;
-- alter table 表名 drop index 带有唯一约束的字段名称;
ALTER TABLE stu DROP INDEX phone_number;

– 修改表:添加唯一约束

ALTER TABLE stu MODIFY phone_number VARCHAR(11) UNIQUE ;
INSERT INTO stu VALUES(3,'18266668888') ; -- 当前加入唯一约束 不能重复DROP TABLE stu ;

– 主键约束 primary key

特点:非空且唯一

CREATE TABLE stu(INT PRIMARY KEY , -- 主键都应用在非业务字段上 NAME VARCHAR(5)
);
INSERT INTO stu VALUES(1,'张佳宁'),(2,'高圆圆') ;
-- insert into stu values(1,'王晓晨') ; -- id值不能重复的!
-- insert into stu values(null,'王晓晨') ;-- Column 'id' cannot be null id不能null

一个表中
非业务字段 + 业务子弹

id name age sex gender music

通过id设置主键—是唯一的并且非空

举例:大学的学生的数据库name     age  sex  张三         20  男name      age  sex  李三         20  男业务字段可能随着需求的变化不断变化,都不会再业务字段上加入primary key
都是给每一张表设置id字段,并且主键+自增长

*/

– 通过修改表:删除主键

-- alter table 表名 drop PRIMARY KEY ;
ALTER TABLE stu DROP PRIMARY KEY ;

– 添加主键约束

ALTER TABLE stu MODIFY id INT PRIMARY KEY ;INSERT INTO stu VALUES(1,'张三') ;DELETE FROM stu WHERE NAME = '张三' ;
SELECT * FROM stu ;DROP TABLE stu ;

– 自增长约束 auto_increment

CREATE TABLE stu(id INT PRIMARY KEY AUTO_INCREMENT, -- 自增长约束(id值自增从起始索引0一直++)NAME VARCHAR(3)
) ;
INSERT INTO stu(NAME) VALUES('高圆圆') ;
INSERT INTO stu(NAME) VALUES('赵又廷') ;INSERT INTO stu VALUES(5,'张佳宁') ;
INSERT INTO stu(NAME) VALUES('姚笛') ;SELECT * FROM stu ;

– 删除 自增长约束

ALTER TABLE stu MODIFY id INT;  -- 删除了自增长约束,主键约束还在
INSERT INTO stu(NAME) VALUES('文章');  -- 没有给id插入值,默认null 主键约束了,给默认值0DELETE FROM stu WHERE id = 0 ;
-- 添加 自增长约束ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;INSERT INTO stu(NAME) VALUES('林允儿');

– 外键约束:foreign key 让多个表之间产生一种关系,来保证数据的安全性和有效性!

创建员工表:employee
– 员工编号 主键 并且自增长
– 员工姓名
– 员工部门名称

CREATE TABLE employee (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(5),    -- 员工姓名dept_name VARCHAR(10)  -- 员工的部门名称
);

– 插入数据

INSERT INTO employee(NAME,dept_name) VALUES('张三','研发部') ;
INSERT INTO employee(NAME,dept_name) VALUES('李四','销售部') ;
INSERT INTO employee(NAME,dept_name) VALUES('王五','研发部') ;
INSERT INTO employee(NAME,dept_name) VALUES('赵六','销售部') ;
INSERT INTO employee(NAME,dept_name) VALUES('马七','测试部') ;
INSERT INTO employee(NAME,dept_name) VALUES('高圆圆','研发部') ;SELECT * FROM employee ;DROP TABLE employee ;

– 上面的表的结构-----数据库的设计 部门名称:字段值大量冗余(重复名称)
– 解决字段的冗余问题
– 方案:单独的在创建一张表:部门表 dept表 存储者三个部门:研发部,测试部,销售部

– 部门表
– 主表:没有外键的表

CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, -- 部门表的主键+自增长iddept_name VARCHAR(10) -- 部门名称) ;

– 插入三个部门

INSERT INTO dept(dept_name) VALUES('研发部') ;INSERT INTO dept(dept_name) VALUES('销售部') ;INSERT INTO dept(dept_name) VALUES('测试部') ;

– 创建员工表

 CREATE TABLE employee(id INT PRIMARY KEY AUTO_INCREMENT,-- 员工表的主键idNAME VARCHAR(5) , -- 员工姓名-- 定义字段:部门id -- 它的值和部门表的主键id 有关系dept_id INT );

– 插入员工信息

 INSERT INTO employee(NAME,dept_id) VALUES('张三',1) ;
INSERT INTO employee(NAME,dept_id) VALUES('李四',2) ;
INSERT INTO employee(NAME,dept_id) VALUES('王五',1) ;
INSERT INTO employee(NAME,dept_id) VALUES('赵六',2) ;
INSERT INTO employee(NAME,dept_id) VALUES('马七',3) ;
INSERT INTO employee(NAME,dept_id) VALUES('高圆圆',1)  ;

– 上面优化–已经 中文数据字段冗余问题: 创建一个部门表:将部门名称单独在该表中

 INSERT INTO employee(NAME,dept_id) VALUES('张冲',5) ;

– 问题:往员工表中插入一条不存在的部门数据,依然可以插入成功(存在非法数据!)

DROP TABLE dept ;
DROP  TABLE employee  ;

– 为了防止非法数据,加入一种潜在关系 外界约束
– 给某个字段设置外键约束
– constraint(声明) 外键名称() foreign key
– (员工表的dept_id) reference(关联) 部门表的主键id

SELECT * FROM dept ; -- 查询部门表SELECT * FROM emploee  ; -- 员工表

– 员工表:从表:外键是声明在从表上

 CREATE TABLE emploee(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(5) ,dept_id INT,CONSTRAINT dept_emp_fk FOREIGN KEY (dept_id) REFERENCES  dept(id) ) ;
 INSERT INTO emploee(NAME,dept_id) VALUES('张三',1) ;
INSERT INTO emploee(NAME,dept_id) VALUES('李四',2) ;
INSERT INTO emploee(NAME,dept_id) VALUES('王五',1) ;
INSERT INTO emploee(NAME,dept_id) VALUES('赵六',2) ;
INSERT INTO emploee(NAME,dept_id) VALUES('马七',3) ;
INSERT INTO emploee(NAME,dept_id) VALUES('高圆圆',1)  SELECT * FROM dept ; -- 查询部门表SELECT * FROM emploee  ; -- 员工表INSERT INTO emploee (NAME,dept_id) VALUES('张三丰',4) ; -- 当前4号部门不存在

– 如果先 存在4号部门-- 给员工表中添加数据
– 对于外键的关系表:主表,从表(外键)
– 添加或者修改操作:先修改主表,这个从表

INSERT INTO dept(dept_name) VALUES('市场部') ;

– 级联操作CASCADE

USE mydb_04;
SELECT * FROM emploee ;
SELECT * FROM dept ;

– 为什么使用级联操作

修改员工表(从表)的数据:dept_id
– 不能直接修改/删除当前字段,除非当前这个表字段和主表的id字段没有关联关系,才能修改!
– 删除员工表的id为9的人 (删除:先删除从表,在删除主表)

DELETE FROM emploee WHERE id = 9 ;

– 删除部门 :删除4号部门

DELETE FROM dept WHERE id = 4;

– 删除部门为3号部门

DELETE FROM dept WHERE id = 3 ;
-- Cannot delete or update a parent row: a foreign key constraint fails (`mydb_04`.`emploee`, CONSTRAINT `dept_emp_fk` FOREIGN KEY (`dept_id`) REFERENCES `dept` (`id`))

– 结论:删除或者修改主表:不能操作的----必须先对从表数据进行删除或者修改!

– 加入级联操作----修改或者删除主表 (从表的数据会随着主表的操作而变化!)
– sql语句先将外键约束删除

ALTER TABLE emploee DROP  FOREIGN KEY dept_emp_fk;

– 添加级联操作(级联修改和级联删除)

ALTER TABLE emploee ADD
CONSTRAINT dept_emp_fk FOREIGN KEY (dept_id) REFERENCES dept(id) ON DELETE CASCADE  ON UPDATE CASCADE ;

– 级联修改:

需求:将1号部门变成5号部门 ,跟1号部门相关的员工的部门编号也会变化

UPDATE dept SET id = 5 WHERE id = 1 ;

– 需求:删除2号部门,跟2号部门相关的员工也会被干掉

DELETE FROM dept WHERE id = 2 ;
SELECT * FROM dept ;
SELECT * FROM emploee ;

– 当前员工表的dept_id(部门编号) 完全依赖于 部门表id

– 数据库的备份和还原

– 备份

1)命令行的方式:进入dos
– 备份的语法格式 mysqldump -u用户名 -p密码 数据库的名称 > 保存的路径
– 2)使用推行界面化的方式来进行数据库的备份
– 进入到sqlyog工具中— 在数据库的上面右键—选择备份

– 还原数据库

1)进入dos之后:登录的msyql数据库中
– 登录成功之后,删除当前mydb_04这个数据库
– source 之前备份的sql文件路径-- 回车

– 2)图形界面化的方式
– 在sqlyog中删除当前mydb_04数据库,然后右键选择 以sql的转存文件来导入…

– 多表查询

通过查询两张或者两张以上的表时使用的sql语句—多表查询

CREATE DATABASE mydb_05 ;
USE mydb_05;

创建部门表

CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT,  -- 主键:部门编号NAME VARCHAR(20)  -- 部门名称
);
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');

创建员工表

CREATE TABLE emp ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10),gender CHAR(1), -- 性别 salary DOUBLE, -- 工资 join_date DATE, -- 入职日期 dept_id INT,    -- 部门编号FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)
);
-- 省略:constraint:声明  外键名称
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男 ',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男 ',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008- 08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女 ',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女 ',4500,'2011-03-14',1);

– 需求:要查询员工表以及部门表中的所有数据

-- select * from 表名1,表名2;
SELECT *
FROM    emp,dept;

– 存在问题:产生了一个笛卡尔乘积
– A表中有n条数据,B表中有m条数据,select * from A,B; ----n*m=总条数

– 解决上面笛卡尔积的方案
– 满足条件:
– 1)查询哪个表 员工表和部门表
– 2)查询指定表中的哪些字段 查询所有
– 3)这些表的连接接条件是什么 员工表的dept_id部门编号依赖于部门表的主键id

– 多表查询—内连接

隐式内连接
select
列名列表
from
表名列表
where
连接条件;

SELECT*
FROM emp,dept
WHERE emp.dept_id = dept.id ;

– 多表查询,查询指定字段

SELECT emp.name ,-- 员工名称emp.gender, -- 员工性别emp.salary, -- 员工工资emp.join_date, -- 入职日期dept.name -- 部门名称
FROMemp,  -- 员工表dept  -- 部门表
WHERE emp.dept_id = dept.id ;
-- 连接 条件

– 在查询时候,写表名太麻烦了,使用别名操作

SELECT t1.*, -- 员工表所有数据t2.name -- 部门名称
FROMemp  t1,dept t2
WHERE t1.dept_id = t2.id ;

– 显示内连接

select   列名列表
from    表名1
inner(可以省略) join表名2
on连接条件
SELECTt1.name,t1.gender,t1.salary,t1.join_date,t2.name
FROMemp t1
INNER JOIN -- 显示内连接dept t2
ONt1.dept_id = t2.id ;

– inner关键字可以省略

SELECTt1.*,t2.name
FROMemp t1
JOINdept t2
ONt1.dept_id = t2.id ;
SELECT * FROM dept ;
SELECT * FROM emp ;

– 多表查询之:外连接查询 – 左外/右外

INSERT INTO emp(NAME,gender,salary,join_date) VALUES('如来佛祖','男',10000,'2019-11-11') ;

– 需求:查询员工表和部门表的所有信息

– 使用隐式内连接

SELECT t1.*,t2.name
FROM emp t1,dept t2
WHERE t1.dept_id = t2.id ;
-- 部门编号和部门表id关联

– 内连接查询已经不满足要求!

左外连接:

将左表的数据全部查询并且还有查询交集部分(连接条件) (推荐方式)

select   字段列表
from左表(表名1)
left outer join右表(表名2)
on连接条件
SELECT t1.*,t2.nameFROMemp t1
LEFT OUTER JOIN -- outer 可以省略dept t2
ON t1.dept_id = t2.id ;
SELECT t1.*,t2.nameFROMemp t1
LEFT  JOINdept t2
ON t1.dept_id = t2.id ;
SELECT *  FROM emp ;

– 右外连接查询:

将右边全部显示以及多个表的交集部分数据(连接条件)

select   字段列表
from左表(表名1)
right outer join右表(表名2)
on连接条件
SELECT t1.name,t2.*
FROMdept t1
RIGHT OUTER JOINemp t2
ONt1.id = t2.dept_id ;

– 多表查询之:子查询: select 嵌套select语句

select   字段列表
from表名1
where  表达式(<,<=,>=,>,=) select 字段列表from  表名...

三种情况

单行单列
– 单行多列
– 多行多列

– 需求:查询员工工资最高的员工信息

SELECT * FROM emp ;

– 1)查询员工工资最高的是多少

SELECTMAX(salary)
FROM emp ;

– 2)查询员工工资是10000的这个信息

SELECT*
FROMemp
WHERE  salary = 10000 ;

– 简化:数学:a = 2 ; a+b = 2 + b —代入!

SELECT*
FROM emp
WHERE salary = (SELECTMAX(salary)FROM emp ) ;

– 需求:查询员工工资低于平均工资的员工信息
– 1)查询平均工资是多少

SELECT AVG(salary)  '平均薪资'
FROM emp ;

– 2)带条件查询工资低于6550的员工信息

SELECT t1.name,t1.gender,t1.salary,t1.join_date
FROMemp t1
WHERE salary <= 6550 ;

– 一步走

SELECT t1.*
FROM emp  t1
WHERE t1.salary <=(SELECT AVG(salary) FROM emp);

– 需求:查询员工在财务部或者市场部的员工信息
– 通过需求:查询哪张表 财务部/市场部 来自于部门表
– 查询员工信息----来自于员工表

UPDATE emp SET dept_id = 3 WHERE id = 6 ;
-- 1)查询财务部或者市场部的编号id是多少
SELECTid
FROMdept
WHERE NAME = '市场部'OR NAME = '财务部' ;
-- 结果;2 3 :市场部 财务部

– 2)查询在2和3号部门的员工信息是什么

SELECT*
FROMemp
WHERE dept_id = 2OR dept_id = 3 ;

– 将2)操作继续优化or ----使用in子句 in(集合数据) 举例 字段名称 in(2,3)

SELECT *
FROM emp
WHERE dept_id IN(2,3) ; -- 利用in(多个值) 实现多表查询:多行多列

– 一步走

SELECT*
FROM emp
WHERE
dept_id IN(SELECTid FROMdeptWHERE NAME = '市场部'OR NAME = '财务部'
) ;

– 子查询第三种情况

将一个表中查询结果当前一个虚表来进行二次查询!
– 查询员工表中入职日期大于’2011-11-11’的员工信息和部门信息

– 查询join_date > '2011-11-11’的员工信息

SELECT *
FROMemp
WHERE join_date > '2011-11-11' ;

– 将上面查询的结果当做虚表— 起一个别名 跟部门表在做一个联合查询

SELECT t1.name,-- 部门名称t2.name,-- 员工姓名t2.gender,-- 性别t2.salary,-- 工资t2.join_date -- 入职日期FROM dept t1 ,-- 部门表( SELECT *FROMempWHERE join_date >'2011-11-11') t2 -- t2虚表:二次查询---比较耗时WHERE t1.id = t2.dept_id ;  -- 内连接查询

– 优化

SELECT t1.name,t1.gender,t1.salary,t1.join_date,t2.name -- 部门名称
FROM emp t1,dept t2
WHERE t1.join_date >= '2011-11-11' AND t1.dept_id = t2.id ;
SELECT * FROM dept;
SELECT * FROM emp ;

– 事务:

将整个业务操作看成一个整体; 这些事务的执行要么同时成功,要么同时失败!
– start transaction ;开启事务
– rollback ; 回顾事务 – 回滚到操作语句之前
– commit; 提交数据

– 创建一个账户表

CREATE TABLE account(id INT PRIMARY KEY AUTO_INCREMENT, -- 账户编号NAME VARCHAR(5) ,balance INT ) ;
ALTER TABLE account MODIFY NAME VARCHAR(10) ;
INSERT INTO  account(NAME,balance) VALUES('zhangsan',1000),('lisi',1000) ;
UPDATE account SET NAME = 'zhangsan' WHERE id = 1;
SELECT * FROM account ;

– 查看当前提交方式:

SELECT @@autocommit ;-- 1)默认自动提交

– set @@autocommit = 0 ; 非自动提交
– 针对DML语句:增删改—数据自动提交的
– -如果开启事务:针对增删改;这些语句执行完毕之后必须 commit

– 开启事务

START TRANSACTION ;

– 张三给李四转账500

UPDATE account SET balance = balance - 500 WHERE id = 1 ;UPDATE account SET balance = balance + 500 WHERE id = 2 ;

– 回滚事务 :回滚到操作语句之前状态(两个账户都没有转钱)

ROLLBACK;
COMMIT ; -- 提交事务
SELECT * FROM account ;

– 事务的特点

ACID

– 原子性:事务不可分割的,要么sql同时执行成功,要么同时执行失败
– 一致性:事务的整个操作前后:开启事前和开启事务后,最终的总量保持不变!
– 隔离性:事务和事务之间是独立的,比如:修改账户/ 添加/删除,每一个具体业务都是独立的事务!
– 持久性:一旦事务执行成功,操作持久(永久存储的!)

– 事务的隔离级别:

针对数据库级别的安全性!
– select @@tx_isolation; 查看事务的隔离级别
SELECT @@tx_isolation; – mysql的隔离级别默认:第三种:repeatable-read:可重复读!
– 脏读:是最危险—一个事务读取到了另一个没有提交的事务!

– 四个隔离级别

– read uncommitted :读未提交 —安全性最差: 出现脏读,不可重复读 幻读问题
– read coommitted : 读已提交
– repeatable read: 可重复读
– serializable : 串行话----隔离级别最高
– 隔离级别越高,性能越低!
– set global transaction isolation level 隔离级别名称;

JavaWeb之数据库的操作(MySQL)相关推荐

  1. 数据库之操作MySQL

    数据库之操作MySQL 一.数据库 1.什么是数据库 数据库是数据管理的有效技术,是由一批数据构成的有序集合,这些数据被存放在结构化的数据表里.. 数据表之间相互关联,反映客观事物间的本质联系.. 数 ...

  2. python 测试mysql数据库_Python操作MySQL数据库----继续安装和测试

    接上篇,在上一篇中,我们安装好了python和sublime,下面我们需要安装MYSQL的相关软件. 1.安装MYSQL SERVER5.5.28,安装5.6版本的也可以,只是5.6版本安装完成之后没 ...

  3. python读取mysql数据库_Python操作MySQL数据库9个实用实例

    在Windows平台上安装mysql模块用于Python开发 用python连接mysql的时候,需要用的安装版本,源码版本容易有错误提示.下边是打包了32与64版本. MySQL-python-1. ...

  4. MFC对数据库的操作---MYSQL

    目录 在mysql数据库中创建所需要的表 创建数据库 创建表 配置项目环境 ​编辑在vs中配置包含目录.引用目录.库目录和附加依赖项 添加库文件 添加头文件 实现对数据库的操作 打开数据库 数据增删改 ...

  5. 数据库——python操作MySQL、修改表SQL语句、视图、触发器、存储过程、事务、流程控制、常见函数、索引

    文章目录 一.python操作MySQL 1.pymysql模块 1.基本使用 2.sql注入问题 3.二次确认 二.修改表SQL语句 1.修改表的名字 rename 2.添加字段 add 3.修改字 ...

  6. flask mysql orm_Flask笔记:数据库ORM操作MySQL+pymysql/mysql-python+SQLAlchemy/Flask-SQLAlchemy...

    Python中使用sqlalchemy插件可以实现ORM(Object Relationship Mapping,模型关系映射)框架,而Flask中的flask-sqlalchemy其实就是在sqla ...

  7. pymysql连接mysql数据库try_pymysql操作mysql数据库

    importpymysql#数据库操作#连接 defdb_conn(host,port,user,passwd,db_name):try: conn=pymysql.connect( host=hos ...

  8. nodejs框架 mysql数据库_nodejs操作mysql数据库

    2018-08-31 11:04:45 nodejs是一个运行在服务器端的JavaScript框架,既然是在服务器端运行,就少不了需要操作数据库.在nodejs中提供了一个基本的mysql模块,同时本 ...

  9. php操作mysql数据库,PHP操作mysql数据库

    1)连接mysql $con = mysql_connect("localhost","root","12345"); if(!$con){ ...

最新文章

  1. java XmlDocument
  2. How to deal with large number of threads in clients
  3. 量子计算机,开启中国速度
  4. MySQL5.7.12新密码登录方式及密码策略
  5. json规范及转义字符
  6. Codeforces Round #184 (Div. 2)
  7. FGSM攻击机器学习模型
  8. Win11无线鼠标没反应怎么办?无线鼠标不能用是什么原因?
  9. H5社交漂流瓶交友源码/附安装教程
  10. 锁屏显示Activity
  11. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)
  12. jsp:forward标签介绍
  13. Educational Codeforces Round 131 (Rated for Div. 2) A-D题解
  14. 数字集成电路设计系列学习总结
  15. knn K近邻算法python实现
  16. 专业导论-课后总结-2019.12.12-V1.0
  17. 谷粒学院项目对应知识点
  18. 去掉video 自带的下载
  19. win7中iis7.5中没有http绑定类型的解决方法
  20. 购物网站 前台后台 思维导图_【思维导图】前端开发JavaScript巩固你的JavaScript知识体系(网站同步更新)...

热门文章

  1. Linux仿真不checkquota命令,请教quotacheck命令找不到,怎么解决?
  2. 泛微8.0平台接口基础表
  3. 目标检测系列之 -- ACF算法
  4. 分布数据图-R/python
  5. 两个linux操作系统需要共享磁盘,vmware gsx server正确设置共享磁盘注意事项
  6. X96 Max Plus sd卡 刷Emuelec
  7. SQL 游标使用示例
  8. js样式创建可编辑表格
  9. 使用oracle发生标识符无效解决办法
  10. session的removeAttribute()和invalidate()的区别 1