1. 主键
表中的任何列都可以作为主键,只要它满足以下条件:
- 任意两行都不具有相同的主键值;
- 每个行都必须具有一个主键值(主键列不允许NULL值)。
主键值规则 这里列出的规则是MySQL本身强制实施的。
主键通常定义在表的一列上,但这并不是必需的,也可以一起使用多个列作为主键。在使用多列作为主键时,上述条件必须应用到构成主键的所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)。
数据库概述
SQL(structured query language)语言
3个部分定义语言DDL(Data definition Language)
-
DDL
用于定义数据库表,视图等等
-
DML
增改删查数据
-
DCL
数据控制语言 用户控制用户低访问权限 grant,revoke
Mysql数据类型
数字类型
整数类型
# 6种
- tinyint 1字节
- smallint 2
- mediumint 3
- int integer 4
- bigint 8
浮点数和定点数类型
# 浮点数
- float 4
- double 8
# 定点数类型
- demical m+2
# 用法
- 数据类型(6,2) 常用decimal(6,2)来表示小数。
- 6表示总长度,2表示小数点长度 小数点不占位置
日期和时间类型
插入时可以用数字或者字符,常用now()函数
# 五种
# year yyyy
- 表示年
# time hh:mm:ss
- 表示时间
# date yyyy-mm-dd
- 表示日期
# datetime yyyy-mm-dd hh:mm:ss
- 表示日期和时间
# timestamp yyyy-mm-dd hh:mm:ss
- 跟datetime一样,但是范围比较小,可以根据不同的时区来转换时间
字符串
存储字符串的数据类型
# 用法
- 数据类型(m)
# char(m) varchar(m)
# text
- 只能保存字符类型
# enum set
- 枚举 都是在创建表的时候,写好了取值范围。
- 属性 enum('值1',‘值2’)
- enum 只能插入一个,set可以插入多个。
- enum 包含65535 set 包含64
二进制
# binary(m)
# varbinary(m)
# bit(m)
# tinyblog
# blog
# mediumblog
# longblog
常见问题
字符串类型 字符 \ , 会被过滤 ,所以用 / 或者 两个\
操作数据库
删除数据库
drop database 数据库名;
创建数据库
create database 数据库名;
数据库引擎
就是表的类型,定义了表在计算机中的存储格式
特点 | InnoDB | MyISAM |
---|---|---|
事务安全 | Y | N |
外键 | Y | N |
索引 | Y | Y |
查看引擎
show engines \G
创建,修改和删除表
- 创建表的方法
- 表的完整性约束条件
- 查看表结构的方法
- 修改表结构
- 删除表结构
创建表
create table 表名 (
属性名 数据类型 [完整约束条件],
属性名 数据类型 [完整约束条件]
)engine=InnoDB Default charset=utf-8;
完整性约束条件
约束条件 | 说明 |
---|---|
Primary_key | 主键,非空,唯一 |
Foreign_key | 外键 |
Not null | 非空 |
Unique | 唯一 |
Auto_increment | 自增 |
Default | 默认 |
MYSQL中唯一约束和唯一索引的区别
1、唯一约束和唯一索引,都可以实现列数据的唯一,列值可以有null。
2、创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引。唯一约束是通过唯一索引来实现数据的唯一。
3、创建一个唯一索引,这个索引就是独立,可以单独删除。
4、如果一个列上想有约束和索引,且两者可以单独的删除。可以先建唯一索引,再建同名的唯一约束。
5、如果表的一个字段,要作为另外一个表的外键,这个字段必须有唯一约束(或是主键),如果只是有唯一索引,就会报错
设置表的外键
constraint 外键别名 foreign_key(子属性1,子属性2 ) references 表名(父属性1,父属性2) ;
查看表结构
# desc 表
# show create table 表 \G
修改表
修改表名
alter table 表名 rename 新;
修改表的字段
alter table 表 modify 属性名 数据类型
修改字段名
alter table 表 change 旧名 新名 (数据类型)
添加唯一约束的语法格式为:
ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>);
为已创建的表添加默认值
语法:
alter table <表名>add<字段名><类型>default<默认值>
实例:
alter table users_data add column RegisterTime datetime default now();
删除默认值约束
当一个表中的列不需要设置默认值时,就需要从表中将其删除。
修改表时删除默认值约束的语法格式如下:
ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <字段名> <数据类型> DEFAULT NULL;
增加字段
alter table 表名 add 属性名 数据类型 [完整性约束条件] [first | after 属性名2(之前还是之后)];
删除字段
alter table 表名 drop 属性名
修改字段的排列位置
alter table 表名 modify 属性名 数据类型 first | after 属性名;
更改表的存储引擎
alter table 表名 engine=存储引擎名;
删除表的外键约束
alter table 表名 drop foreign key 外键名
删除表
删除没有关联的表
drop table 表
删除关联的表
先删除关联
在删除表
索引
作用:加快查询数据库表中的特定记录
类型
- B型索引
- 哈希索引
索引的分类(6种)
-
普通索引
-
唯一索引
字段必须是唯一的
-
全文索引
使用FULLTEXT参数,只能创建在char varchar text 字段上
-
单列/多列索引
多列索引 只会在使用了第一个字段(在用作多列索引中的字段)起作用
-
空间索引
使用Spatial参数
创建索引(3种)
指在某个表的一列或多列上创建一个索引
在创建表的时候
create table 表名 (
字段 数据类型 ,
[索引类型 unique|fulltext| spatial] index|key 别名 (字段(长度) [asc|desc])
);
### 长度 只有是字符串的时候可以用。
在已经存在的表上创建索引
create [索引类型] index 别名 on 表名(属性名[(长度)] [asc|desc]);
用alter table 语句来创建索引
alter talbe 表 add [索引类型] index 索引名(属性名[(长度)] [asc|desc]);
删除索引
drop index 索引名 on 表名;
视图
有数据库一个表或者多个表导出的虚拟表,为查询语句的结果的集合。
触发器
Trigger 是由事件来触发某个操作
事件包括:
insert , update ,delete
SQL查询语句
查询数据
# mysql 默认不区分大小写
1. where 列 ='a'; A 和 a 都会被匹配。
基本查询语句
select * from 表名和视图列表 [where 条件] [group by 属性名1 [having 条件]] [order by 属性名2,属性名3] [asc desc] [limit x,y]# 指定排序方向 升序 asc 默认参数进行排序 升序[1,2,3] 降序 desc
查询指定的字段
where 条件
查询条件 | 符号 |
---|---|
比较 | < > 不等于 , > , < ,!<,!> |
范围 | Between and ,not between and == <=x<= |
集合 | in , not in x in (1,2,3,4)为1,2,3,4其中一个都可以。后面还可以包括 select子句。 |
字符 | like , not like |
是否为空值 | is null , is not null |
组合多个查询条件 | and , or |
否定后面的关键字 | Not |
and , or计算次序
# and 比 or 的优先级更高
- a or b and c
-- 理解为符合b且c 或者 a
-- 解决方案使用(a or b) and c
通配符进行过滤
# like
- % 代表多个字符>=0个字符
- ‘-’ 代表一个字符
- 汉字为两个字符。一个 - 代表一个字符。
使用Mysql正则表达式
# regexp '正则表达式'
# \\转字符。mysql自己解释一个,正则表达式解释一个。
查询结果不重复
distinct 属性名
作用于多列
distinct必须放在开头
select id, distinct name from A; --会提示错误,因为distinct必须放在开头
对结果进行排序
order by 属性名[asc desc ]
# desc 降序,只应用前面一个列名。
分组查询
group by 属性名 [having 条件表达式] [with rollup]
-
常跟集合函数一起使用。
count() , sum()总和 ,avg() ,max() ,min()
-
字段中取值相同记录为一组,但只显示该组的第一条记录。
-
Group_count(字段)函数,可以把分组后的字段全部显示。
-
按多个字段进行分组
Group by A ,B ; 将会进行先按 A进行分组 ,A相等的情况下再对B进行分组。
-
with rollup
将会在所有记录的最后一条加上一条记录。
注意事项:
group by 的意思为分组汇总。
使用了group by 后,要求Select出的结果字段都是可汇总的,否则就会出错。
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。
比如,有:{学号,姓名,性别,年龄,成绩}字段
-
这样写:
SELECT 学号,姓名,性别,年龄,sum(成绩)
FROM 学生表
GROUP BY 学号
就是错的,因为 “姓名、性别、年龄”未被汇总,且不一定是单一。 -
这样写:
SELECT MAX(学号),MAX(姓名),MAX(性别),MAX(年龄),sum(成绩)
FROM 学生表
GROUP BY 学号
是对的,汇总出每一同学号学生的总成绩。注意的是,只要学号相同,别的如果有不同,取它们值最大的一条作为显示输出。 -
这样写:
SELECT 学号,姓名,性别,年龄,sum(成绩)
FROM 学生表
GROUP BY 学号,姓名,性别,年龄
这样写也是对的,但注意的是,学号,姓名,性别,年龄中,只要有一个不同,就会当成另一条记录来汇总。
使用Limit限制查询结果的数量
limit 起始 记录数; 起始从0开始的;
limit 返回行数;
创建计算字段
计算字段是运行时在Select语句内创建的
# 拼接字段
- Concat(串1,串2,串3);
- 其他sql使用 + ,mysql使用Concat();
# 去除空格
- Trim() 去除两边的空格
- rTirm() lTrim()
# 算术计算
- +,-,*,/
- Select 3*2;
函数
数据处理函数
一般用在select 后 字段处理查询出来的数据和where子句后列使用 将以想要的格式展示出来。
- 文本处理函数
- 时间和日期处理函数
- Year(),Month(),Day();Data(),Time()
集合函数
# count()函数 个数
# sum() 总和
# avg() 求平均值
# max() 求最大值。min()
连接查询
内连:
只会查询出指定字段取值相同的记录
外联:
-
左连接
以左表为准,显示全部
-
右连接
以右表为准,显示全部
子查询
子查询是将一个查询语句镶套在另一个查询语句里面,内层查询语句的结果,可以做为外层查询语句提供查询条件
关键字 | 用法 |
---|---|
in | Where id in (select) 查询出的集合 |
比较符的子查询 | where score >= (select xx where id = 1) |
带exists 的子查询 | where exits (select ) 内层查询不返回查询的记录,返回一个真假值,内层查询语句查询到满足条件的记录,就返回一个真假值。为真外层查询才继续 |
any | 满足其中任意一条件 where score>= any (select) |
all | 满足所有条件 |
合并查询结果
-
union
合并并消除相同的记录
-
union all
直接简单的合并
别名
-
表取别名
表 别名
-
字段取别名
属性名 [as] 别名
插入,更新和删除数据
插入数据
为表的所有字段插入数据
1. insert into 表 vaules(值1 )
2. insert into 表(所有字段 字段1,字段2 ) values(值1,值2 );
为表插入部分数据
insert into 表(属性1 ,属性2 ) values(值1 ,值2 );
同时插入多条数据
insert into 表名([属性列表])
values(取值列表1),(取值列表2);
将查询结果插入带表中
insert into 表名(属性列表1)
select 属性列表2 from 表名2 where 条件表达式
更新数据
update 表名
set 属性名=取值1 ,属性名= 取值2 ,
where 条件表达式;
删除数据
delete from 表名
[where 条件表达式];
Mysql运算符
用来对操作数进行计算的符号
举例:
select a + 20
算法运算符
符号 | 作用 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ div | 除 |
% mod | 取余 |
比较运算符
符号 | 作用 |
---|---|
= | |
!= | |
Is null ,between and ,in ,like , regex |
返回 0 / 1 。
逻辑运算符
符号 | 作用 |
---|---|
&& and | 与 |
|| or | 或 |
! not | 非 |
Xor | 异或 |
返回值只有 1/0
0 或者 null 为 false
有0有null 返回 0
位运算符
符号 | 作用 |
---|---|
& | 与 |
| | 或 |
~ | 取反 |
^ | 异或 |
<< | 左移 |
>> | 右移 |
左移 ,右移都是补零
Mysql函数
数学函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gyJ4sh1S-1628521462814)(/Users/apple/Desktop/notes/数据库概述.assets/1605867850085.jpg)]
字符串函数
日期和时间函数
# now()
- 返回日期和时间
# curdate()
- 返回日期
# curtime()
- 返回时间
条件判断函数
# if(expr,v1,v2)
- 如果expr成立,返回v1,否则返回v2
# ifnull(v1 ,v2)
- 如果v1不为空,返回v2
-
case函数
case when expr then v1 when else vx end