数据库

  1. 为什么要用数据库
    如何去存放数据?生活中有各种各样的数据。比如说人的姓名、年龄、成绩等。平时我们记录这些信息都是记在大脑中。人的记忆力有限,不可能什么都记住。所以后来人们把数据记录在石头上–>书本上。(不安全)

    SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  2. 数据完整性
    为了数据能够完整的保存下去。人们发明了数据库。
    如果数据缺少完整性,记录时会提示错误信息。

  3. 数据库的种类
    两大类:关系型数据库、非关系型数据库。

    关系型数据库

    关系表。比如说日常所见的成绩表excel文档.
    【学习笔记Part 2● MySQL】 Mysql 第1张
    关系表示一个二维表格。
    每一行代表每一条信息。
    每一列代表相同类型的信息。
    常见的关系型数据库:
    Mysql 所属Oracle公司的
    sqlserver
    Oracle
    SQLlite
    MySQL:小。轻便。易学。标准化sql语言。安装便捷。

    非关系型数据库

    键值对(key-value)。
    常见非关系型数据库:Redis
    目前华为云、网易云、阿里云均支持Redis。

为什么要配置环境变量?

作用:保证可执行程序在当前系统的任意位置都可以运行。
Windows系统配置环境变量都在path下。

MySQL简单使用

数据库:database
查看当前mysql下有什么数据库。

show databases;

【学习笔记Part 2● MySQL】 Mysql 第2张

解释:sql语句以分号结束。
也就是说每写一条SQL语句,都必须要加 ; 符号。

如何进入到数据库中:use命令

use 数据库名称

【学习笔记Part 2● MySQL】 Mysql 第3张

当看到 Database changed说明已经进入到数据库information_schema中。此时可以查看当前数据库下有什么表。

表格:table
查看数据库当中的表格:

show tables;

【学习笔记Part 2● MySQL】 Mysql 第4张

此时可以看到当前数据库下所有的表。
查看表格内容:(表结构)

desc CHARACTER_SETS;

【学习笔记Part 2● MySQL】 Mysql 第5张
左下角显示4 rows 表示有四条记录。
此时第一行看到的是表中列的名称。第二行是类型。第三行表示是否为空。

查看表格具体内容:
首先选择查询哪张表、显示哪些列以及根据什么去查询。

select * from 表名;

【学习笔记Part 2● MySQL】 Mysql 第6张

此时查询到的是当前表中所有的内容。

创建第一个数据库:

创建时需要输入 create database 数据库名称; 否则报错!
出现Query OK..表示创建数据库成功!

create database mydb;

【学习笔记Part 2● MySQL】 Mysql 第7张

删除数据库:

drop database 要删除的数据库名称;

【学习笔记Part 2● MySQL】 Mysql 第8张

合并:创建数据库的同时,检查要创建的数据库是否存在,如果存在,删除!

drop database if exists mydb;
create database mydb;

【学习笔记Part 2● MySQL】 Mysql 第9张

如果之前没有创建该数据库,那么会报警告。不会报错。
如果已经创建该数据库,那么直接删除。
同理对表格一样适用。

表格的创建:

drop table if exists t1;
create table t1;

【学习笔记Part 2● MySQL】 Mysql 第10张

刚进入数据库就开始创建表格,然后报错提示说没有选择数据库。
因此创建表格的前提:先进入到一个数据库中。

use mydb;
drop table if exists t1;
create table t1;

【学习笔记Part 2● MySQL】 Mysql 第11张
创建表格时,至少要有一列。

create table 表格名称(列名 列类型);

【学习笔记Part 2● MySQL】 Mysql 第12张
此时查看创建的表:

select * from t1;

【学习笔记Part 2● MySQL】 Mysql 第13张
由于没有添加任何数据,它是一张空表。

详细查看创建表时的信息:

show create table 表名

【学习笔记Part 2● MySQL】 Mysql 第14张
后面的信息为数据库自动补全的。

数据库退出:

输入exit
【学习笔记Part 2● MySQL】 Mysql 第15张
其他两种退出方式:
\q;
【学习笔记Part 2● MySQL】 Mysql 第16张
quit;
【学习笔记Part 2● MySQL】 Mysql 第17张

数据库中存储数据的类型

常用三大类:数值 字符 时间
数值:
【学习笔记Part 2● MySQL】 Mysql 第18张
字符:
【学习笔记Part 2● MySQL】 Mysql 第19张
日期:
【学习笔记Part 2● MySQL】 Mysql 第20张

创建完整的表格:

在使用Mysql时,最好自备一个脚本文件。每次使用时,直接从脚本文件中copy出来。修改相应的库名和表名、字段名即可。

/*创建数据库*/
drop database if exists mydb;
create database mydb;
/*进入已经创建的数据库中*/
use mydb;
/*创建数据库表*/
drop table if exists t1;
create table t1( id int, stunumber int, name varchar(20), score int );

语法:

/*SQL语法
创建数据库
drop database if exists 数据库名称;
create database 数据库名称;
创建数据库表
drop table if exists 数据库名称;
create table  表格名称(
    列名1   列类型1,
    列名2    列类型2,
    .....
)
*/

插入数据(新增数据):

语法1:

insert into 表名 values(列1新值,列2新值....);

【学习笔记Part 2● MySQL】 Mysql 第21张
插入数据报错,无法插入中文字符。
编码格式(utf-8)(解决方式在下面课堂练习)

修改第三个列值为英文字符,可以插入:(插入时,value值误设成了跟列一样的字符)
【学习笔记Part 2● MySQL】 Mysql 第22张
修改姓名长度,发现以下错误类型:/(不是超出了规定的限制长度)/
而是需要对插入的字符添加引号(可以是单引号,还可以是双引号)
【学习笔记Part 2● MySQL】 Mysql 第23张
一直以下语句:(插入时,value值误设成了跟列一样的字符)
【学习笔记Part 2● MySQL】 Mysql 第24张
当插入完毕,检查表格,发现name未被录入:(都为null)(原因:插入时插入的数据和列名称一致,导致其他数据正常入库,只有name列为null)
【学习笔记Part 2● MySQL】 Mysql 第25张
该插入方法存在的问题:以上标注出来

语法2:

insert into t1(id,stunumber,name,score) values (列1新值,列2新值....);

插入时,插入的列的新值必须要跟前面列的类型一致,否则会报错!

查看插入的数据:
【学习笔记Part 2● MySQL】 Mysql 第26张
此时插入的数据已经全部入库。

小结:采用插入语句时,使用语法2进入数据插入(数据预置)。

课堂练习:

录入数据:
【学习笔记Part 2● MySQL】 Mysql 第27张
创建表格创建语句小括号内最后一列的列类型后面没有逗号名,否则会报错!

创建成功之后,查看表相信信息:包括创建表的语句名,以及数据引擎,编码格式。

show create table shopping;

【学习笔记Part 2● MySQL】 Mysql 第28张
默认编码格式问题:
Linux:Ubuntu默认编码格式为UTF8(utf-8)
Windows 默认编码格式为GBK(gb2312)

解决无法插入中文字符或者插入时中文字符在数据库表中显示乱码:
更改数据库表的编码格式:

alter table 表名 convert to charset ‘编码格式’;

【学习笔记Part 2● MySQL】 Mysql 第29张
修改完毕之后可以进行数据插入:
【学习笔记Part 2● MySQL】 Mysql 第30张
插入时,对于varchar类型的列,中文字符可以使用单引号或者双引号包裹起来。

所有数据预置完成:

【学习笔记Part 2● MySQL】 Mysql 第31张
发现三个问题:
1. id有重复的项 (主键 唯一性)
2. 少了一列总价 (添加)
3. 行有重复的 (重复的删除)

删除数据库表中的数据:

delete from 表名;(数据清空,禁用!)

【学习笔记Part 2● MySQL】 Mysql 第32张
正常删除:根据表中某一列的具体值来删除的

delete from 表名 where 列名 = 值;

【学习笔记Part 2● MySQL】 Mysql 第33张
1.如果删除的列的值不在数据库表中:
【学习笔记Part 2● MySQL】 Mysql 第34张
那么此时SQL执行成功,但是对表没有任何影响。

2.如果删除的列的名称不在数据库表中,那么会报错:
【学习笔记Part 2● MySQL】 Mysql 第35张
查询时,依然可以根据某一列的列名称=值来查询
【学习笔记Part 2● MySQL】 Mysql 第36张

添加列

语法:

alter table 表名 add 新列名 新类型;

【学习笔记Part 2● MySQL】 Mysql 第37张
新增列之后,默认给新增的列补null值。

发现的新问题:
1. 如何更新总价?
2. 假如列名称打错了或者列类型打错了,但是执行成功了,如何修改?
比如说修改pricesum为price_sum:

1.修改列的类型:

语法: alter table 表名 modiy 列名 新类型;

【学习笔记Part 2● MySQL】 Mysql 第38张
2.修改列的名称(这里也可以修改类型):

语法:alter table 表名 change 旧列名 新列名 新类型;(更改列名和类型) 语法:alter table 表名 change 旧列名 新列名 旧类型;(更改列名) 

【学习笔记Part 2● MySQL】 Mysql 第39张
录入总价:
不能再使用insert语句,因为insert语句只会新增行。不会修改原有行的数据。

修改行

语法:update 表名 set 列名=新值 where 列名=值(列名与值要存在)

1.更新表格中值不存在的情况:
【学习笔记Part 2● MySQL】 Mysql 第40张
2.更新表格中列不存在的情况(参考删除的情况)
3.正确更新表格中的值:
【学习笔记Part 2● MySQL】 Mysql 第41张
4.一次更新一行中的多个单元格中的值

语法:update 表名 set 列名1=新值,列名2=新值...  where  列名=值;

【学习笔记Part 2● MySQL】 Mysql 第42张
5 . 一次更新所有行中,某一列或多个列的值。

语法:update 表名 set 列名1=新值,列名2=新值...

【学习笔记Part 2● MySQL】 Mysql 第43张

删除列

创建表格时,列写多了。需要删除:drop

语法:alter table 表名 drop 列名;

【学习笔记Part 2● MySQL】 Mysql 第44张
查询结果只显示某一列内容或者特定列内容:
语法:

selet 列名1,列名2...  from  表名 ;

【学习笔记Part 2● MySQL】 Mysql 第45张
使用show create table 表名时。查看到有:
【学习笔记Part 2● MySQL】 Mysql 第46张
charset表示的是当前数据库表的字符编码集。
default表示的是单元格内容可为空。
engine表示的是表格的引擎。

Mysql常见的两种引擎类型

引擎表现方式:engine
两种:InnoDB(支持事务) MyISMA(不支持)

事务

在处理数据时,每条SQL语句执行完毕之后,下面显示的
【学习笔记Part 2● MySQL】 Mysql 第47张
表示处理了几行数据。
处理数据的过程中,如果出现错误。比如说预置100条数据。但是前20条数据执行成功了,第21条数据执行失败。问:结果是通过还是没通过?
更改?重新提交?
1. 事务开启 2.事务回滚
在引擎类型是InnoDB时,如何查看是否开启事务?
select @@autocommit;(为1表示自动提交。0表示事务开启)
设置事务开启或者关闭:是针对当前数据库下所有的表。(前提引擎类型要是InnoDB)
【学习笔记Part 2● MySQL】 Mysql 第48张
开启事务的目的:方便数据库表的维护。可以使用一键回滚,较少不必要的操作。公司项目中数据库事务全是开启状态。
一般对于数据库进行操作时,SQL标准脚本:
先删,后改,再提交。

/*标准SQL执行脚本 先删,后改,最后提交*/
delete from shopping where id=20180704;

insert into shopping(id,shoppingtype,name,price,numer) values(20180704,'生活用品','牙刷',2.5,1);

commit;

开启事务:
set @@autocommit=0;
【学习笔记Part 2● MySQL】 Mysql 第49张
插入数据:
【学习笔记Part 2● MySQL】 Mysql 第50张
查询表格:
【学习笔记Part 2● MySQL】 Mysql 第51张
事务回滚:
rollback;

【学习笔记Part 2● MySQL】 Mysql 第52张
事务回滚完毕之后,发现之前插入的数据都没有了。
保证数据库表的安全性。(便于维护)
如果没有进行事务回滚,而是进行事务提交。
【学习笔记Part 2● MySQL】 Mysql 第53张
此时数据入表成功,如果再使用rollback进行事务回滚,发现没有任何改变。
【学习笔记Part 2● MySQL】 Mysql 第54张
关闭事务,变更为自动提交:
set @@autocommit=1;
【学习笔记Part 2● MySQL】 Mysql 第55张
小结:数据库在创建时,事务默认是没有开启的。需要手动开启。(开启方式,可以通过上面设置。可以通过代码来设置。)

关于表格的创建:

为了后期出现无法开启事务以及录入数据乱码问题,可以采用如下创建表格的方式来创建表格

/*创建表格模板*/
create table 表格名称
(
 列名1 列类型,
 列名2 列类型,
 ...
)engine=InnoDB default charset=utf8;

【学习笔记Part 2● MySQL】 Mysql 第56张

关于单元格不为null值

列类型后添加not null
【学习笔记Part 2● MySQL】 Mysql 第57张
插入数据时:
id必须要填写。否则会报错:
【学习笔记Part 2● MySQL】 Mysql 第58张
如果没有设置某一列的单元格为null,那么插入数据时,可以不全部更新。
【学习笔记Part 2● MySQL】 Mysql 第59张
根据插入语法2:
【学习笔记Part 2● MySQL】 Mysql 第60张
列名称可以不写全(可以不是表格中所有的列),但是后面的值要和前面的列一一对应(包括个数、类型)。

注意:

  1. 中英文符号的问题。
  2. 自己写SQL脚本时,最好现在文本中写出(备份)。新建空白文档,ctrl+s保存可以以修改后缀名为.sql的文件。此时关键字是有颜色的(方便单词拼写检查)。
  3. 创建表格的时候不要使用中文(表名不要是中文,列名不要是中文)
  4. 列中的值可以是中文。(支持字符串,中文也是字符串)
  5. 查询事务时,不要使用select @@commit=1或者select @@commit=0去查询,因为给列名指定了具体的值,查询出来的就是0或者1.而不是你当前事务表中的值。正确的查询方式:select @@autocommit;设置事务开启与关闭
    set @@autocommit=0或者1;

约束

5种约束:
1. 非空约束 not null
2. 唯一约束 unique
3. 主键约束 primary key
4. 外键约束 foreign key
5. 检查约束 check
作用:确保数据的完整性。

非空约束 not null

表示单元格不能为null值。
实现方式:
1. 在表格创建时,设置某列不能为null
【学习笔记Part 2● MySQL】 Mysql 第61张
新值数据检查非空约束:(新值一个正确的数据)
【学习笔记Part 2● MySQL】 Mysql 第62张
新增一个id为空的数据:(报错)(id非空)
【学习笔记Part 2● MySQL】 Mysql 第63张
设置年龄为Null值:
【学习笔记Part 2● MySQL】 Mysql 第64张
2. 建表时未添加非空约束,建表后添加方式:
alter table 表名 add 列名 列类型 not null;
【学习笔记Part 2● MySQL】 Mysql 第65张
desc 表名查看表时,null列值为no时,表示该列不能为空!
【学习笔记Part 2● MySQL】 Mysql 第66张
不能为空不代表不能够重复。

唯一约束

确保数据的唯一性。(可以为空,但是不会重复)
唯一约束:unique
1.创建表格的时候,在列后添加关键字 unique
【学习笔记Part 2● MySQL】 Mysql 第67张
上图情况说明:当表中的列唯一且非空,那么会默认变成主键。

在创建表格的时候对列只添加关键字unique,不添加not null。
【学习笔记Part 2● MySQL】 Mysql 第68张
检查唯一性:
首先正确新值一条数据。
【学习笔记Part 2● MySQL】 Mysql 第69张
然后不做任何变化,继续新值数据。发现报错:stu_no列中已有该值。确保了数据的唯一性。(不能重复)
【学习笔记Part 2● MySQL】 Mysql 第70张
但是可以为null值:
【学习笔记Part 2● MySQL】 Mysql 第71张

主键约束

一般对数据库表进行操作时,都是以主键的列名来操作的。
例如:删除数据 where 主键名=值;
1. 创建表格的时候添加主键约束
【学习笔记Part 2● MySQL】 Mysql 第72张
上表中,主键为id。stu_no唯一。因此在插入数据时,这两个值必须要有。否则会报错!报错优先级:如果说主键和具有唯一行的列都重复了,那么会抛出主键重复的错误!
【学习笔记Part 2● MySQL】 Mysql 第73张
创建表格时,对于主键的列,可以删除not null 关键字。但是最好保留
创建完成,使用desc 表名查看表结构。发现主键的列依然是非空。
【学习笔记Part 2● MySQL】 Mysql 第74张
desc 表名;
【学习笔记Part 2● MySQL】 Mysql 第75张
思考:主键既唯一又非空。那么我们可以设置一系列数字(使该列数字自增长)
目的:方便操作。对表格进行新增操作时,不用再添加主键值了。

auto_increment 自增长
创建表格时,。对主键的列添加关键字即可。在主键前加
【学习笔记Part 2● MySQL】 Mysql 第76张
创建完成,查看表格信息:
【学习笔记Part 2● MySQL】 Mysql 第77张
新增数据检查自增长:
【学习笔记Part 2● MySQL】 Mysql 第78张
新增数据时,无论是否添加成功。主键都会自增长1.而且主键是从1开始的。如果说通过jdbc链接数据库表进行操作时,操作完成发现表中主键不是连续的。说明自主插入数据时,有一些步骤报错了。(正常现象)

如果新增数据时,自主添加主键。那么接下来主键以当前自主添加的主键值为基数,自增长1.
【学习笔记Part 2● MySQL】 Mysql 第79张

发现的问题1:(唯一性BUG)

首先创建表格:(id唯一,stuage可以为空)
【学习笔记Part 2● MySQL】 Mysql 第80张
新值数据时,只新增stuage。发现不会报错,而且id一直是null.
【学习笔记Part 2● MySQL】 Mysql 第81张
删除时。根据id等于null或者0来删除。发现没有任何作用。
【学习笔记Part 2● MySQL】 Mysql 第82张
此时给id添加not null。解决问题。
【学习笔记Part 2● MySQL】 Mysql 第83张
以上问题在mysql5.7版本中依然存在。

发现问题2:(非空默认值)

创建表格时,id字段设置为非空。设置非空,年龄设置可以为空。
【学习笔记Part 2● MySQL】 Mysql 第84张
正常新增数据时,可以添加。
当新增数据时,没有添加id列,发现id默认补0.
【学习笔记Part 2● MySQL】 Mysql 第85张

根据id,可以删除:
【学习笔记Part 2● MySQL】 Mysql 第86张
给id添加唯一,发现无法添加唯一约束。
原因:表中id列存在相同的值,无法添加主键。
【学习笔记Part 2● MySQL】 Mysql 第87张
如果表中有数据,并且同一列有重复的数据,无法把该列作为表的主键。

删除同一列中相同的数据,发现可以改为主键:
【学习笔记Part 2● MySQL】 Mysql 第88张
新增数据时,发现数据库表中有不符合日常认知的数据。(需要自己手动去检查,修改)
可以使用update语句去修改这些数据。
【学习笔记Part 2● MySQL】 Mysql 第89张

检查约束

系统会自动检索数据是否满足要求。关键字:check
比如上表中,所有数据都满足数据库表对数据的要求。但是。有些列的值不符合实际要求。需要在添加数据时,给其规定需要满足什么条件的数据才能入库。
给性别添加检查约束:

alter table stu_information add constraint check(stu_age between 1 and 120);

【学习笔记Part 2● MySQL】 Mysql 第90张
添加约束之后。新增数据。发现数据依然入库。Mysql5.7版本暂时不支持check。
alter table 表名 add constraint check(列名=’值’ or 列名=’值’);

between 表示 :数据范围在…和…之间 适用and相连
or 表示 :或者

外键约束

【学习笔记Part 2● MySQL】 Mysql 第91张
对于学生信息表和住宿信息表而言。先有学生信息表,这里统计了所有学生的信息。
然后再有住宿信息表,有选择的入住宿舍。
建立主外键关系:
外键:foreign key
至少两张表:
alter table 外键表 add constraint foreign key(外键表中的某列) references 主键表(主键表中选取一列作为外键表的主键);
前提(最好保证主键表中没有数据)
备注:因为stu_information中stu_no是主键。所以上面语句中。写的是主键。
在设置主外键时,不一定要以主键来设置。
外键也不一定是主键。
【学习笔记Part 2● MySQL】 Mysql 第92张
添加完成之后,通过

show create table stu_information

查看到详细建表语句
【学习笔记Part 2● MySQL】 Mysql 第93张
新增数据:
首先新增外键表数据(发现报错!)

【学习笔记Part 2● MySQL】 Mysql 第94张
报错原因:是因为主键表中的stu_no没有该数据(不存在)。

因此,正确添加数据顺序,先添加主键表中的数据。然后再添加外键表。(加:先主后外)
即使外键表中有数据,但是往外键表中添加数据时,一定要和主键表中的键相对应起来。

删除数据时:
先删除主键表数据会报错!
正确删除顺序:先删除外键表数据,再删除主键表数据(加:外主后主)

修改时:
由于对于学号的设置。主键stu_no是主键表的主键。唯一,而且不为空。
外键表stu_no唯一,而且不为空。
所以无法更新任何一张表的主外键,但是可以修改其他数据。

如果不唯一时?能够更新主外键表中的主外键数据?

学生信息表与住宿信息表案例

【学习笔记Part 2● MySQL】 Mysql 第95张
创建数据库表顺序:

/*入学开始*/
/*学生信息表*/
create table t1( id int not null auto_increment primary key, num int unique, name varchar(20) )engine=InnoDB default charset=utf8;
/*住宿信息表*/
create table t2( id int not null auto_increment primary key, num int unique, name varchar(20), stu_num int )engine=InnoDB default charset=utf8;

建立主外键关系:

/*建立起主外键关系*/
alter table t2 add constraint foreign key(num) references t1(num);

学生证办理以及安排宿舍:

/*录入学生信息(下发学生证)*/
insert into t1(num,name) values(1,'ceshi1');
insert into t1(num,name) values(2,'ceshi2');
insert into t1(num,name) values(3,'ceshi3');
insert into t1(num,name) values(4,'ceshi4');

/*录入住宿信息(安排宿舍)*/
insert into t2(num,name,stu_num) values(1,'ceshi1',101);
insert into t2(num,name,stu_num) values(2,'ceshi2',101);
insert into t2(num,name,stu_num) values(3,'ceshi3',101);
insert into t2(num,name,stu_num) values(4,'ceshi4',101);

毕业后,学生信息清除顺序:

/*四年过去,毕业了*/
/*先搬出宿舍*/
delete from t2 where num=1;
delete from t2 where num=2;
delete from t2 where num=3;
delete from t2 where num=4;

/*注销学生证信息*/
delete from t1 where num=1;
delete from t1 where num=2;
delete from t1 where num=3;
delete from t1 where num=4;

删除约束

新建用户表sys_user与用户密码表sys_user_pwd。

/*用户表*/
create table sys_user( id int auto_increment primary key, user_id int unique, user_name varchar(20) )engine=InnoDB default charset utf8;

/*用户密码表*/
create table sys_user_pwd( id int auto_increment primary key, user_id int unique, user_name varchar(20), user_passwd varchar(40) )engine=InnoDB default charset utf8;

设置主外键关系:

/*建立起主外键关系*/
alter table sys_user_pwd add constraint user_id_fk foreign key(user_id) references sys_user(user_id);

新增一条用户数据:

insert into sys_user(user_id,user_name) values(10120123,'root');
insert into sys_user_pwd(user_id,user_name,user_passwd) values(10120123,'root','root');

insert into sys_user(user_id,user_name) values(10120124,'root1');
insert into sys_user_pwd(user_id,user_name,user_passwd) values(10120124,'root1','root');

当两张表使用完毕,现在要清理一些约束关系。

1. 删除主键约束

删除时,发现主键id是自增长,无法删除。
【学习笔记Part 2● MySQL】 Mysql 第96张

2. 删除自增长

首先要去除自增长:

alter table 表名 modify 自增长列名 旧类型;

【学习笔记Part 2● MySQL】 Mysql 第97张
此时可以删除主键:alter table 表名 drop primary key;
【学习笔记Part 2● MySQL】 Mysql 第98张

3. 删除非空约束

此时id依然存在非空约束,现在去除非空约束:

alter tale 表名 modify 非空约束的列 旧类型

【学习笔记Part 2● MySQL】 Mysql 第99张
【学习笔记Part 2● MySQL】 Mysql 第100张
modify可以去除自增长,还可以去除非空约束,还可以修改列类型。
如果以上三种同时存在,执行第一次时,去除自增长,执行第二次时,去除非空约束,接下来可以修改列类型。

4. 删除唯一约束

删除唯一约束:

alter table 表名 drop index 具有唯一性的列

【学习笔记Part 2● MySQL】 Mysql 第101张
删除报错:原因需要使用外键别名。
假如说不知道外键别名或者说在设置主外键关系时,没有设置外键别名,那么可以通过show create table 表名 来查看,一般以fk结尾。

使用别名删除时,发现当前user_id作为外键表的主键,在外键表中有相对应的值。但是sys_user表不是外键表,sys_user_pwd才是外键表。
【学习笔记Part 2● MySQL】 Mysql 第102张

5. 删除外键约束

根据外键名称删除约束:

alter table 外键表表名 drop foreign key 外键名;

【学习笔记Part 2● MySQL】 Mysql 第103张
删除主外键关系和表中是否有数据,没有关系。
【学习笔记Part 2● MySQL】 Mysql 第104张

数据查询

简单查询(单一的表)

直接查看数据库所有数据:

select * from 表名;

【学习笔记Part 2● MySQL】 Mysql 第105张
根据列名查看数据库满足当前列的值的所有的数据:

select * from 表名  where 列名=值;

【学习笔记Part 2● MySQL】 Mysql 第106张
可以查看自己规定显示的列:

select  列名 from 表名 where 列名=值

【学习笔记Part 2● MySQL】 Mysql 第107张

多表查询(两张或两张以上的表)

关键字:= (只表示查询一个)

select * from 表名1 where 列名1=(select 列名2 from  表名2 where 列名3=值)

【学习笔记Part 2● MySQL】 Mysql 第108张
以上SQL前提,表中字段值和其他表中的字段值一样。可以N个表连一起查询。
关键字in :(查询满足条件所有的数据)(sys_user表中的user_id都会被拿出来和sys_user_pwd表中的user_id相比较,把值相同的行显示出来。)
【学习笔记Part 2● MySQL】 Mysql 第109张
关键字:not (表示不的意思)(查询表中数据不在另外一个表中存在)
【学习笔记Part 2● MySQL】 Mysql 第110张
关键字:order by(排序)
【学习笔记Part 2● MySQL】 Mysql 第111张
一般order by 和时间列相结合使用,可以帮助我们迅速找到最新的一条数据。
比如:

select * from 表名 ..../*中间的查询条件*/... order by 时间列 desc;

同时显示两张表内容:
(select 表1别名.,表2别名. from 表1 表1别名,表2 表2别名 where 表1别名.表1列名=表2列名)
【学习笔记Part 2● MySQL】 Mysql 第112张

给表起别名

select * from 表 别名  查询条件

【学习笔记Part 2● MySQL】 Mysql 第113张
当SQL语句中出现两张表时,给两张表起别名。不要取一样的别名,尽量区分。
【学习笔记Part 2● MySQL】 Mysql 第114张
同时显示两张表的内容:
【学习笔记Part 2● MySQL】 Mysql 第115张
查看到表中有重复的列。可以自由控制显示列的数量与顺序。(相当于内连接)
【学习笔记Part 2● MySQL】 Mysql 第116张

查询数据库表连接方式

左连接:查询结果以左边为准

右边没有的会自动补null

select t.user_id,t1.user_id from sys_user t letf join sys_user_passwd t1 on t.user_id=t1.user_id (在Orcale数据库使用过程中带别名查询)

【学习笔记Part 2● MySQL】 Mysql 第117张
不带别名查询时:(一般在mysql使用过程中不带别名)
【学习笔记Part 2● MySQL】 Mysql 第118张

右连接:查询结果以右边为准

左边表没有的值补null
把上述SQL语句中的表顺序置换一下:(单词由left改为right)
【学习笔记Part 2● MySQL】 Mysql 第119张

内连接:相当于in

in或者not in 都是子查询的一种。
子查询:以一张表以基础,去查询另外一张表
内连接相当于子查询中的In。

/*左连接*/
select t.*,t1.* from sys_user t left join sys_user_pwd t1 on t.user_id=t1.user_id;
/*右连接*/
select t.*,t1.* from sys_user_pwd t right join sys_user t1 on t.user_id=t1.user_id;
/*内连接*/
select t.*,t1.* from sys_user_pwd t inner join sys_user t1 on t.user_id=t1.user_id;
select t.*,t1.* from sys_user t inner join sys_user_pwd t1 on t.user_id=t1.user_id;

两种内连接显示结果:
【学习笔记Part 2● MySQL】 Mysql 第120张

模糊查询

模糊查询:根据一个字或者首字母或者以什么结尾来查询。
比如:百度、有道词典
关键字:like
原有数据库表:
【学习笔记Part 2● MySQL】 Mysql 第121张
1. 查询以root开头的用户

/*模糊查询1:查询以root开头的用户*/
select * from sys_user where user_name like 'root%';

【学习笔记Part 2● MySQL】 Mysql 第122张
2. 查询以字母t结尾的用户
3.

/*模糊查询2:查询以字母t结尾的用户*/
select * from sys_user where user_name like '%t';

【学习笔记Part 2● MySQL】 Mysql 第123张
3. 查询用户名中包含连续字母oo的用户

/*模糊查询3:查询用户名中包含连续字母oo的用户*/
select * from sys_user where user_name like '%oo%';

【学习笔记Part 2● MySQL】 Mysql 第124张
4. 查询用户中包含两个字母o的用户

/*模糊查询4:查询用户名中包含两个字o的用户*/
select * from sys_user where user_name like '%o%o%';

【学习笔记Part 2● MySQL】 Mysql 第125张

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄