MySQL-基础总结

一、数据库的相关概念

(一)数据库的好处

1.持久化数据到本地
2.可以实现结构化查询,方便管理

(二)数据库相关概念

1、DB:数据库,保存一组有组织的数据的容器
2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据
3、SQL:结构化查询语言,用于和DBMS通信的语言

(三)数据库存储数据的特点

1、将数据放到表中,表再放到库中
2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。
3、表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。
4、表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性”
5、表中的数据是按行存储的,每一行类似于java中的“对象”。

二、MySQL的介绍

(一)MySQL的优点

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

(二)MySQL的安装

属于c/s架构的软件,一般来件安装服务端
有社区版和企业版

(三)MySQL服务的启动和停止

方式一:计算机——右击——管理——服务
方式二:通过管理员身份运行
net start 服务名(启动服务)
net stop 服务名(停止服务)

(四)MySQL服务的登录和退出

方式一:通过mysql自带的客户端
只限于root用户

方式二:通过windows自带的客户端
登录:
mysql 【-h主机名 -P端口号 】-u用户名 -p密码

退出:
exit或ctrl+C

三、DQL语言

(一)基础查询

语法

select 查询列表
from 表名

特点

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

实例

1、查询单个字段
select 字段名 from 表名;
2、查询多个字段
select 字段名,字段名 from 表名;
3、查询所有字段
select * from 表名;
4、查询常量
select 常量值;
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
5、查询函数
select 函数名(实参列表);
6、查询表达式
select 100/1234;
7、起别名
(1)as
(2)空格
8、去重
select distinct 字段名 from 表名;
9、+
作用:做加法运算
select 数值+数值;直接运算
select 字符+数值;试图将字符型数值转换成数值型,如果转换成功,则继续做加法
select null+值;结果都为null
10、【补充】concat函数
功能:拼接字符
select concat(字符1,字符2,……);
11、【补充】ifnull函数
功能:判断某字段或表达式是否为null,如果为null返回指定的值,否则返回原来的值
select ifnull(commission_pct,0) from employees;
12、【补充】isnull函数
功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0

(二)条件查询

语法

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

筛选条件的分类

1、简单条件运算符
>   <   =   <>   !=   >=   <=   <=>(安全等于)
2、逻辑运算符
&&  and
||  not
!   not
3、模糊查询
like :一般搭配通配符使用,用于判断字符型数值
between and
in
is null / is not null

(三)排序查询

语法

select 查询列表
from 表名
where 筛选条件
order by 排序列表;

特点

1、asc : 升序,如果默认写默认升序
   desc: 降序
2、排序列表 支持 单个字段、多个字段、函数表达式、别名
3、order by的位置一般在查询语句最后(除limit语句之外)

(四)常见函数

概述

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

单行函数

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、流程控制函数
(1)if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2
(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、特点
(1)select max(字段) from 表名;
(2)支持的类型:
      sum和avg一般用于处理数值型
      max、min、count可以处理任何数据类型
(3)以上分组函数都忽略null
(4)都可以搭配distinct使用,实现去重的统计
     select sum(distinct 字段) from 表;
(5)count函数
     count(字段):统计该字段非空值的个数
     count(*):   统计结果集的行数
     count(1):统计结果集行数
(6)和分组函数一同查询字段,要求是group by 后出现的字段

(五)分组查询

语法

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

特点

类别数据源位置关键字
分组前筛选原始表group by子句前面where
分组后筛选分组后的结果集group by子句后面having

(六)连接查询

含义

当我们查询中涉及到了多个表的字段,需要使用多表连接

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    子句;

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

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

2、外连接

语法:

select   查询列表
from     表1 别名
left/right/full【outer】 表2 别名 on 连接条件
where    筛选条件
group by 分组条件
having   分组后的筛选
order by 排序列表
limit    子句;

特点:
(1)查询的结果=主表中所有的行,从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
(2)左连:左边的是主表,右边的是从表;右连:右边的是主表,左边的是从表;全外连接:两边都可以做主表
(3)一般用于查询除了交集部分的剩余的不匹配的行

3、交叉连接

语法:

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

特点:
类似于笛卡尔乘积

(七)子查询

含义

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

分类

1、按子查询出现的位置:
(1)select后面:仅仅支持标量子查询
(2)from后面:支持表子查询
(3)where或having后面支持标量子查询、列子查询、行子查询(用得较小)
(4)exists后面(相关子查询):支持标量子查询、列子查询、行子查询、表子查询

2、按结果集的行列数不同:
(1)标量子查询(结果集只有一行一列)
(2)列子查询(结果集只有一列多行)
(3)行子查询(结果集有一行多列)
(4)表子查询(结果集一般为多行多列)

示例

where或having后面
1、标量子查询
查询最低工资的员工姓名和工资
(1)查询最低工资

SELECT MIN(saraly) FROM employees;

(2)查询员工的姓名和工资,要求工资=(1)

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

2、列子查询
案例:查询所有领导的员工姓名
(1)查询所有所有员工的manager_id

SELECT manager_id
FROM employees;

(2)查询姓名, employee_id属于(1)列表的一个

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

(八)分页查询

应用场景

当要查询的条目数太多,一页显示不全

语法

select 查询列表
from 表
limit 【offset,】 size;

注意:offset代表的是起始的条目索引,默认从0开始;
      size代表的是显示的条目数

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

(九)联合查询

含义

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

语法

查询语句1 
union 【all】
查询语句2
union 【all】
……

意义

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

特点

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

查询总结

语法:

select 查询列表
from 表1 别名
连接类型 join 表2
on 连接条件
where 筛选
group by 分组列表
limit 起始条目索引,条目数;

四、DML语言

(一)插入

方式一

语法:

insert into 表名(字段名,……) values(值,……)

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

方式二

语法:

insert into 表名 set 字段=值,字段=值,……;

两方式的对比

1、方式一支持一次插入多行
2、方式一支持子查询

(二)修改

修改单表的记录

语法:update 表名 set 字段=值,字段=值【where 筛选条件】

修改多表的记录

语法:
update 表1 别名 left| right| inner| join 表2 别名 on 连接条件 set 字段=值,字段=值【where 筛选条件】

(三)删除

方式一:使用delete
1、删除单表的记录
语法:delete from 表名 【where 筛选条件】
2、级联删除
语法:delete 别名1,别名2 from 表1 inner| left| right| join 表2 别名 on 连接条件 【where 筛选条件】

方式二:使用truncate
语法:truncate table 表名

两种方式的区别【面试题】
1、truncate删除后,如果再插入,标识列从1开始
delete删除后,如果再插入,标识列从断点开始

2、delete可以添加筛选条件,truncate不可以添加筛选条件

3、truncate效率较高

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

复制表

1、复制表的结构

create table 表名 like 旧表;

2、复制表的结构+数据

create table 表名 
select 查询列表 from 旧表 【where 筛选】;

(三)数据类型

数值型

1、整型

整数类型字节范围
Tinyint1有符号:-128~127 , 无符号:0~225
Smallint2有符号:-32768~32767, 无符号:0~65535
Mediumint3有符号:-8388608~8388607, 无符号:0~1677215(反正很大)
INT、integer4反正很大
Bigint8反正很大

特点:
① 都可以设置无符号和有符号,默认为有符号,通过unsigned 设置无符号

② 如果插入的数值超出了整型的范围,会报OUT of range异常,并且插入临界值;

③ 如果不设置长度,会有默认的长度
长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill 使用,并且默认变为无符号整型!

2、小数
分类:

1、浮点型
          FLOAT(M,D) 占4个字节
          DOUBLE(M,D) 占8个字节(精度更高)
2、定点型
          DEC(M,D)
          DECIMAL(M,D)
3、其他
          BINARY和VARBINARY用于保存较短的二进制
          ENUM用于保存枚举
          SET用于保存集合

特点:

M:整数部位+小数部位
D:小数部位
如果超过范围,则插入临界值


M和D都可以省略
如果是DECIMAL,则M默认为10,D默认为0
如果是FLOAT和DOUBLE,则会根据插入的数值的精度来决定精度

③定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用

原则:所选择的类型越简单越好,能保存数值的类型越小越好

字符型

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

字符串类型最多字符数描述及存储需求特点空间的耗费效率
char(M)M(可以省略,默认为1)M为0~255之间的整数固定长度的字符比较耗费
varchar(M)MM为0~65535之间的整数可变长度字符比较节省

日期型

1、date 只保存日期
2、datetime 保存日期+时间
3、timestamp 存日期+时间(时间戳)
4、time 只保存时间
5、year 只保存年

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值