mysql -速成

目录

1.概述

1.3SQL的优点

1.4 SQL 语言的分类

2. 软件的安装与启动

2.1  安装

 2.2 MySQL服务的启动和停止

2.3 MySQL服务的登录和退出

​编辑

2.4 mysql常用命令

2.5 图形化用户结构Sqlyong 

3.DQL 语言

        3.1 基础查询

 3.1.1、语法

3.1.2 特点

3.2 条件查询

3.2.1 语法

3.2.2 举例 

3.3 模糊查询

3.3.1 语法

3.3.2 举例

 3.4 排序查询

3.4.1 语法

3.4.2 举例

 3.5常见函数

3.5.1 语法

3.5.2 举例

3.5.2.1 单行函数

3.5.2.2 数学函数

  3.5.2.3 日期函数

3.5.2.4 其他函数

3.5.2.5 流程控制函数

 3.5.2.6 分组函数

3.6 分组查询

3.6.1语法:

3.6.2 举例

3.7 连接查询

3.7.1 语法

3.7.2 举例

3.7.2.1 sql 92 标准

3.7.2.2 sql 99 标准

 3.8 子查询

3.8.1 语法

3.8.2 举例 

 3.9 分页查询

3.9.1 语法

3.9.2 举例

 3.10 联合查询

4 DML 语言

4.1 插入

4.1.1 语法

4.1.2 举例 

 4.2 修改

4.2.1 语法

4.2.2 举例

 4.3 删除

4.3.1 语法

4.3.2 举例

5 DDL 

语法:

5.1 库的管理

5.2 表的管理

 5.3 常见的数据类型

5.3.1 整型 

5.3.2 浮点型​编辑

 ​编辑

 5.2.4 字符型

​编辑

 5.2.5 日期型

 5.4 常见约束

5.5 标识列 

 6 mysql 事务(TCL)

6.1 事务以及相关概念

6.2 事务的演示

7视图

7.1语法

7.2 举例


1.概述

        1.1数据库的好处

        保存数据 的容器:
        数组
        集合
        文件
        实现数据持久化
        •使用完整的管理系统统一管理,易于查询

mysql -速成_第1张图片

1.2 数据库的概念
DB
数据库( database ):存储数据的“仓库”。它保存了一系列有组织的数据。
DBMS
数据库管理系统( Database Management System )。数据库是通过 DBMS 建和操作的容器
SQL
结构化查询语言( Structure Query Language ):专门用来与数据库通信的语
mysql -速成_第2张图片

1.3SQL的优点

1、不是某个特定数据库供应商专有的语言,几乎所有DBMS都支持SQL
2、简单易学
3、虽然简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。

1.4 SQL 语言的分类

        
1、DML(Data Manipulation Language):数据操纵语句,用于添加、删除、修改、查询数据库记录,并检查数据完整性
  • INSERT:添加数据到数据库中
  • UPDATE:修改数据库中的数据
  • DELETE:删除数据库中的数据
  • SELECT:选择(查询)数据
  • SELECT是SQL语言的基础,最为重要
2、DDL(Data Definition Language):数据定义语句,用于库和表的创建、修改、删除。
  • CREATE TABLE:创建数据库表
  • ALTER TABLE:更改表结构、添加、删除、修改列长度
  • DROP TABLE:删除表
  • CREATE INDEX:在表上建立索引
  • DROP INDEX:删除索引
3、DCL(Data Control Language):数据控制语句,用于定义用户的访问权限和安全级别。
  • GRANT:授予访问权限
  • REVOKE:撤销访问权限
  • COMMIT:提交事务处理
  • ROLLBACK:事务处理回退
  • SAVEPOINT:设置保存点
  • LOCK:对数据库的特定部分进行锁定

2. 软件的安装与启动

2.1  安装

        首先下载SQLyog 和mysql的相关版本。

可以使用我的链接链接

https://pan.baidu.com/s/1hrwTpAtTRS7q0VsjmRePQg?pwd=2z3o 
提取码:2z3o

             MySQL

        mysql -速成_第3张图片

 点击安装,

mysql -速成_第4张图片

一路安装,中间注意设置端口号和加入环境变量,记住安装的密码和端口号。即可,之后安装Sqlyog。
        

 2.2 MySQL服务的启动和停止


方式一:通过命令行
    net start 服务名
mysql -速成_第5张图片
    net stop 服务名


方式二:计算机——右击——管理——服务

 Esc+shift+ctrl 选择点击mysql 右键关闭。
mysql -速成_第6张图片

2.3 MySQL服务的登录和退出

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

        用户名和密码都是自己安装的时候的。

mysql -速成_第7张图片

2.4 mysql常用命令

1.查看当前所有的数据库
show databases;
2.打开指定的库
use 库名
3.查看当前库的所有表
show tables;
4.查看其它库的所有表
show tables from 库名;
5.创建表
create table 表名(
列名 列类型,
列名 列类型,
);
6.查看表结构
desc 表名;
7.查看服务器的版本
方式一:登录到mysql服务端
select version();
方式二:没有登录到mysql服务端
mysql --version

mysql --V

       

 mysql -速成_第8张图片

mysql -速成_第9张图片

###a)MySQL的语法规范 1.不区分大小写,但建议关键字大写,表名、列名小写

2.每条命令最好用分号结尾

3.每条命令根据需要,可以进行缩进 或换行

 4.注释 单行注释:#

注释文字 单行注释:-- 注释文字

多行注释:/* 注释文字 */

###b)SQL的语言分类

    DQL(Data Query Language):数据查询语言

        select

    DML(Data Manipulate Language):数据操作语言

        insert 、update、delete

    DDL(Data Define Languge):数据定义语言

        create、drop、alter

    TCL(Transaction Control Language):事务控制语言

        commit、rollback

2.5 图形化用户结构Sqlyong 

mysql -速成_第10张图片

mysql -速成_第11张图片

 运行,快捷键F9 所有的代码都运行。默认鼠标滚轮+ctrl 可以修改终端的的字体大小。

以后演示代码都会在Sqlyong 进行演示。

3.DQL 语言

        在学习之前需要将数据库中添加数据。才能接下来的学习。点击root@localhost 右键,执行sql 脚本。sql 文件。在次点击root@localhost 刷新。就可以看到增加了两个数据库。

链接:https://pan.baidu.com/s/1Ve_ruDuYwQkZSYDKUL5jpg?pwd=ydye 
提取码:ydye

首先主要使用myemployees;

mysql -速成_第12张图片

 mysql -速成_第13张图片

mysql -速成_第14张图片

 myemployees 库内部四张表。mysql -速成_第15张图片

 mysql -速成_第16张图片

点击+好可以新建一个查询分析器。

mysql -速成_第17张图片

        3.1 基础查询

 3.1.1、语法

1、查询单个字段
select 字段名 from 表名;
2、查询多个字段
select 字段名,字段名 from 表名;
3、查询所有字段
select * from 表名
4、查询常量
select 常量值;
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
5、查询函数
select 函数名(实参列表);
6、查询表达式
select 100/1234;
7、起别名
①as
②空格  (别名不能有空格,特殊用途,否则有歧义可以加上双引号)
8、去重
select distinct 字段名 from 表名;

9、+
作用:做加法运算
select 数值+数值; 直接运算
select 字符+数值;先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算
select null+值;结果都为null

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

11、【补充】ifnull函数
功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
select ifnull(commission_pct,0) from employees;

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


3.1.2 特点


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

mysql -速成_第18张图片

        mysql -速成_第19张图片

mysql -速成_第20张图片

##########注意
1.选中代码F12 可以将写的代码格式化。
2库名,可以在sqlyong 上侧显示,如图显示myemployees.建议 在代码区使用use +库名在进行代码操作,避免问题。
3.使用字母键盘1 左侧的··着重号,可以用来避免表中属性和关键字重复,例如,表中有一个属性叫NAME ,SELECT 这种的和sql 本身的关键字重复,所以用着重号进行区分。

mysql -速成_第21张图片

 代码如下。

USE myemployees ;

SELECT * FROM employees;
SELECT last_name FROM employees;
SELECT 
  last_name,
  first_name,
  salary,
  email 
FROM
  employees ;

常量查询。

mysql -速成_第22张图片

 起别名:

        mysql -速成_第23张图片

 mysql -速成_第24张图片

 去重

        mysql -速成_第25张图片

 9 + 号的作用

mysql -速成_第26张图片

查询员工的姓和名连接成一个字段,显示为姓名

        mysql -速成_第27张图片

3.2 条件查询

3.2.1 语法

条件查询:根据条件过滤原始表的数据,查询到想要的数据

    语法:

    select

        要查询的字段|表达式|常量值|函数

    from

        表

    where

        条件 ;

    分类:

    一、条件表达式

        示例:salary>10000

        条件运算符:

        > < >= <= = != <>

   

    二、逻辑表达式

    示例:salary>10000 && salary<20000

   

    逻辑运算符:

        and(&&):两个条件如果同时成立,结果为true,否则为false

        or(||):两个条件只要有一个成立,结果为true,否则为false

        not(!):如果条件成立,则not后为false,否则为true

3.2.2 举例 

查询员工工资大于12000 的员工信息有哪些

        mysql -速成_第28张图片

 查询部门部门编号不等90号的员工木你给和部门编号。

mysql -速成_第29张图片

查询在10000-20000之间员工名,工资,奖金

mysql -速成_第30张图片

 查询部门编号不是90 到110 之间,或者工资高于15000 的员工信息。

mysql -速成_第31张图片

3.3 模糊查询

3.3.1 语法

        

3、模糊查询
like:一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符

between a and b(包含临临界值 and 前后位置不能颠倒) 


in  :判断某字段的值是否属于in 列表中的某一项

特点:1.使用in 提高简洁度

            2.in 列表的值类型必须一致或者兼容。

             3. 列表内部不支持通配符


is null /is not null:用于判断null值,= != 不能判断null 值。is 和null 搭配不能配其他数

is null  PK  <=>(安全等于)
            普通类型的数值    null值        可读性
is null        ×            √        √
<=>        √            √        ×
 

3.3.2 举例

 查询员工名总包含字符a的员工信息(% 是通配符表示任意字符出现任意次)

mysql -速成_第32张图片

 查询员工名中第三个字符为n,第5 个字符为l的员工名和工资。

mysql -速成_第33张图片

 查询员工名中第二个字符为_的员工名

mysql -速成_第34张图片

查詢員工编号在100 到120 之间的员工信息。

mysql -速成_第35张图片

 查询员工的工种编号为IT_PROG,AD_VP,AD_PRES 中的一个的员工 名和工种编号

mysql -速成_第36张图片

查询没有奖金的员工名和奖金率

mysql -速成_第37张图片

 mysql -速成_第38张图片

 mysql -速成_第39张图片

 3.4 排序查询

3.4.1 语法

        一、语法
select 查询列表
from 表
where 筛选条件
order by 排序列表 【asc|desc】
 

3.4.2 举例

查询员工信息,要求工资从高到低进行排序

mysql -速成_第40张图片

 从低到高

mysql -速成_第41张图片

 排序+ 筛选:查询部门编号>=90,要求按入职时间先后进行排序

mysql -速成_第42张图片

 按年薪的高低显示员工的信息和年薪【按表达式排序】

mysql -速成_第43张图片

 按姓名的长度显示员工的姓名和工资[按函数排序]

mysql -速成_第44张图片

 查询员工信息,按工资排序,按员工编号排序【多个字段进行排序】

mysql -速成_第45张图片

 3.5常见函数

3.5.1 语法

功能:类似于java中的方法
好处:提高重用性和隐藏实现细节
调用:select 函数名(实参列表) 【from 表】;

特点:函数名?

          功能?

二、单行函数(做统计使用的,有成为统计函数,聚和函数)
1、字符函数
concat:连接
substr:截取子串
upper:变大写
lower:变小写
replace:替换
length:获取字节长度
trim:去前后空格
lpad:左填充
rpad:右填充
instr:获取子串第一次出现的索引
2、数学函数
ceil:向上取整
round:四舍五入
mod:取模
floor:向下取整
truncate:截断
rand:获取随机数,返回0-1之间的小数

3、日期函数

now:返回当前日期+时间
year:返回年
month:返回月
day:返回日
date_format:将日期转换成字符
curdate:返回当前日期
str_to_date:将字符转换成日期
curtime:返回当前时间
hour:小时
minute:分钟
second:秒
datediff:返回两个日期相差的天数
monthname:以英文形式返回月


4、其他函数
version 当前数据库服务器的版本
database 当前打开的数据库
user当前用户
password('字符'):返回该字符的密码形式
md5('字符'):返回该字符的md5加密形式

5、流程控制函数

①if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2
②case情况1
case 变量或表达式或字段
when 常量1 then 值1
when 常量2 then 值2
...
else 值n
end

③case情况2
case 
when 条件1 then 值1
when 条件2 then 值2
...
else 值n
end

三、分组函数
1、分类
max 最大值
min 最小值
sum 和
avg 平均值
count 计算个数

2、特点

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

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

③以上分组函数都忽略null
④都可以搭配distinct使用,实现去重的统计
select sum(distinct 字段) from 表;
⑤count函数
count(字段):统计该字段非空值的个数
count(*):统计结果集的行数
案例:查询每个部门的员工个数
1 xx    10
2 dd    20
3 mm    20
4 aa    40
5 hh    40

count(1):统计结果集的行数

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

⑥ 和分组函数一同查询的字段,要求是group by后出现的字段

3.5.2 举例

3.5.2.1 单行函数

        length() 函数

mysql -速成_第46张图片

 mysql -速成_第47张图片

 mysql -速成_第48张图片

 concat() 函数

        mysql -速成_第49张图片

 upper() ,lower() 函数

mysql -速成_第50张图片

 让姓大写,名小写进行拼接。

mysql -速成_第51张图片

 substr() ,substring() 

mysql -速成_第52张图片

 mysql -速成_第53张图片

 案例:

单一函数:

      upper() lower()  姓名中首字母大写,其他字符小写,然后用_拼接,显示出来

mysql -速成_第54张图片

 instr() 函数获取子字符串第一次出现的时候所出现的索引。找不到返回0

mysql -速成_第55张图片

 trim() 去前后空格

        

 mysql -速成_第56张图片

 lpad () 函数:左填充指定长度 的字符使得总长度是是你填入的值

mysql -速成_第57张图片

mysql -速成_第58张图片

 rpad() 右填充

mysql -速成_第59张图片

replace() 替换函数

mysql -速成_第60张图片

 mysql -速成_第61张图片

3.5.2.2 数学函数

round()四舍五入

 可以先算绝对值,再加符号 

mysql -速成_第62张图片mysql -速成_第63张图片

 ceil() 向上取整 返回大于等于该参数的最小整数

mysql -速成_第64张图片

 floor() 向下取整,返回小于等于该参数的最大整数。

mysql -速成_第65张图片

 truncate() 截断

mysql -速成_第66张图片

mod() 取余

 看被除数来决定余数的正负mysql -速成_第67张图片

 mysql -速成_第68张图片

  3.5.2.3 日期函数

now()  返回日期加时间

mysql -速成_第69张图片

 curdate() 只有日期没有时间mysql -速成_第70张图片

 mysql -速成_第71张图片

mysql -速成_第72张图片

日期格式化

mysql -速成_第73张图片

mysql -速成_第74张图片

查询入职日期是1992-4-3 的员工信息 

mysql -速成_第75张图片

date_format 将日期转换成字符

 mysql -速成_第76张图片

 查询有奖金的员工名和入职日期(xx月/xx日/xx年)

mysql -速成_第77张图片

3.5.2.4 其他函数

mysql -速成_第78张图片

3.5.2.5 流程控制函数

if :if else 函数

        mysql -速成_第79张图片

 

  case函数: switch case 效果

        case 要判断的字段或者表达式

                 when 常量1 then 要显示的值1或语句1;

                 when 常量2 then 要显示的值2或语句2;

                .....

                else 要显示的值n或者语句n

        end;

/查询员工的工资,要求

部门号为30 ,显示的工资位工资的1.1倍

                40,           1.2倍

                50, 1.3 

       其他原工资

/

mysql -速成_第80张图片

 case 使用2 

case 

        when 条件1 then 要执行的值1或者语句

        when 条件2 then 要执行的值2或者语句

         ....

        else 要显示 的值n

  end

查询员工的工资

如果大于20000 显示A

                15000 ,B

                10000,C

                其他,D

mysql -速成_第81张图片

 3.5.2.6 分组函数

又称为统计函数或者组函数 sum ,avg,max 最大值,min 最小值 ,count() 计算个数简单的使用

 sum()

mysql -速成_第82张图片

mysql -速成_第83张图片

 mysql -速成_第84张图片

 mysql -速成_第85张图片

 mysql -速成_第86张图片

 参数支持哪里类型

特点

1.sum ,avg 一般用于处理数据类型

max,min,count 可以处理任何类型

2.所有分组函数都忽略null 值(直接逃过null 的数据,不参加计算)

mysql -速成_第87张图片

 3 可以和distinct 搭配

mysql -速成_第88张图片

 mysql -速成_第89张图片

4.count() 函数的 研究

count() 详细介绍

mysql -速成_第90张图片

 效率的问题

效率:INNODEB myisam  count(*)和count(1) 差不多 ,比count(字段)高

        MYISAM ,count(*) 高

5.和分组函数一同查询的字段有限制

和分组函数一同查询的字段的要求是group by 后的字段,其他的都不行。

3.6 分组查询

3.6.1语法:

select 分组函数,分组后的字段
from 表
【where 筛选条件】
group by 分组的字段
【having 分组后的筛选】
【order by 排序列表】
二、特点

            使用关键字        筛选的表    位置
分组前筛选    where            原始表        group by的前面
分组后筛选    having        分组后的结果    group by 的后面

3.6.2 举例

查询每一个工种的最高工资

mysql -速成_第91张图片

 查询每个位置上的部门个数

mysql -速成_第92张图片

 添加筛选条件分组钱

案例:查询邮箱中包含a 字符的每个部门的平均工资

mysql -速成_第93张图片

 查询有奖金每个领导手下的员工的最高工资

mysql -速成_第94张图片

#添加复杂筛选条件

添加筛选,分组后

查询员工个数大于2 的部门

mysql -速成_第95张图片

查询每个工种有奖金的员工的最高工资大于12000的工种编号和最高工资

 mysql -速成_第96张图片

 查询领导编号大于102 的每个领导手下的最低工资大于5000 的领导编号,以及其最低工资

mysql -速成_第97张图片

总结:分组查询筛选条件分为两类,分组前筛选,分组后筛选

分组前:  数据源 原始表 位置 where +group by 前面 关键字 where

分组后: 数据源分组后的结果 having +group by 后面 关键字 having 

分组函数做条件,肯定放在having自句中:

能用分组前就用分组前的筛选。

#按表达式或者函数分组

案例:按员工姓名的长度分组,查询每一组员工的个数,筛选员工个数大于5 的有哪些

mysql -速成_第98张图片

 #按多个字段分组

查询每个部门每个工种的员工的 平均工资

mysql -速成_第99张图片

 #分组排序添加排序

 查询每个部门每个工种的员工的 平均工资,并且按照平均工资的高低进行排序

mysql -速成_第100张图片

多层级筛选

mysql -速成_第101张图片

       group by 支持单个字段分组,多个字段用,隔开,没有顺序,也可以用表达式

也可以添加排序,添加到最后。

3.7 连接查询

又称为多表查询,当查询的字段来自多个表时候,会用到多表查询。

3.7.1 语法

一、含义
当查询中涉及到了多个表的字段,需要使用多表连接
select 字段1,字段2
from 表1,表2,...;

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


二、分类

按年代分类:
    sql92:
        等值
        非等值
        自连接

        也支持一部分外连接(用于oracle、sqlserver,mysql不支持)
    sql99【推荐使用】
        内连接
            等值
            非等值
            自连接
        外连接
            左外
            右外
            全外(mysql不支持)
        交叉连接
            


三、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 排序字段】


四、SQL99语法
1、内连接
语法:
select 查询列表
from 表1 别名
【inner】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;

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

分类:
等值连接
非等值连接
自连接


2、外连接
语法:
select 查询列表
from 表1 别名
left|right|full【outer】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;
特点:
①查询的结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
②left join 左边的就是主表,right join 右边的就是主表
  full join 两边都是主表
③一般用于查询除了交集部分的剩余的不匹配的行

3、交叉连接

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

特点:
类似于笛卡尔乘积


 

3.7.2 举例

mysql -速成_第102张图片

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

mysql -速成_第103张图片

 正确写法:

mysql -速成_第104张图片

分类:

年代分类

 sql92 标准 :仅支持内联

sql99 标准 :所有内连加外联加交叉

功能分类:

        内连接 

                        等值

                        非等值

                        自连接

        外连接

                        左外连接

                        右外连接

                        全外连接

        交叉链接

3.7.2.1 sql 92 标准

     查询女神名和男神名   

mysql -速成_第105张图片

 查询员工名和对应的部门名

mysql -速成_第106张图片

 查询工种号,工种名,工种名

mysql -速成_第107张图片

 查询城市中第二个字符为‘o’的对应的部门名和城市名(添加筛选)

mysql -速成_第108张图片

 添加分组

查询每个城市的部门个数

mysql -速成_第109张图片

#案例2 查询出有奖金的 每个部门名和部门的领导编号以及该部门的最低工资

mysql -速成_第110张图片

添加排序

        每个工种的工种名和员工的个数并且按照员工个数进行降序排序

mysql -速成_第111张图片

实现三表连接

查询员工名,部门名和所在的城市

mysql -速成_第112张图片

sql 92 标准

多表等值连接,为多表的交集部分

n表连接,至少n-1 链接条件

多表顺序没有要求,建议对表起别名

可以搭配所有句子使用

2.非等值连接

 案例1:查询员工的工资和工资级别

mysql -速成_第113张图片

 mysql -速成_第114张图片

#自连接

查询员工名和上级的名称

mysql -速成_第115张图片

3.7.2.2 sql 99 标准

内联,左外,右外,全外。

select 查询列表 from table1 表1 别名 【连接类型】 join 表2  别名 on 连接条件 where 筛选条件 【group by】 [having] [order by]

内联 inner 

左 left [outer]

 右 right[outer]

全 full

交叉 cross join

1 内连接

查询员工名,部门名

mysql -速成_第116张图片

 查询名字中包含e的员工名和工种名(添加筛选)

        mysql -速成_第117张图片

      查询部门个数>3 的城市名和部门个数,(添加分组和筛选)

mysql -速成_第118张图片

 查询哪个部分的员工个数大于3的部门名和员工个数,并按照个数进行排序(添加排序)

mysql -速成_第119张图片

 查询员工名,部门名,工种名,并按部门名降序。

mysql -速成_第120张图片

# 非等值连接

查询员工的工资级别

mysql -速成_第121张图片

查询每个工资级别的个数>20的个数,并且按工资界别降序

mysql -速成_第122张图片

mysql -速成_第123张图片

 mysql -速成_第124张图片

 #自连接

查询员工的名字和上级的名字

mysql -速成_第125张图片

 mysql -速成_第126张图片

# 二外连接 

一般外连接用于查询一个表中有,另一个表没有。需要分主从表

特点:

        查询结果为主表的中的所有记录,如果从表有匹配的,则显示匹配 的值

        如果没有匹配的则显示null

        外连接的的结果=内连接结果+主表中有而从表中没有的记录

左外中left  join左侧是主表

右外 right join右侧是主表

左右外,交换两个表可以实现同样的效果。

查询男朋友 不在男神表的女神名

查询男朋友不在男神表的女神名。(最好选择从表主键列)

mysql -速成_第127张图片

        mysql -速成_第128张图片

 mysql -速成_第129张图片

 右外连接

mysql -速成_第130张图片

 案例:

查询哪个部门没有员工

mysql -速成_第131张图片

 # 全外连接

全外连接=内连接+表1有表2 没有,表2有但是表1没有的

#交叉连接

        笛卡尔乘积

mysql -速成_第132张图片

 3.8 子查询

3.8.1 语法

一、含义
嵌套在其他语句内部的select语句称为子查询或内查询,
外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多
外面如果为select语句,则此语句称为外查询或主查询

二、分类
1、按出现位置
select后面:
        仅仅支持标量子查询
from后面:
        表子查询
where或having后面:
        标量子查询  单行子查询
        列子查询  多行子查询
        行子查询  多行多列子查询
exists后面:
        标量子查询(只有一个结果)
        列子查询
        行子查询
        表子查询

2、按结果集的行列
标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
表子查询:结果集为多行多列


三、示例
where或having后面
1、标量子查询
案例:查询最低工资的员工姓名和工资
①最低工资
select min(salary) from employees

②查询员工的姓名和工资,要求工资=①
select last_name,salary
from employees
where salary=(
    select min(salary) from employees
);

2、列子查询
案例:查询所有是领导的员工姓名
①查询所有员工的 manager_id
select manager_id
from employees

②查询姓名,employee_id属于①列表的一个
select last_name
from employees
where employee_id in(
    select manager_id
    from employees
);

3.8.2 举例 

案例:#单行子查询

谁的工资比Abel 高

mysql -速成_第133张图片

 返回job_id 与141号员工相同,salary 比143号员工多的员工的姓名,job_id 和工资

mysql -速成_第134张图片

 返回公司工资最少的last_name,job_id,和salary

mysql -速成_第135张图片

 题目:查询最低工资大于50号部门最低工资的部门id和其最低工资

mysql -速成_第136张图片

#多行子查询

 返回location_id是1400或1700的部门中的所有员工姓名

mysql -速成_第137张图片

 #案例2:返回其它工种中比job_id为'IT_PROG'部门任一工资低的员工的员工号、姓名、job_id以及salary

mysql -速成_第138张图片

 mysql -速成_第139张图片

返回其它部门中比job_id为'IT_PROG'部门所有工资都低的员工的员工号、姓名、job_id以及salary
mysql -速成_第140张图片

 #行子查询(一行多列,或者多行多列)

查询员工编号最小并且工资最高的员工信息

mysql -速成_第141张图片

 mysql -速成_第142张图片

 #放在select 后面的(里面只支持一行一列)

查询每个部门的员工个数

mysql -速成_第143张图片

 查询员工号=1贴2的部门名

mysql -速成_第144张图片

 #放到from 后面 将子查询的结果充当一张表,必须起别名

#案例:查询每个部门的平均工资的工资等级
 

 mysql -速成_第145张图片

 exists 后面(相关子查询)

mysql -速成_第146张图片

#案例1:查询有员工的部门名
mysql -速成_第147张图片

 mysql -速成_第148张图片

 3.9 分页查询

3.9.1 语法

一、应用场景
当要查询的条目数太多,一页显示不全
二、语法

select 查询列表
from 表
limit 【offset,】size;
注意:
offset代表的是起始的条目索引,默认从0卡死
size代表的是显示的条目数

公式:
假如要显示的页数为page,每一页条目数为size
select 查询列表
from 表
limit (page-1)*size,size;
 

3.9.2 举例

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

offset要显示条目的起始索引(起始索引从0开始)

size要显示的条目个数
 

#查询前五条员工信息

mysql -速成_第149张图片

 #查询第11条道25条

mysql -速成_第150张图片

#案例3:有奖金的员工信息,并且工资较高的前10名显示出来
 

mysql -速成_第151张图片

 3.10 联合查询

3.10.1 语法

一、含义
union:合并、联合,将多次查询结果合并成一个结果

多表没有关系的首先考虑
二、语法
查询语句1
union 【all】
查询语句2
union 【all】
...

三、意义
1、将一条比较复杂的查询语句拆分成多条语句
2、适用于查询多个表的时候,查询的列基本是一致

四、特点
1、要求多条查询语句的查询列数必须一致
2、要求多条查询语句的查询的各列类型、顺序最好一致
3、union 去重,union all包含重复项
 

 #引入的案例:查询部门编号>90或邮箱包含a的员工信息()

mysql -速成_第152张图片

 语法:
查询语句1

union
查询语句2

union

应用场景:
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时

4 DML 语言

4.1 插入

4.1.1 语法

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

二、方式二
语法:
insert into 表名 set 字段=值,字段=值,...;
两种方式 的区别:
1.方式一支持一次插入多行,语法如下:
insert into 表名【(字段名,..)】 values(值,..),(值,...),...;
2.方式一支持子查询,语法如下:
insert into 表名
查询语句;

4.1.2 举例 

#——、插入语句/*
语法:
insert into表名(列名,...) values(值1,... ) ;
L出 /
 

#插入方式1

mysql -速成_第153张图片

mysql -速成_第154张图片

 #插入方式2

 mysql -速成_第155张图片

 #两种方式的对比

mysql -速成_第156张图片

 4.2 修改

4.2.1 语法

        

一、修改单表的记录 ★
语法:update 表名 set 字段=值,字段=值 【where 筛选条件】;

二、修改多表的记录【补充】
语法:
update 表1 别名 
left|right|inner join 表2 别名 
on 连接条件  
set 字段=值,字段=值 
【where 筛选条件】;

4.2.2 举例

#修改单表的例

#案例1:修改beauty表中姓唐的女神的电话为13899888899

mysql -速成_第157张图片

 #案例2:修改boys表中id好为2的名称为樊华,魅力值10

mysql -速成_第158张图片

 #多表修改

mysql -速成_第159张图片

案例:案例1:修改张无忌的女朋友的手机号为114

mysql -速成_第160张图片

 #案例2:修改没有男朋友的女神的男朋友编号都为2号
 

mysql -速成_第161张图片

 4.3 删除

4.3.1 语法

方式一: delete语法:
1、单表的删除【★】
delete from表名where筛选条件2、多表的删除【补充】
方式二:truncate
i语法:truncate table表名;I
 

4.3.2 举例

#方式一,delete

#案例1:删除手机号以9结尾的女神信息

#多表的的删除

 sql92错法:
delete表1的别名,表2的别名from表1别名,表2别名
where连接条件
and筛选条件;
sql99语法:
delete表1的别名,表2的别名from表1别名
inner l leftlright join表2别名on连接条件where筛选条件l

 #案例:删除张无忌的女朋友的信息

 #案例:册删除黄晓明的信息以及他女朋友的信息

 将魅力值>100的男神信息册除--只能全部删除

 - 

两种删除的区别

mysql -速成_第162张图片

 

 

5 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 exists】 表名;

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

=================================

一、数值型
1、整型
tinyint、smallint、mediumint、int/integer、bigint
1         2        3          4            8

特点:
①都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号
②如果超出了范围,会报out or range异常,插入临界值
③长度可以不指定,默认会有一个长度
长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号整型


2、浮点型
定点数:decimal(M,D)
浮点数:
    float(M,D)   4
    double(M,D)  8

特点:
①M代表整数部位+小数部位的个数,D代表小数部位
②如果超出范围,则报out or range异常,并且插入临界值
③M和D都可以省略,但对于定点数,M默认为10,D默认为0
④如果精度要求较高,则优先考虑使用定点数

二、字符型
char、varchar、binary、varbinary、enum、set、text、blob

char:固定长度的字符,写法为char(M),最大长度不能超过M,其中M可以省略,默认为1
varchar:可变长度的字符,写法为varchar(M),最大长度不能超过M,其中M不可以省略

三、日期型
year年
date日期
time时间
datetime 日期+时间          8      
timestamp 日期+时间         4   比较容易受时区、语法模式、版本的影响,更能反映当前时区的真实时间

===============================================

一、常见的约束
NOT NULL:非空,该字段的值必填
UNIQUE:唯一,该字段的值不可重复
DEFAULT:默认,该字段的值不用手动插入有默认值
CHECK:检查,mysql不支持
PRIMARY KEY:主键,该字段的值不可重复并且非空  unique+not null
FOREIGN KEY:外键,该字段的值引用了另外的表的字段

主键和唯一
1、区别:
①、一个表至多有一个主键,但可以有多个唯一
②、主键不允许为空,唯一可以为空
2、相同点
都具有唯一性
都支持组合键,但不推荐
外键:
1、用于限制两个表的关系,从表的字段值引用了主表的某字段值
2、外键列和主表的被引用列要求类型一致,意义一样,名称无要求
3、主表的被引用列要求是一个key(一般就是主键)
4、插入数据,先插入主表
删除数据,先删除从表
可以通过以下两种方式来删除主表的记录
#方式一:级联删除
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;

#方式二:级联置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;

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

)
注意:
            支持类型        可以起约束名            
列级约束        除了外键        不可以
表级约束        除了非空和默认    可以,但对主键无效

列级约束可以在一个字段上追加多个,中间用空格隔开,没有顺序要求

三、修改表时添加或删除约束
1、非空
添加非空
alter table 表名 modify column 字段名 字段类型 not null;
删除非空
alter table 表名 modify column 字段名 字段类型 ;

2、默认
添加默认
alter table 表名 modify column 字段名 字段类型 default 值;
删除默认
alter table 表名 modify column 字段名 字段类型 ;
3、主键
添加主键
alter table 表名 add【 constraint 约束名】 primary key(字段名);
删除主键
alter table 表名 drop primary key;

4、唯一
添加唯一
alter table 表名 add【 constraint 约束名】 unique(字段名);
删除唯一
alter table 表名 drop index 索引名;
5、外键
添加外键
alter table 表名 add【 constraint 约束名】 foreign key(字段名) references 主表(被引用列);
删除外键
alter table 表名 drop foreign key 约束名;


四、自增长列
特点:
1、不用手动插入值,可以自动提供序列值,默认从1开始,步长为1
auto_increment_increment
如果要更改起始值:手动插入值
如果要更改步长:更改系统变量
set auto_increment_increment=值;
2、一个表至多有一个自增长列
3、自增长列只能支持数值型
4、自增长列必须为一个key

一、创建表时设置自增长列
create table 表(
    字段名 字段类型 约束 auto_increment
)
二、修改表时设置自增长列
alter table 表 modify column 字段名 字段类型 约束 auto_increment
三、删除自增长列
alter table 表 modify column 字段名 字段类型 约束 


 

5.1 库的管理

        mysql -速成_第163张图片

存储位置

mysql -速成_第164张图片

 进一步

mysql -速成_第165张图片

 更改库的名字不安全,取消了

可以更改库的字符集 

删除库

mysql -速成_第166张图片

5.2 表的管理

create table 表名(
列名列的类型【(长度)约束】列名列的类型【(长度)约束】列名列的类型【(长度)约束】,.--
列名列的类型【(长度)约束】
 

 创建表mysql -速成_第167张图片

 mysql -速成_第168张图片

 表的修改

#2.表的修改
#1修改列名
#2修改列的类型或约束

#3添加新列
#4删除列#

#5修改表名
 

1表名的修改

mysql -速成_第169张图片

 2修改列的类型或约束

mysql -速成_第170张图片

3添加新列

mysql -速成_第171张图片

4 删除列#mysql -速成_第172张图片

 5修改表名mysql -速成_第173张图片

#表的删除

mysql -速成_第174张图片

 通用写法

DROP DATABASEIFEX工STs 旧库名

;CREATE DATABASE新库名;
DROPTABLE工F EX工STS 旧表名

;CREATETABLE表名()
 

#表的复制

#只复制结构不复制内容

mysql -速成_第175张图片

 #结构加内容

mysql -速成_第176张图片

 #只复制部分

mysql -速成_第177张图片

 
#只复制两个列的结果,没有数据

 5.3 常见的数据类型

数值型:
整型小数:
定点数浮点数
字符型:
较短的文本: char. varchar
较长的文本: text、blob(较长的二进制数据>
日期型:
 

5.3.1 整型 

mysql -速成_第178张图片

 ##1.如何设置无符号和有符号

mysql -速成_第179张图片

 #无符号

mysql -速成_第180张图片

 mysql -速成_第181张图片

5.3.2 浮点型mysql -速成_第182张图片

 mysql -速成_第183张图片

 mysql -速成_第184张图片

 mysql -速成_第185张图片

mysql -速成_第186张图片

 5.2.4 字符型

char 固定长度,varchar 是可变长度

mysql -速成_第187张图片

 mysql -速成_第188张图片

enum

mysql -速成_第189张图片

mysql -速成_第190张图片

set

mysql -速成_第191张图片

mysql -速成_第192张图片

 5.2.5 日期型

mysql -速成_第193张图片

 mysql -速成_第194张图片

 #设置时区

mysql -速成_第195张图片

mysql -速成_第196张图片

 总结

 mysql -速成_第197张图片

 5.4 常见约束

一、常见的约束
NOT NULL:非空,该字段的值必填
UNIQUE:唯一,该字段的值不可重复
DEFAULT:默认,该字段的值不用手动插入有默认值
CHECK:检查,mysql不支持
PRIMARY KEY:主键,该字段的值不可重复并且非空  unique+not null
FOREIGN KEY:外键,该字段的值引用了另外的表的字段

主键和唯一
1、区别:
①、一个表至多有一个主键,但可以有多个唯一
②、主键不允许为空,唯一可以为空
2、相同点
都具有唯一性
都支持组合键,但不推荐
外键:
1、用于限制两个表的关系,从表的字段值引用了主表的某字段值
2、外键列和主表的被引用列要求类型一致,意义一样,名称无要求
3、主表的被引用列要求是一个key(一般就是主键)
4、插入数据,先插入主表
删除数据,先删除从表
可以通过以下两种方式来删除主表的记录
#方式一:级联删除
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;

#方式二:级联置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;

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

)
注意:
            支持类型        可以起约束名            
列级约束        除了外键        不可以
表级约束        除了非空和默认    可以,但对主键无效

列级约束可以在一个字段上追加多个,中间用空格隔开,没有顺序要求

三、修改表时添加或删除约束
1、非空
添加非空
alter table 表名 modify column 字段名 字段类型 not null;
删除非空
alter table 表名 modify column 字段名 字段类型 ;

2、默认
添加默认
alter table 表名 modify column 字段名 字段类型 default 值;
删除默认
alter table 表名 modify column 字段名 字段类型 ;
3、主键
添加主键
alter table 表名 add【 constraint 约束名】 primary key(字段名);
删除主键
alter table 表名 drop primary key;

4、唯一
添加唯一
alter table 表名 add【 constraint 约束名】 unique(字段名);
删除唯一
alter table 表名 drop index 索引名;
5、外键
添加外键
alter table 表名 add【 constraint 约束名】 foreign key(字段名) references 主表(被引用列);
删除外键
alter table 表名 drop foreign key 约束名;


四、自增长列
特点:
1、不用手动插入值,可以自动提供序列值,默认从1开始,步长为1
auto_increment_increment
如果要更改起始值:手动插入值
如果要更改步长:更改系统变量
set auto_increment_increment=值;
2、一个表至多有一个自增长列
3、自增长列只能支持数值型
4、自增长列必须为一个key

一、创建表时设置自增长列
create table 表(
    字段名 字段类型 约束 auto_increment
)
二、修改表时设置自增长列
alter table 表 modify column 字段名 字段类型 约束 auto_increment
三、删除自增长列
alter table 表 modify column 字段名 字段类型 约束 


 

 #创建表时候添加约束

1添加列级约束

mysql -速成_第198张图片

 mysql -速成_第199张图片

#查看stuinfo表中所有的索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo;

总结 

 2.添加表级约束

mysql -速成_第200张图片

mysql -速成_第201张图片

mysql -速成_第202张图片

 主键和唯一的对比mysql -速成_第203张图片

 #外键

mysql -速成_第204张图片

# 修改表的时候添加约束

mysql -速成_第205张图片

 mysql -速成_第206张图片

 mysql -速成_第207张图片

mysql -速成_第208张图片

总结

mysql -速成_第209张图片

 #修改表的时候删除约束

mysql -速成_第210张图片

5.5 标识列 

        mysql -速成_第211张图片

mysql -速成_第212张图片

mysql -速成_第213张图片

 #修改表的时候设置标识列

 mysql -速成_第214张图片

 6 mysql 事务(TCL)

6.1 事务以及相关概念

一、含义
事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行
二、特点(ACID)
A 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
C 一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态
I 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离的
D 持久性:一个事务一旦提交了,则永久的持久化到本地

三、事务的使用步骤 ★
了解:
隐式(自动)事务:没有明显的开启和结束,本身就是一条事务可以自动提交,比如insert、update、delete
显式事务:具有明显的开启和结束

使用显式事务:
①开启事务
set autocommit=0;
start transaction;#可以省略

②编写一组逻辑sql语句
注意:sql语句支持的是insert、update、delete

设置回滚点:
savepoint 回滚点名;

③结束事务
提交:commit;
回滚:rollback;
回滚到指定的地方:rollback to 回滚点名;
四、并发事务
1、事务的并发问题是如何发生的?
多个事务 同时 操作 同一个数据库的相同数据时
2、并发问题都有哪些?
脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据
不可重复读:一个事务多次读取,结果不一样
幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是 其他事务“插入”的数据
3、如何解决并发问题
通过设置隔离级别来解决并发问题
4、隔离级别
                    脏读        不可重复读        幻读
read uncommitted:读未提交     ×                ×              ×        
read committed:读已提交      √                ×              ×
repeatable read:可重复读     √                √              ×
serializable:串行化          √                √              √

事务

mysql -速成_第215张图片

 

mysql -速成_第216张图片

mysql -速成_第217张图片 

 #事务的创建

隐式事务:事务没有明显的开启和结束的标记
比如insert、update、 delete语句

显式事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
 

步骤1:开启事务
set autocommit=0;
start transaction; 可选的
步骤2:编写事务中的sq1语句(select insert update delete)
语句1;
语句2;
步骤3:结束事务
commit;提交事务
rollback;回滚事务
 

mysql -速成_第218张图片

 

mysql -速成_第219张图片

 

mysql -速成_第220张图片

 

6.2 事务的演示

       会开一个专题做一个演示(插入图片太多,写的时候太卡了这个博客)

7视图

7.1语法

一、含义
mysql5.1版本出现的新特性,本身是一个虚拟表,它的数据来自于表,通过执行时动态生成。
好处:
1、简化sql语句
2、提高了sql的重用性
3、保护基表的数据,提高了安全性
二、创建
create view 视图名
as
查询语句;


三、修改
方式一:
create or replace view 视图名
as
查询语句;
方式二:
alter view 视图名
as
查询语句

四、删除
drop view 视图1,视图2,...;
五、查看
desc 视图名;
show create view 视图名;
六、使用
1.插入
insert
2.修改
update
3.删除
delete
4.查看
select
注意:视图一般用于查询的,而不是更新的,所以具备以下特点的视图都不允许更新
①包含分组函数、group by、distinct、having、union、
②join
③常量视图
④where后的子查询用到了from中的表
⑤用到了不可更新的视图


七、视图和表的对比
        关键字        是否占用物理空间            使用
视图    view        占用较小,只保存sql逻辑        一般用于查询
表        table        保存实际的数据            增删改查


 

7.2 举例

 

mysql -速成_第221张图片

 

创建

mysql -速成_第222张图片 

 修改和查看

mysql -速成_第223张图片

 

视图和表的对比 

mysql -速成_第224张图片

你可能感兴趣的:(mysql,数据库)