MySQL常见问题

目录

1.数据库的分类

2.SQL语句

3.MySQL常见数据类型以及选择

4.数据库约束

5.数据库关系

6.数据库范式

7.多表查询

8.数据库函数

9.索引

10.触发器


1.数据库的分类

关系型数据库和非关系型数据库:
    关系型数据库:是以表和二维表为组成自己的结构,可以直接使用SQL语句对数据进行操作和管理,但是相对稳定
    非关系型数据库:以特殊的文档结构进行存储,通过SQL没办法进行操作。

2.SQL语句

2.1 DDL
    data defination language 数据库定义语言
    增(create)删(drop)改(alter)查(show)
    alter table 表名 add 列名 数据类型
    alter table 表名 modify 列名 数据名称
    alter table 表名 change 旧字段 新字段 数据类型
    查: show tables 
        show database
        desc 表 查看数据库的表结构
2.2 DML
    data Manage Language 管理数据的语句
    增(insert into)删(delete)改(update)查(seelct)
/*新增单列insert into 表名 values()*/
/*新增多列insert into 表名 (查询结果集) */
/*删除单列delete from 表名 where 条件*/
/*修改单列 update 表名 set 列名 = 修改后的值 where 条件*/
/* 修改多列 update 表名 set 列名1=修改后的值1,列名1=修改后的值1,...列名n=修改后的值n where 条件*/

2.3 DQL 
    data query language 数据库查询语句
    select 列名 from 表名 where 条件 group by ***order by
    1.去重:distinct
    2.模糊查询
    3.in 字句 not in 
    4.为空 is null | is not null
    5.group by 分组查
        select * from user a group by a.name
    6.order by 排序
        select * from goods a order by a.name
2.4 DCL
    data control language 数据库控制语句
    控制数据库、表、字段、用户的访问权限和安全级别。
    grant赋予权限 revoke 
    create user 'lixi'@'%' identified by '123456'; -- 创建一个新用户+密码
    grant all privileges on goods.* to 'lixi'@'%'; -- 赋予该用户googs数据库的所有权限
    show grants for 'lixi'@'%';  -- 查看该用户的所有权限
    revoke delete on goods.* from 'lixi'@'%'; -- 收回该用户的删除权限

3.MySQL常见数据类型以及选择

int:整型
bigint:较大的整型
char:字符型
varchar:字符串型
text:文本类型
BLOB:二进制大对象,是一个可以存储二进制文件的容器,比如一张照片、一个声音文件。


int 和 bigint
    int:22亿左右,存储占4字节;
    bigint:44亿左右,存储占8字节
    在我们设计mysql数据库表时,单表规模一般保持在千万级,不会达到22亿上限。如果要加大预留量,可以把主键改为改为bigint,上限为42亿,这个预留量已经是非常的充足了。
    使用bigint,会占用更大的磁盘和内存空间,由于内存空间有限,无效的占用会导致更多的数据换入换出,增加了IO的压力,不利于数据库的性能。所以如果我们使用自增主键bigint类型,可以用int unsigned类型代替,从而优化数据库的性能。

char 和 varchar 和 text
    char:定长      浪费空间    效率高
    varchar:不定长 节省空间    效率低
    text:不设定长度 不知道存储的最长字长的时候用
    char浪费空间:初始预计字符串再加上一个记录字符串长度的字节
    varchar:实际字符串再加上一个记录字符串长度的字节
    text:跟varchar的区别是text需要2个字节空间记录字段的总字节

    char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。
    varchar可变长度,可以设置最大长度;适合用在长度可变的属性。“居住地址”适合用varchar
    text不设置长度, 当不知道属性的最大长度时,“个人简介”适合用text。

4.数据库约束

【数据名称 数据类型 约束】
非空约束:is not null  
唯一约束:unique
主键约束:primary key
外键约束:
alter table 从表名称     
    add constraint 外键名称 
    foreign key 从表 主键列
    reference 主表(主键列) 

5.数据库关系

1:1:在任意一方添加外键,指向另一个的主键
1:n:在多的一方建立外键指向一的一方
n:n:创建中间表

6.数据库范式

为什么要设置范式:遵从不同的规范要求,设计出六个等级的数据库的规范

7.多表查询

1.隐式内连接 和 显示内连接
隐式内连接 语法更简单,显示内连接 效率更高,两个在查询结果上来说是相同的
2.左外连接 和 右外连接
(1)左外连接:是A与B的交集,然后连接A的所有数据。
(2)右外连接:是A与B的交集,然后连接B的所有数据。
3.in join exists
    在查询的两个表大小相当的情况下,3种查询方式的执行时间通常是:EXISTS <= IN <= JOIN
    如果两个表中一个较小,一个较大,则子查询表大的用exists,子查询表小的用in
        因为:in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询
    IN的好处是逻辑直观简单(通常是独立子查询);缺点是只能判断单字段,并且当NOT IN时效率较低,而且NULL会导致不想要的结果。
    EXISTS的好处是效率高,可以判断单字段和组合字段,并不受NULL的影响;缺点是逻辑稍微复杂(通常是相关子查询)。
    JOIN用在这种场合,往往是吃力不讨好。JOIN的用途是联接两个表,而不是判断一个表的记录是否在另一个表。
        Join在 慢SQL的解决中用到

UNION 和 UNIONALL
相同点:都是对结果集进行并集操作
UNION:不包括重复行,会按照默认规则进行排序
UNION ALL:将所有的结果全部显示出来,不管是不是重复。不进行排序

1)隐式内连接:
select * from goods a,goods_detail b where a.detail_id=b.id
2)显示内连接:
select * from goods a inner join goods_detail b on a.detail_id = b.id
3)左外连接:
select * from goods a left join goods_detail b on a.detail_id=b.id
4)右外连接:
select * from goods_detail b right join goods a on b.id = a.detail_id
5)子查询
- 子查询(内查询)在主查询之前一次执行完成。
- 子查询的结果被主查询(外查询)使用 。
- 将子查询放在比较条件的右侧

8.数据库函数

1.聚集函数:
MAX()、MIN()、AVG()、SUM()、Count(*)
2.字符串函数
字符长度:len(字符串);
将所有字符改成小写:LOWER(字符串);
将所有字符改成大写:UPPER(字符串);
将字符串反转:REVERSE(字符串);
字符拼接:concat(字符串1,字符串2);
截取字符串subString(字符串,开始索引,长度)
3.时间函数
NOW();DateTime();
日期的增加:date_add(日期1,interval 数字 年/月/日)
日期格式化:date_format(日期1,'%Y-%m-%d %T')
String转Date:str_to_date(str,'%Y-%m-%d %T')
日期1-日期:datediff(日期1,日期2)
4.Last_Insert_Id()获取自增主键
要求执行insert语句的connection 必须和 执行last_insert_id()语句的connection 是同一个

9.索引

9.1 分类:

- 按照存储位置:聚集索引和非聚集索引的区别:数据在页中的顺序按照索引顺序
- 按照应用位置:唯一、主键、复合

9.2 什么条件下可以创建索引

- 最经常作为查询的字段
- 与其他表存在关联的字段
- 没有null值的字段
- 满足最左前缀原则的字段

9.3 优缺点

- 优点:大大加快了数据检索速度;创建唯一索引,保证数据库中每一行数据的唯一;加快了表和表之间的连接
- 缺点:索引占物理空间;当对表中的数据进行增加、删除、修改操作的时候,索引也需要动态的维护,降低了数据的维护速度

10.触发器

- 是指事先为某张表绑定一段代码,当表中的某些内容发生改变(增、删、改)的时候,系统会自动触发代码并执行
- 触发器发生错误时,前面用户已经执行成功的操作会被撤销,类似事务的回滚

你可能感兴趣的:(MySQL,数据库,mysql,数据库,sql,容器)