课程来源:黑马程序员 MySQL数据库入门到精通
老师讲解很细致呀,本文只是对讲课笔记的整理,有问题欢迎大家指正!
引擎请下一篇:【黑马程序员数据库】数据库引擎
java 学习笔记指路
基础知识Python转java补充知识
Java中常见的名词解释前端
【黑马程序员pink老师前端】HTML
【黑马程序员pink老师前端】JavaScript基础大总结
【黑马程序员pink老师前端】JavaScript函数与作用域
【黑马程序员pink老师前端】JavaScript对象数据库
【黑马程序员数据库】数据库基础大总结
【黑马程序员数据库】数据库引擎
【黑马程序员数据库】数据库索引SQL编程
【牛客】SQL刷题篇入门篇
【牛客】SQL刷题篇进阶篇Java 框架
spring框架学习
Mybatis-plus 快速入门
Maven基础
Zookeeper初认识
HTTP简介
Tomcat
Servlet
vue入门
名称 | 全称 | 简称 |
---|---|---|
数据库 | 存储数据的仓库,数据是有组织的进行存储 | DataBase(DB) |
数据库管理系统 | 操纵和管理数据库的大型软件 | DataBase Management System(DBMS) |
SQL | 操纵关系型数据库的编程语言,定义了一套操纵关系型数据库统一标准 | Structured Query Language(SQL) |
常见的数据库:
官网下载,全点next就好
设置个简单一点的密码,比如:123456
注:这种方式需要配置PATH环境,IP和端口可以省略
win10配置PATH环境方法
控制面板->系统->左侧【高级系统设置】->环境变量->path
或此台电脑->右键【属性】->下滑倒数第二个【高级系统设置】->环境变量->path
Navicat
以直觉化的图形用户界面而建的,可以兼容多种数据库,支持多种操作系统。
SQLyog
是一个快速而简洁的图形化管理MySQL数据库的工具,它能够在任何地点有效地管理你的数据库,由业界著名的Webyog公司出品
MySQL Workbench
社区版完全免费,而商业版则是按年收费。支持数据库的创建、设计、迁移、备份、导出和导入等功能,并且支持 Windows、Linux 和 mac 等主流操作系统。
DataGrip
是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql、创建表、创建索引以及导出数据等
1.SQL语句可以单行或多行书写,以分号结尾。
2.SQL语句可以使用空格/缩进来增强语句的可读性。
3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
4.注释:
--注释内容或 # 注释内容(MySQL特有)
/*注释内容*/
DDL分类:
功能 | SQL语句 |
---|---|
常见数据库 | create database if not exists 库名 default charset=utf8mb4; 或 create database 库名; |
查看所有数据库 | show databases; |
选择要操作的数据库 | use 库名; |
删除数据库 | drop database if exists 库名; |
修改数据库编码 | alter database 库名 character set utf8; |
注意: |
create table [if not exists]表名(
字段名1 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名2 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名3 类型[(宽度)] [约束条件] [comment '字段说明']
)[表的一些设置];
功能 | 语法格式 |
---|---|
修改表添加列 | alter table 表名 add 列名 类型(长度) [约束]; |
修改列名和类型 | alter table 表名 change 旧列名 新列名 类型(长度) 约束; |
修改表删除列 | alter table 表名 drop 列名; |
修改表名 | rename table 表名 to 新表名; |
DML分类:
语法格式:
insert into 表 (列名1,列名2,列名3...) values (值1,值2,值3...);
// 不指定列,向表中插入所有列
insert into 表 values (值1,值2,值3...);
// 一次插入多行数据
insert into 表 (列名1,列名2,列名3...) values (值1,值2,值3...),(值1,值2,值3...),(值1,值2,值3...);
例子:
-- 指定列插入单行数据,数据类型、顺序、个数需匹配
insert into student(sid,name,gender,age,birth,address,score) values
(1001,'男',18,'1996-12-23','北京',83.5);
-- 不指定列插入单行数据
insert into student values(1001,'男',18,'1996-12-23','北京',83.5);
-- 插入多行数据
insert into student(sid,name,gender,age,birth,address,score) values(1002,'男',18,'1996-12-23','北京',83.5),(1003,'女',18,'1997-12-23','北京',53.5);
delete from 表名 [where 条件];
truncate table 表名;
truncate 表名;
注意:没有where 条件会删除整张表的数据。
update 表名 set 字段名=值,字段名=值...;
update 表名 set 字段名=值,字段名=值... where 条件;
-- 将所有学生的地址修改为重庆
update student set address = '重庆';
-- 讲id为1004的学生的地址修改为北京
update student set address = '北京' where id = 1004
-- 讲id为1005的学生的地址修改为北京,成绩修成绩修改为100
update student set address = '广州',score=100 where id = 1005
注意:没有where 条件,则修改整张表
约束实际上就是表中数据的限制条件
表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。
创建单列主键有两种方式,一种是在定义字段的同时指定主键,一种是定义完字段之后指定主键。
方法一:
-- 在 create table 语句中,通过 PRIMARY KEY 关键字来指定主键。
-- 在定义字段的同时指定主键,语法格式如下:
create table 表名(
...
<字段名> <数据类型> primary key
...
)
方法二:
-- 在定义字段之后再指定主键,语法格式如下:
create table 表名(
...
[constraint <约束名>] primary key [字段名]
);
所谓的联合主键,就是这个主键是由一张表中多个字段组成的。
注意:
create table 表名(
...
primary key(字段1,字段2,…,字段n)
);
主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。
create table 表名(
...
);
alter table <表名> add primary key(字段列表);
主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。
alter table <数据表名> drop primary key;
在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
通过给字段添加 auto_increment 属性来实现主键自增长
字段名 数据类型 auto_increment
如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。例如,如果表中插入的第一条记录的 id 值设置为 5,那么再插入记录时,id 值就会从 5 开始往上增加
1、方式1:创建表时指定
create table t_user2 (
id int primary key auto_increment,
name varchar(20)
)auto_increment=100;
2、方式2:创建表之后指定
create table t_user3 (
id int primary key auto_increment,
name varchar(20)
);
alter table t_user2 auto_increment=100;
delete数据之后自动增长从断点开始,会保留自增长从断点开始+1。
truncate数据之后自动增长从默认起始值1开始。
MySQL 非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
1.方式一:
<字段名><数据类型> not null;
2.方式二:
alter table 表名 modify 字段 类型 not null;
语法:alter table 表名 modify 字段 类型
唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。
1.方法一:
<字段名> <数据类型> unique
2.方法二:
alter table 表名 add constraint 约束名 unique(列);
语法:alter table <表名> drop index <唯一约束名/列名>;
MySQL 默认值约束用来指定某列的默认值。
1、方法一:
<字段名> <数据类型> default <默认值>;
2.方法二:
alter table 表名 modify 列名 类型 default 默认值;
语法:alter table <表名> modify column <字段名> <类型> default null;
1、插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
2、zerofill默认为int(10)
3、当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128+127,无符号为0256。
create table t_user12 (
id int zerofill , -- 零填充约束
name varchar(20)
);
alter table t_user12 modify id int;
select
[all|distinct]
<目标列的表达式1> [别名],
<目标列的表达式2> [别名]...
from <表名或视图名> [别名],<表名或视图名> [别名]...
[where<条件表达式>]
[group by <列名>
[having <条件表达式>]]
[order by <列名> [asc|desc]]
[limit <数字或者列表>];
关键词 distinct 去重,用于返回唯一不同的值。
select *| 列名 from 表 where 条件
**MySQL支持4种运算符:**算术运算符、比较运算符、逻辑运算符、位运算符
运算符优先级:
括号:();
乘、除、求模运算符:*、/、%;
加减运算符:+、- ;
比较运算符:=、>、<、>=、<=、<>、!=、!>、!<;
位运算符:^、&、|;
逻辑运算符:NOT;
逻辑运算符:AND;
逻辑运算符:OR。
运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ 或 DIV | 除,返回商 |
% 或 MOD | 取余 |
比较运算符是两个数据进行比较时所使用的运算符,比较运算后,会返回一个布尔值(true / false)作为比较运算的结果。
运算符名称 | 说明 |
---|---|
= | 等于 |
< | 小于号 |
> | 大于号 |
>= | 大于等于号(大于或者等于) |
<= | 小于等于号(小于或者等于) |
<=> | 安全的等于,两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 |
!= 或 <> | 不等号 |
IS NULL 或 ISNULL | 判断一个值是否为 NULL |
IS NOT NULL | 判断一个值是否不为 NULL |
LEAST | 当有两个或多个参数时,返回最小值 |
GREATEST | 当有两个或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
(NOT) IN | 判断一个值(不)是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
逻辑运算符 | 说明 |
---|---|
AND 或 && |
逻辑与 |
`OR 或 | |
NOT 或 ! |
逻辑非 |
XOR |
逻辑异或 |
位运算符 | 说明 |
---|---|
& |
按位与 |
` | ` |
~ |
按位取反,反转所有比特 |
^ |
按位异或 |
<< |
按位左移 |
>> |
按位右移 |
按字段的先后顺序来分主次,先排字段名1,再排字段名2。
select
字段名1,字段名2,……
from 表名
order by 字段名1 [asc|desc],字段名2[asc|desc]……
1.asc代表升序,desc代表降序,如果不写默认升序
2.order by用于子句中可以支持单个字段,多个字段,表达式,函数,别名
3.order by子句,放在查询语句的最后面。LIMIT子句除外
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
-- 1 查询商品的总条数
select count(*) from product;
-- 2 查询价格大于200商品的总条数
select count(*) from product where price > 200;
-- 3 查询分类为'c001'的所有商品的总和
select sum(price) from product where category_id = 'c001';
-- 4 查询商品的最大价格
select max(price) from product;
-- 5 查询商品的最小价格
select min(price) from product;
-- 6 查询分类为'c002'所有商品的平均价格
select avg(price) from product where category_id = 'c002';
聚合函数 | 作用 |
---|---|
count() | 统计指定列不为NULL的记录行数 |
sum() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0 |
max() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算 |
min() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算 |
avg() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0 |
函数 | 处理办法 |
---|---|
count( ) | 如果count函数的参数为星号(*),则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数 |
sum( ) 和 avg( ) 、max( ) 和 min( ) | 忽略null值 |
select 字段1,字段2… from 表名 group by 分组字段 having 分组条件;
-- 方式1-显示前n条
select 字段1,字段2... from 表明 limit n
-- 方式2-分页显示
select 字段1,字段2... from 表明 limit m,n
方法一:
insert into Table2(field1,field2,…) select value1,value2,… from Table1;
insert into Table2 select * from Table1;
要求目标表Table2必须存在
方法二:
SELECT vale1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。
正则表达式(regular expression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
MySQL通过REGEXP
关键字支持正则表达式进行字符串匹配。
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
. | 匹配除 “\n” 之外的任何单个字符 |
[…] | 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’ |
[^…] | 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’ |
`p1 | p2 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,} |
+ | 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,} |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次 |
一对一关系
一对一关系
多对多关系
语法:
在 create table 语句中,通过 foreign key 关键字来指定外键,具体的语法格式如下:
[constraint <外键名>] foreign key 字段名 [,字段名2,…] references <主表名> 主键列1 [,主键列2,…]
实现:为"emp"表中的"dept_id"字段创建为外键,并命名为"emp_fk",然后关联"dept"表中的"deptno"主键字段。
create database mydb3;
use mydb3;
-- 创建部门表(主表)
create table if not exists dept(
deptno varchar(20) primary key , -- 部门号
name varchar(20) -- 部门名字
);
-- 创建部门表(从表)
create table if not exists emp(
eid varchar(20) primary key , -- 员工编号
ename varchar(20), -- 员工名字
age int, -- 员工年龄
dept_id varchar(20), -- 员工所属部门
constraint emp_fk foreign key (dept_id) references dept (deptno) -- 外键约束
);
添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据
语法:
alter table <从表名> add constraint <外键名> foreign key (字段名) references <主表名> (主键列1);
实现:
-- 创建部门表(主表)
create table if not exists dept2(
deptno varchar(20) primary key , -- 部门号
name varchar(20) -- 部门名字
);
-- 创建部门表(从表)
create table if not exists emp2(
eid varchar(20) primary key , -- 员工编号
ename varchar(20), -- 员工名字
age int, -- 员工年龄
dept_id varchar(20) -- 员工所属部门
);
-- 创建外键约束
alter table emp2 add constraint dept_id_fk foreign key(dept_id) references dept2 (deptno);
数据插入
-- 1、添加主表数据
-- 注意必须先给主表添加数据
insert into dept values('1001','研发部');
insert into dept values('1002','销售部');
insert into dept values('1003','财务部');
insert into dept values('1004','人事部’);
-- 2、添加从表数据
-- 注意给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列
insert into emp values('1','乔峰',20, '1001');
insert into emp values('2','段誉',21, '1001');
insert into emp values('3','虚竹',23, '1001');
insert into emp values('4','阿紫',18, '1002');
insert into emp values('5','扫地僧',35, '1002');
insert into emp values('6','李秋水',33, '1003');
insert into emp values('7','鸠摩智',50, '1003');
insert into emp values('8','天山童姥',60, '1005'); -- 1005,主表不存在该列,不可以添加
删除数据
-- 3、删除数据
/*
注意:
1:主表的数据被从表依赖时,不能删除,否则可以删除
2: 从表的数据可以随便删除
*/
delete from dept where deptno = '1001'; -- 从表中有引用,不可以删除
delete from dept where deptno = '1004'; -- 从表中没有引用,可以删除
delete from emp where eid = '7'; -- 可以删除
当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系
语法:
alter table <从表名> drop foreign key <外键约束名>;
实现:
alter table emp drop foreign key emp_fk;
在多对多关系中,A表的一行对应B的多行,B表的一行对应A表的多行,我们要新增加一个中间表,来建立多对多关系。
实现:
-- 学生表和课程表(多对多)
-- 1 创建学生表student(左侧主表)
create table if not exists student(
sid int primary key auto_increment,
name varchar(20),
age int,
gender varchar(20)
);
-- 2 创建课程表course(右侧主表)
create table course(
cid int primary key auto_increment,
cidname varchar(20)
);
-- 3创建中间表student_course/score(从表)
create table score(
sid int,
cid int,
score double
);
-- 4建立外键约束(2次)
alter table score add foreign key(sid) references student(sid);
alter table score add foreign key(cid) references course(cid);
-- 5给学生表添加数据
insert into student values(1,'小龙女',18,'女'),(2,'阿紫',19,'女'),(3,'周芷若',20,'男');
-- 6给课程表添加数据
insert into course values(1,'语文'),(2,'数学'),(3,'英语');
-- 7给中间表添加数据
insert into score values(1,1,75),(1,2,83),(2,1,67),(2,3,80),(3,2,90),(3,3,88);
-- 注意:在删除表时,需要先删除从表再删除主表。因为先删除主表会导致从表引用错误。中间表是从表,可以随便删除。
多表查询就是同时查询两个或两个以上的表,显示来自多张表的数据。
分类:
join实现的功能:通过两张表关联的列(比如商品id),将两张表的列进行合并。
交叉连接查询返回被连接的两个表所有数据行的笛卡尔积。笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配,假如A表有m行数据,B表有n行数据,则返回 m*n 行数据。笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选。
语法:
select * from 表1,表2,表3….;
隐式内连接(SQL92标准):select * from A,B where 条件;
显示内连接(SQL99标准):select * from A inner join B on 条件;
inner可以省略
常用实现:
from ods_itcast_order_goods a join ods_itcast_goods b on a.goodsId = b.goodsId
给 ods_itcast_order_goods 表起名为a,ods_itcast_goods 表起名为b,使用 goodsId 这一列进行关联。后面可以直接用b.goodsName调用 ods_itcast_goods 表中数据。
名称 | 语法 | 关系 |
---|---|---|
左外连接 | select * from A left outer join B on 条件; |
|
右外连接 | select * from A right outer join B on 条件; |
|
满外连接 | select * from A full outer join B on 条件; |
3.3.6.1 概述
3.3.6.2 子查询关键字(all)
3.3.6.3 子查询关键字(any和some)
3.3.6.4 子查询关键字(in)
3.3.6.5 子查询关键字(exists)
MySQL有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。注意自关联时表必须给表起别名。
语法:
select 字段列表 from 表1 a , 表1 b where 条件;
select 字段列表 from 表1 a [left] join 表1 b on 条件;