小白终是踏上了这条不归路-------- mysql基础总结(终章)

**
小白终是踏上了这条不归路----小文的mysql学习笔记(1)

小白终是踏上了这条不归路----小文的mysql学习笔记(2)----条件查询

小白终是踏上了这条不归路----小文的mysql学习笔记(3)----排序询查

小白终是踏上了这条不归路----小文的mysql学习笔记(4)----常见的基本函数

小白终是踏上了这条不归路----小文的mysql学习笔记(5)----分组查询


小白终是踏上了这条不归路----小文的mysql学习笔记(目录)
**
在学习之后,感觉还不是很熟悉,于是跟着老师复习了一遍,跟着打了一遍总结。下面是mysql基础部分的所有知识点的总结,希望对自己以及看到这篇文章的人有所帮助。
**
在这里插入图片描述
**
当然总结只有主体部分,有些没明白的可以去目录看该节内容

一、数据库与mysql

(一)数据库的相关概念

一、数据库的好处

1、可以持久化数据到本地
2、结构化查询

二、数据库的常见概念★

1、DB:数据库,存储数据的容器
2、DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
3、SQL: 结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言

三、数据库存储数据的特点

1、数据存放到表中,然后表再放到库中
2、-个库中可以有多张表,每张表具有唯一的表名用来标识自己
3、表中有一-个或多个列,列又称为“字段”,相当于java中“属性”
4、表中的每一行数据,相当于java中“对象”

四、常见的题嘱屋管理系纲

mysgl、 oracle、 db2、 sqlserver

(二)mysql的相关介绍

一、MySQL的背景

前身属于瑞典的一家公司, MySQL AB
08年被sun公司收购
09年sun被oracle收购

二、MySQL的优点

1、开源、免费、成本低
2、性能高、移植性也好
3、体积小,便于安装

三、MySQL服务的启动和停止

方式一: 通过命令行
net start 服务名
net stop服务名
方式二:计算机一一右击一-管理一一服务。

四、MySQL服务的登录和退出

登录: mysq1 【-h 主机名-P端口号】 -u 用户名 -p密码|

Ps:我们目前学习的时候 用的是root 就可以直接mysql -u root -p密码就好了。

退出: exit或ctr1+C


二、 DQL语言

(一)基础查询

一、语法

select 查询列表
from 表名;

二、特点

1、查询列表可以是字段、常量、表达式、函数,也可以是多个.
2、查询结果是一个虚拟表

三、示例

1、查询单个字段
select 字段名 from 表名;

2、查询多个字段
select 字段名,字段名 from 表名;

3、查询所有字段
select * from 表名

4、查询常量
select 常量值;

注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要

5、查询函数
select 函数名(参数列表);

6、查询表达式
select a*b;

ps:支持我们正常的加减乘除以及取模等

7、起别名
①as
②空格

8、去重
select distinct 字段名 from 表名;

ps:distinct用于去重,一般后面只跟单个字段,如果后面跟的是多个字段,只有这多个字段都重复的一行才会被去重,其他只有部分重复的行是不会被去除的。

9、加号(+)
作用:做加法运算。
select数值+数值;直接运算,将二者相加。
select字符+数值;会先试图将字符转换成数值,如果转换成功,则继续运算;否则将字符转换成0,再与之继续做运算。
select nul1+值; 结果为null,null和任何值相加都等于null。

10、【补充 】concat拼接函数
select concat(字符1,字符2,字符3…);
功能:拼接字符

ps:可以将几个字符拼接在一起

11、【补充】 ifnull 函数
ifnull(exper1,exper2)
功能:判断exper1是否为null,如果为null返回exper2,否则返回exper1本身。

12、【补充】 isnull 函数
isnull(xxx);
功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0。

(二)条件查询

一、 语法

select 查询列表
from 表名
where 筛选条件

二、筛选条件的分类

1、简单条件运算符

大于 >
小于 <
等于 =
不等于 <> 或!=
大于等于 >=
小于等于 <=
安全等于 <=>

ps:<>安全等与,既可以用来判断普通数值,又可以用来判断null值。
但是 =和<>不能用来判断null值

2、逻辑运算符

&& 、 and
ll 、or
!、not

3、模糊查询
like

ps:like一般和通配符搭配使用,
通配符: %表示任意多个字符;
                _ 表示任意单个字符。

between and
in
is null / is not null ;用于判断null值。

4、is null 和 安全等与 <=>的区别
         二者都可以用于判断null值,但是is null不能判断普通类型的数值,而安全等与(<=>)可以判断普通类型的数值, but 安全等于的可读性比is null差。

(三)排序查询

一、语法

select 查询列表
from 表
where 筛选条件
order by 【asc/desc】

二、特点
1、asc代表的是升序,desc代表的是降序,如果不写,默认是升序;
2、order by子句中可以支持单个字段、多个字段、表达式、函数、别名。
3、order by 子句一般是放在查询语句的最后面,limit子句除外。

(四)常见的函数

概念: 类似于java的方法,,将一组逻辑语句封装在方法体中,对外暴露方法名。
好处: (1) 隐藏了实现细节;
            (2) 提高了代码的重要性.
语法: select 函数名(实参列表)【from 表】

一、单行函数

1、length(str); 获取参数值的字节个数
2、concat(str1,str2,…); 用于拼接字符串
3、upper(srt);将字符大写显示
4、lower(str);将字符小写显示
5、substr();用于截取指定的字符串。

ps:substr一共有两种语法:第一种是 substr(xxx,x);截取从指定索引处至后面的所有字符
第二种是substr(xxx,x,x);截取从指定索引处到指定长度的字符。

6、instr(xxx,xxx);返回子串第一次出现的索引
7、trim(“xx” from “xxaaaaaxx”);用于去掉前后指定的字符及空格。
8、lpad(“xxxx”,长度,str);用指定的字符实现左填充指定的长度
9、rpad(“xxx0,长度,str”);用指定的字符实现右填充指定长度

ps : 有一点注意,lpad 左填充和rpad右填充 ,如果字数多了则会将本身截取到相等的长度,从右边开始截取。

10、replace();用于替换

    replace(“aabbcc”,“aa”,“cc”);表示将aa换成cc
二、数学函数

1、mod();取模
2、round();:四舍五入
3、ceil();向上取整
4、floor();向下取整
5、truncate();截断
6、rand();获取随机数,返回0-1之间的小数,但是不包括端点值

三、日期函数

1、now();返回当前系统日期+时间
2、curdate();返回当前系统日期,不包含时间
3、curtime();返回当前系统时间,不包含日期
4、year();返回年
5、month();返回月
6、day();返回日
7、hour();返回小时
8、minute();返回分钟
9、cecond();返回秒
10、str_to_date();将字符格式的日期转换为指定格式的日期
11、date_format();将其他形式的日期转换成字符形式的日期

补充:

格式符 功能
%Y 四位的年份
%y 2位的年份
%m 月份( 01,02…11,12 )
%c 月份( 1,2…11,12 )
%d 日( 01,02,… )
%H 小时( 24小时制)
%h 小时( 12小时制)
%i 分钟( 00,01…59 )
%s 秒( 00,01…59 )
四、其他函数

Select version(); 查询版本号;
Select database();查看当前的库;
select user(); 查看当前用户;

五、流程控制函数

IF(expr1,expr2,expr3)

若expr1正确,则输出expr2;若expr1错误,则输出expr3.

case 函数的使用一: switch case 的效果

语法: case 要判断的字段或表达式
When 常量1 then 要显示的值1或语句
When 常量2 then 要显示的值2或语句
………
else 要显示的值n或语句
end

ps:一般用作等值判断

case函数的使用二:类似于多重if
语法:case
When 条件1 then 要显示的值1或语句1
When 条件2 then 要显示的值2或语句2
……
else 要显示的值n或语句n
end

ps:一般用于实现区间判断

六、分组函数

1分类

sum 求和
avg 平均值
max 最大值
min 最小值
count 计算个数

①语法
select 函数名 (字段) from 表名;

②支持的类型
sum和avg一般用于处理数值型
max、min、 count可以处理任何数据类型

③以上分组函数都忽略null

④都可以搭配distinct使用,实现去重的统计
select 函数名(distinct 字段) from 表;

⑤count函数
count (字段) :统计该字段非空值的个数
count (*) :统计结果集的行数
count (1) :统计结果集的行数

效率上:
MyISAM存储引擎,count ()最高
InnoDB存储引擎,count (
)和count (1)效率>count (字段)

(五)分组查询

一、语法:

     select 分组函数,列(要求出现在group by的后面)
     from 表
   【where 筛选条件】
    Group by 分组的列表
   【order by 子句】

特点1: 分组前的筛选条件,数据源是原始表,位置是放在group by前面用where+筛选条件;
分组后的筛选条件,数据源是分组后的结果集,位置是放在group by后面用having+筛选条件。
注:能用分组前筛选条件的,就优先考虑使用分组前筛选的条件。
特点2: group by子句支持单个字段分组、多个字段分组(多个字段之间用逗号隔开没有顺序要求)、表达式或函数(使用较少)
特点3: 也可以添加order by排序(排序放在整个分组查询的最后)

(六)连接查询

一、含义

又称多表查询,当查询的字段来自于多个表时,就会用到链接查询。

select
字段1,字段2
from表1,表2,…:

笛卡尔乘积: 当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决: 添加有效的连接条件

二、分类

        按年代分类:sq192标准:仅仅支持内连接;
                              sq199标准【推荐】:支持内链接+外连接(左外和右外)+交叉链接;
         按功能分类:
                 内连接:等值连接;
                               非等值连接;
                                自链接;
                 外连接:左外链接;
                                右外连接;
                                全外连接;
                                交叉连接;

三、sql92语法

1、等值连接

语法: select查询列表
          from表1别名,表2别名
          where表1. key=表2. key
          【and筛选条件】
          【group by 分组字段】
          【having分组后的筛选】
          【order by 排序字段】

特点:
①一般为表起别名
②多表的顺序可以调换
③n表连接至少需要n-1个连接条件
④等值连接的结果是多表的交集部分

2、非等值连接

语法: select查询列表
           from表1别名,表2别名
           where 非等值的链接条件
          【and筛选条件】
          【group by 分组字段】
          【having分组后的筛选】
          【order by 排序字段】

个人理解:若链接条件不是=,则为非等值连接

3、自链接

语法: select查询列表
           from表 别名1,表 别名2
           where 等值的连接条件
          【and筛选条件】
          【group by 分组字段】
          【having分组后的筛选】
          【order by 排序字段】

         MySQL自连接就是在同一张表上自己连接自己,参与连接的表是同一张表,通过设置表别名虚拟出两张表。当我们想将表中行与同一表中的其他行组合或运算时,可以使用自连接。要执行自连接操作必须使用表别名来帮助MySQL在查询中区分连接后的虚拟结果集中的字段。

四、sql99语法

1、内连接

语法: select 查询列表
           From 表1 别名
          【 inner】 join 表2 别名
           on 链接条件;

特点:
      ①表的顺序可以调换
      ②内连接的结果=多表的交集
      ③n表连接至少需要n 1个连接条件
      ④inner可以省略

分类:(1)等值连接;(2)非等值连接;(3)自链接

2、外连接

语法:    select 查询列表
           表1 别名1
          【连接类型】join 表2 别名
           on 连接条件
           【where筛选条件】
           【group by分组】
           【having筛选条件】
           【order by排序列表】

特点: 1、外连接的查询结果为主表中的所有记录
           如果从表中有和它匹配的,则显示匹配的值
           如果从表中没有和它匹配的,则显示null
           外连接查询结果=内连接结果+主表中有而从表没有的记录。
           2、左外连接,left join左边的是主表
                 右外连接,right join右边的是主表
           3、左外和右外交换两个表的顺序,可以实现同样的效果
           4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的,即两张表取并集

①查询的结果主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示nul1
②1eft join 左边的就是主表,right join 右边的就是主表
ful1 join 两边都是主表
③一般用于查询除了交集部分的剩余的不匹配的行

3、交叉连接

语法:     select 查询列表
            from 表1 别名.
            cross join 表2 别名;

ps:相当于用sq199的标准来实现的笛卡尔乘积

(七)子查询

一、含义

概念:出现在其他语句内部的select语句,称为子查询或内查询;
         内部嵌套其他select语句的查询即外部的查询语句,称为外查询或主.查询。

二、分类

分类:
    按子查询出现的位置:
                            select后面: 仅仅支持标量子查询
                            from后面: 支持表子查询
                            where或having后面:★    标量子查询(单行查询) ★
                                                                   列子查询(多行多行查询) ★
                                                                   行子查询
                           exists后面(相关子查询)   标量子查询
                                                                   列子查询
                                                                   行子查询
                                                                   表子查询

    按结果集的行列数不同:
                            标量子查询 (结果集只有一行一列)
                            列子查询 (结果集只有一列多行)
                            行子查询 (结果集有一行多列也可是多行多列)
                            表子查询 (结果集一般为多行多列)

注:不论是一行一列还是一列多行,只要是查询都可以叫做表子查询,但我们通常所说的表子查询一般指多行多列。

三、示例

where 和having后面
标量子查询
案例:查询最低工资的的员工姓名和工资

SELECT last_name,salary
FROM employees
WHERE salary=(
	SELECT MIN(salary) 
	FROM employees
);

列子查询
案例:查询所有是领导的员工姓名

SELECT last_name
FROM employees
WHERE employee_id IN (
	SELECT DISTINCT manager_id 
	FROM employees
);

(八)分页查询

        当你查询的数据很多的时候,一页显示不全,则需要提交sql分页显示,这便用到了我们今天所学的分页查询了
             limit 【offset,】 size;

一、语法

select查询列表
from表1
【 join type join表2
on连接条件
where
筛选条件
group by分组字段
having分组后的筛选
order by排序的字段】
limit 【offset,】size;

解释:
offset:要显示条目的起始索引(起始索引从0开始)
size:要显示的条目个数

当你像服务器提交查询的时候一般,这个起始不会是一个固定的值,这不方便我们查询会是一个变量,这就需要用到下面的一个公式:select   查询列表
                                                                 from   表
                                                                 limit   (page-1) *size , size;

page要显示的页数,size每页的条目数

(九)联合查询

一、含义

Union 联合合并:可以将多条查询语句的查询结果合并成一-个结果。

二、语法

语法:     查询语句1
             union 【all】
             查询语句2
             union 【all】
             。。。。。
             查询语句n

三、意义

1、将一条比较复杂的查询语句拆分成多条语句
2、当要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时便可以用到联合查询。

四、特点

1、要求多条查询语句的查询列数必须是一致的!
2、(虽然当几个查询语句查询的列的类型不一样的时候不会报错,查询结果的列名默认以你第一个查询语句的查询字段命名。)但是我们要求多条查询语句中查询的每一列的类型和顺序最好一致。
3、union关键字默认去重,如果使用union all 可以包含重复项。


三、DML语言

(一)插入

一、方式一

语法:
insert into 表名(字段名…) values (值…);

特点:
1、 要求值的类型和字段的类型要一致或兼容
2、 字段的个数和顺序不一-定 与原始表中的字段个数和顺序-致
但必须保证值和字段一 一对应
3、 假如表中有可以为null的字段,注意可以通过以下两种方式插入null值
①字段和值都省略
②字段写上,插入的值写null
4、 字段和值的个数必须一致
5、 字段名可以省略,默认所有列

二、方式二

语法:
     insert into表名
     set列名=值,列名=值, …

注意: 1、方式一支持插入多行,方式二不支持
            2、方式一可以支持子查询批量插入数据,而方式二不支持

(二)修改

一、修改单表的记录★

语法:       update 表名
               set列=新值,列=新值, …
              【where 筛选条件】;

二、修改多表的记录[补充]

      sql99语法:     .update 表1 别名
                              inner / left /right join 表2 别名.
                              on 连接条件
                              set 列=值… τ
                              where 筛选条件;

(三)删除

方式一:使用delete

1、单表记录的删除【★】
                 delete from 表名 where 筛选条件 【limit 条目数】;

2、(级联删除)多表记录的删除【补充】
sq199语法:   delete 表1的别名,表2的别名
                     from 表1 别名
                     inner/left/right join 表2 别名 on 连接条件
                     【where 筛选条件;
                    【limit 条目数】

方式二:truncate

语法:
     trruncate table 表名;

注意: 该方式直接删除表的整张数据,不能添加where筛选条件

两种方式的区别
  1. delete 后面可以添加where条件,而truncate不能加
  2. 当删除整张表时,truncate删除效率较高
  3. 假如要删除的表中有自增长列,如果用delete删除后,再插入数据,自增长列的值从断点开始,而truncate删除后,再插入数据,自 增日列的值从1开始.
  4. truncate删除没有返回值,delete删除有返回值
  5. truncate 不可以回滚,delete可以回滚

四、DDL语言

(一)库的管理

一、创建库

create database 【if not exists】 库名 【 character set 字符集名】

二、修改库

alter database 库名 【character set 字符集名】;

三、删除库

drop database 【if exists】 库名;

(二)表的管理

一、创建表

语法:    create table 【if not exists】表名(
            列名 列的类型【(长度)约束】 ,
            列名 列的类型【 (长度)约束】,
            列名 列的类型【(长度)约束】,
            。。。。。
            列名 列的类型【(长度)约束】
            )

二、修改表

1.添加列
alter table 表名add column 列名 类型【first / after字段名】 ;

2.修改列的类型或约束
alter table 表名modify column 列名 新类型 / 新约束 ;

3.修改列名
alter table 表名 change column 旧列名 新列名 类型;

4.删除列
alter table 表名drop column 列名;

5.修改表名
alter table 表名 rename to 新表名;

三、删除表

语法: drop table 【if existis】表名

四、复制表

1、复制表的结构
create table 表名 like 旧表;

2、复制表的结构+数据
create table 表名
select 查询列表 from 旧表 【where 筛选】 ;

(三)常见的数据类型

一、数值型

1、整型

字节 整型 范围
1 Tinyint 有符号:-128~127;无符号: 0~255
2 Smallint 有符号:-32768~32767;无符号: 0~65535
3 Mediumint 有符号: -8388608~8388607;无符号: 0~1677215
4 Int / interger                                    有符号: - 2147483648 2147483647 ;                                                 &无符号: 0~4294967295
5 Bigint    有符号:-92233720368547 75808~92233720368547 75807;                                         无符号: 0~9223372036854775807*2+1

注意事项
①如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
②如果插入的数值超出了整型的范围,会报警告(8.0版本sqlyog),无法插入数据
③如果不设置长度,会有默认的长度

二、小数

一共有两类一类是浮点型,一类是定点型

浮点数类型 范围 字节
float 士1.75494351E 38~士3.402823466E+38 4
double 士2.2250738585072014E-308~士1.7976931348623157E+308 8
定点数类型 范围 字节
DEC(M,D)/DECIMAL(M,D)                最大取值范围与double相同,给定decimal的有效职值范围由M和D决定 M+2

释一下M和D的意思:
D代表小数的位数,如果多了便会四舍五入保留D位小数,如果少了不够D位那么会自动用0来填充
M代表整数和小数一共加起来的位数,不能超过M(小文的是8.0当你超过M位数时是不会插入临界值,当然也不会插入数据)

注意: (M,D) 可以省略,如果是floatdouble则会根据插入的数值的位数来确定位数;
            如果是 DECIMAL M默认是10,D默认是0。
            定点型的精确度较高,如果要求插入数值的精度较高如货币运算等就考虑使用.

三、字符型

char、varchar、 binary、 varbinary、 enum、 set、text、blob 等。

较短的文本:charvarchar

类型 范围 最多字符数
char(M) M为0~ 255之间的整数 M
varchar(M) M为0~65535之间的整数 M

二者的区别:
char(M) 是固定长度的字符,M可以省略默认为一,虽然比较占空间,但是效率较高;
varchar(M) 是可变长度的字符,M不可以省略,相比于char 更节省空间,但是效率相对较低。

解释:

这里char的固定长度字符的意思就是:加入你设置了char(6);然后你插入的数据只要两个字符“aa”但是她是固定长度字符,所以系统还是会给你开六个的字符位置 ; 而varchar(M)是可变长度字符,M是它的最大字符数,只要在M内,你插入几个字符,那系统就给你开几个字符的位置,

补充

1、binaryvarbinary类型(用于保存较短的二进制)
说明: 类似于char和varchar,不同的是它们包含二进制字符串而不包含非二进制字符串。

2、Enum类型,
说明:又称为枚举类型,要求插入的值必须属于列表中指定的值之一。(不区分大小写)

四、日期型
日期和日期类型 字节 最小值 最大值
date 4 1000-01-01 9999-1231
datetime 8 1000-01-01 00:00:00 9999-12 -31 23: 59:59
timestamp 4 1 9700101 080001 2038年的某个时刻
time 3 -838 :59:59 838: 59:59
year 1 1901 2155

date 只保存日期
time 只保存时间
year 只保存年
datetime 保存日期+时间(不受时区影响)
timestamp 保存日期+时间(受时区影响)

Timestampdatetime区别:
1、Timestamp支 持的时间范围较小,取值范围19700101080001- – 2038年的某个时间
      Datetime的取值范围: 1000-1-1 --9999- 12-31
2、timestamp和实际时区有关,更能反映实际的日期
  而datetime则只能反映出插入时的当地时区
3、timestamp的 属性受Mysq|版本和SQLMode的影响很大

(四)常见的约束

一、含义

一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性。

二、六大约束

(1)NOT NULL:非空,用于保证该字段的值不能为空
比如姓名、学号等
(2)DEFAULT: 默认,用于保证该字段有默认值
比如性别
(3)PRIMARY KEY:主键,用于保证该字段的值具有唯一-性,并且非空
比如学号、员工编号等
(4)UNIQUE:唯一键,用于保证该字段的值具有唯一-性,可以为空
比如座位号
(5)CHECK:检查约束【mysql 中不支持】(意思就是在mysql中你输入check它不会报错,但是也不会执行!)
(6)FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值.

主键和唯一
1、区别:
①、一个表至多有一个主键,但可以有多个唯一键
②、主键不允许为空,唯一键可以为空
2、相同点
都具有唯一性
都支持组合键,但不推荐
外键:
1、用于限制两个表的关系,从表的字段值引用了主表的某字段值
2、外键列和主表的被引用列要求类型- -致,意义-样,名称无要求
3、主表的被引用列要求是- -个key (- -般就是主键)
4、插入数据,先插入主表
删除数据,先删除从表。

我们有一下两种删除主表和从表记录的方式,在添加外键的时候加上条件
方式一:级联删除
ALTER   TABLE    stuinfo(解释:表名)   ADD   CONSTRAINT   fk(外键名)   FOREIGN KEY  (majorid)  REFERENCES major (id)   ON   DELETE   CASCADE ;

注释: 就是在添加外键的时候在最后添加 ON DELETE CASCADE,
产生的效果就是:当我们删除从表的数据时,主表与从表相对应的数据也会一起删除(是直接那一行数据都会被删除)

方式二:级联置空
ALTER  TABLE stuinfo(解释:表名)  ADD  CONSTRAINT  fk_ stu major  F0REIGN  KEY (majorid)  REFERENCES major(id)  ON  DELETE  SET  NULL;

注释:就是在添加外键的时候在最后添加ON DEKETE SET NULL
产生的效果就是:当我们删除从表的数据时,主表中与之相对应的字段会被设置为null

三、创建表时添加约束

语法:

create table 表名(
	字段名 字段类型 not null, #非空
	字段名 字段类型 primary key, #主键
	字段名 字段类型 unique, #唯一
	字段名 字段类型 default 值,默认
	constraint 约束名 foreign key(字段名) references 主表(被引用列)

注意:
列级约束不可以起约束名,并且除了外键,其他的都可以添加列级约束;
表级约束可以取约束名,但对主键无效,并且不支持非空和默认

语法
添加列级约束:
alter table 表名 modify column 字段名 字段类型 约束条件;
添加表级约束:
alter table 表名 add 【cons’t’raint 约束名】 约束类型(字段名) 【外键的引用】

四、修改表时添加或删除约束

添加语法
添加列级约束:
alter table 表名 modify column 字段名 字段类型 约束条件;

添加表级约束:
alter table 表名 add 【cons’t’raint 约束名】 约束类型(字段名) 【外键的引用】

删除语法: alter table 表名 drop 约束条件 列名(也可能是你取了别名的约束名);
                   alter table 表名 modify column 列名 数据类型 null;
                   alter table 表名 modify column 列名 数据类型 ;

(五)标识列

即自增长列

1、不用手动插入值,可以自动提供序列值,默认从1开始,步长为1

auto_increment_increment 代表步长值,就是代表自增的个数,可以用set来更改步长值
auto_increment_offset 代表起始值,当然我们也可以用set来更改起始值。

2、一个表至多有一个自增长列
3、自增长列只能支持数值型
4、自增长列必须为一个key

一、创建表时设置自增长列

create table 表(
字段名 字段类型 约束 auto_ increment .
)

二、修改表时设置自增长列

alter table 表 modify column 字段名 字段类型 约束 auto_ increment

三、删除自增长列

alter table 表 modify column 字段名 字段类型 约束


五、TCL语言

(一)事务

一、含义

.           是由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。即这个执行单元要么全部执行,要么全部不执行。

二、特点(ACID属性)

A 原子性 :一个事务是不可再分割的整体,要么都执行要么都不执行
C 一致性:一个事务可以使数据从- -个- -致状态切换到另外-一个- 致的状态
I 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离的
D持久性:一个事务- -旦提交了,则永久的持久化到本地

三、事务的使用步骤★

首先说一下,事务一共有两种:
一种是隐式事务,该事务没有明显的开启和结束的标记,比如:insert、update、delete语句都是;
一种是显示事务,该事务具有明显的开启和结束的标记,但有个前提:必须先将系统的自动提交功能关闭(即 set autocommit=0 将其关闭)
      注:这里关闭自动提交功能并不是永久关闭,只对当前会话有效,下次开启时需要重新

使用显式事务:

第一步:开启事务
set autocommit=0;
start tr ansaction; #可以省略

第二步:编写一组逻辑sql语句
注意: sq1语句支持的是insertupdatedelete
设置回滚点:
savepoint回滚点

第三步:结束事务
提交: comunit;
回滚: rollback; 
回滚到指定的地方:rollback to 回滚点名;

四、事务的并发问题

1、事务的并发问题产生的原因
         对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:

2、并发问题有哪些:
脏读: 对于两个事务T1, T2, T1读取了已经被T2更新但还没有被提交的字段.
.之后,若T2回滚,T1读取的内容就是临时且无效的.
不可重复读: 对于两个事务T1, T2,T1读取了一个字段,然后T2更新了该字段.
之后,T1再次读取同一个字段,值就不同了.
幻读: 对于两个事务T1, T2,T1从一个表中读取了一个字段,然后T2在该表中插
入了一-些新的行.之后,如果T1再次读取同一个表,就会多出几行.

3、如何解决事务的并发问题
可以通过设置隔离级别来解决并发问题

4、4种隔离级别

隔离级别 描述
READ UNCOMMITTED(读未提交数据) 允许事务读取未被其他事物提交的变更.脏读,不可重复读和幻读的问题都会出现
READ COMMITED(读已提交数据) 只允许事务读取已经被其它事务提交的变更.可以避免脏读.但不可重复和幻读问题仍然可能出现
REPEATABLE READ(可重复读) 确保事务可以多次从一个字段中读取相同的值.在这个事务持续期问,禁止其他事物对这个字段进行更新.可以避免脏读和不可重复读.但幻读的问题仍然存在
SERIALIZABLE(串行化) 确保事务可以从一个表中读取相同的行. 在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作所有并发问题都可以避免,但性能十分低下.

Oracle支持的2种事务隔离级别: READ COMMITEDSERIALIZABLE
Oracle 默认的事务隔离级别为: READ COMMITED
Mysql支持4种事务隔离级别.Mysql默认的事务隔离级别为: REPEATABLE READ

           每启动一个mysql程序,就会获得一个单独的数据库连接.每.个数据库连接都有一个全局变量 @@transaction_isolation ,表示当前的事务隔离级别.
            查看当前的隔离级别: SELECT @@transaction_isolation;
            设置当前mySQL连接的隔离级别:
                                                set transaction isolation level read committed;
            设置数据库系统的全局的隔离级别:.
                                                 set global transaction isolation level read committed;


六、视图

一、含义

mysql5.1版本出现的新特性,本身是一个虚拟表,它的数据来自于表,通过执行时动态生成。

好处:
1、简化sql 语句
2、提高了sql 的重用性
3、保护基表的数据,提高了安全性

二、创建视图

语法: create view 视图名称
             AS
            sql查询语句 ;

三、修改视图的两种方式

方式一
语法: create or replace view 视图名
            AS
           sql查询语句

方式二
语法: alter view 视图名
            AS
            sql查询语句

四、删除视图

语法: drop view 视图名,视图名,…

注意:你必须要有删除权限才能够执行删除,当然该删除语句既可以只删除一个视图,也可以同时删除多个视图

五、查看视图

方式一:

         desc 视图名;

方式二:

        SHOW  CREATE  VIEW  视图名;
六、视图的更新

1、插入 insert
2、修改 update
3、删除 delete
4、查看 select

但是

并不是所有的视图都是可更新的,视图是否可更新和视图查询的定义有关系,以下类型的视图都是不可更新的:
1、包含以下关键字的SQL语句:
聚合函数(SUM、 MIN、MAX、COUNT等)、 DISTINCT、 GROUP BY、HAVING、UNION或UNION ALL
2、常量视图
3、select中包含子查询
4、JOIN(即连接查询)
5、 FROM一个不能更新的视图
6、WHERE子句的子查询引用了FROM子句中的表
7、使用了临时表


七、变量

一、系统变量

说明: 变量由系统提供的,不用自定义

语法:

①查看系统变量
show 【global / session 】variables like “ ”;如果没有显式声明 global 还是 session,则默认是session会话变量。

②查看指定的系统变量的值
select @@【global / session .】 变量名;如果没有显式声明 global 还是 session,则默认是session会话变量

③为系统变量赋值
方式一:
set 【global / session 】变量名=值 ;如果没有显式声明global还是session,则默认是session
方式二:
set @@global. 变量名=值;
set @@变量名=值;

1、全局变量
服务器层面上的,必须拥有super权限才能为系统变量赋值,作用域为整个服务器,也就是针对于所有连接(会话)有效。

2、会话变量
服务器为每一个连接 的客户端都提供了系统变量,作用域为当前的连接(会话)

二、自定义变量

1、用户变量

作用域: 针对于当前连接(会话)生效
位置: begin end里面,也可以放在外面
使用步骤:
              声明
              赋值
              使用(查看、比较、运算)
第一步: 声明并初始化(三种方式)

	方式一:
	SET @用户变量名=;
	方式二:
	SET @用户变量名:=;
	方式三:
	SELECT @用户变量名:=;

注意: 如果用set 则两种写法都可以;但是如果用selet 则等号前面必须加上冒号

第二步: 赋值(更新用户变量的值)两种方式

	方式一:通过setselect	
		SET  @用户变量名=;
		SET  @用户变量名:=;
		SELECT  @用户变量名:=;
	方式二:通过 SELECT INTO
		SELECT  字段  INTO  变量名
		FROM;

第三步: 使用(查看用户变量的值)

语法:  SELECT @用户变量名;

2、局部变量

作用域: 仅仅在定义它的begin end中有效
位置: 只能放在begin end中,而且只能放在第一句

使用: 三步走
第一步: 声明

语法:	DECLARE 变量名 类型;
		DECLARE 变量名 类型 DEFAULT;(如果要初始化就这么写)

注意: 当然这里初始化的值要和前面设置的类型一致

第二步: 赋值

语法:
	方式一:通过setselect	
		SET 局部变量名=;
		SET 局部变量名:=;
		SELECT @局部变量名:=;
    方式二:通过 SELECT  INTO
		SELECT 字段 INTO 局部变量名
		FROM;	

第三步: 使用

语法:	SELECT 局部变量名;

八、存储过程和函数

说明: 都类似于java中的方法,将-组完成特定功能的逻辑语句包装起来, 对外暴露名字
好处:
1、提高重用性
2、sql 语句简单
3、减少了和数据库服务器连接的次数,提高了效率;

(一)存储过程

一、创建★

创建语法:

CREATE    PROCEDURE    存储过程名(参数列表)
BEGIN
             存储过程体(一组合法有效的sql语句)
END

参数列表一共包括三个部分:参数模式、参数名、参数类型
IN   该参数可以作为输入,也就是该参数需要调用方传入值
OUT   该参数可以作为输出值,也就是该参数可以作为返回值
INOUT   该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值。

注意: 如果存储过程体仅仅只有一句话,那么 BEGIN END 可以省略,并且
存储过程体中的每条 SQL 语句的结尾要求必须加分号。
而这时我们存储过程的结尾就需要自己来设置

二、调用

语法: call 存储过程名(实参列表);

举例:
调用in模式的参数: call 存储过程名(‘值’) ;
调用out模式的参数: set @name;
                                call 存储过程名 (@name) ;
                                select @name;
调用inout模式的参数: set @name=值;
                                   call 存储过程名 (@name);
                                   call select @name;

这里的@name 为你自己写的任意变量,你可以写成其他的,并且我们可以省略前面的set步骤,直接call调用,并select打印

三、查看

语法:show   create   procedure   存储过程名

四、删除

语法:drop   procedure   存储过程名

(二)函数

一、创建★

语法: create   function 函数名(参数列表)   returns    返回类型
            begin
                        函数体
             end

解释:
参数列表: 一共包含参数名参数列表两部分。
函数体: 是我们封装的所有sql语句,在写完函数体后,一定要写上 return 语句 ,不然会报错。
               我们一般是在前面写函数体,写完之后在后面写上return值

二、调用

语法: select    函数名(参数列表)

三、查看

语法: show create function 已创建的函数名称;

四、删除

语法: drop function 已创建的函数名。


九、流程控制结构

流程控制结构主要一共有三种:

顺序结构: 程序从上往下依次执行
分支结构: 程序从两条或多条路径中选择一条去执行
循环结构: 程序在满足一定条件的基础上,重复执行一段代码

(一)分支结构

一、if函数

功能: 可以实现简单的双分支。

语法: IF(表达式1,表达式2,表达式3);

ps:一般和其他的语句如 select、等一起使用

解释: 如果表达式1成立,则IF函数返回表达式2的值,否则返回表达式3的值

二、case结构

功能: 实现多分支

(1)case 函数的使用一: switch case 的效果类似于java中的switch语句,一般用于实现等值判断。

        语法case 要判断的字段或表达式
                    When 常量1 then 要显示的值1或语句;
                    When 常量2 then 要显示的值2或语句;
                    ………
                    else 要显示的值n或语句;
                    end case;

(2)、case函数的使用二: 类似于多重if。一般用于实现区间判断

         语法case
                    When 条件1 then 要显示的值1或语句1;
                    When 条件2 then 要显示的值2或语句2;
                    ……
                   else 要显示的值n或语句n;
                   end case;

位置:
可以放在任何位置,
如果放在begin end外面,作为表达式结合着其他语句使用
如果放在begin end里面,-般作为独立的语句使用

三、if结构

功能: 可以实现多分支

语法:       if 条件1   then   语句1;
                  elseif   条件2   then   语句2;
                  … …
                【else 语句n】;
                  end   if ;

位置: 只能放在begin end 中。

(二)循环结构

位置: 只能放在begin end 中。

特点: 都能实现循环结构

对比: .
①这三种循环都可以省略名称,但如果循环中添加了循环控制语句( leaveiterate )则必须添加名称

loop :一般用于实现简单的死循环。
while:先判断后执行。
repeat:先执行后判断,无条件至少执行一-次。

一、while

语法:
          【别名:】 while 循环条件 do
                                            循环体;
            end while 【别名】;

二、loop

语法:
            【别名:】loop
                          循环体;
              end loop 【别名】;

三、repeat

语法:
            【别名:】 repeat
                              循环体;
              until 结束循环的条件
              end repeat 【别名】;

四、循环控制语句

iterate 类似于continue, 继续,结束本次循环,继续下一次。
leave 类似于 break,跳出,结束当前所在的循环。
**
在这里插入图片描述

不错哦这么长的总结你都能看到结尾,嘿嘿嘿,整个赞再走咋样【滑稽】
**
当然如果有不清楚的地方,直接来 小文的mysql学习笔记目录
**
         Time will tell you the love for the simple things lasts long and the people loving you are the warmest. ​​​​
                 ---------------时光会告诉我们,简单的喜欢最长远,懂你的人最温暖

猜你喜欢

转载自blog.csdn.net/qq_45948983/article/details/106090042
今日推荐