Mysql 2

Mysql数据库:数据库管理系统

  • 下载地址: http://dev.mysql.com/downloads/windows/installer/8.0.html

  • 关系型数据库:

    *概念:建立在关系模型基础上,有多张相互连接的二维表组成的数据库。

    *特点:

    1. 使用表存储数据,格式统一,便于维护

    2. 使用SQL语言操作,标准统一,使用方便。

  • SQL分类:

    DDL 数据定义语言,用来定义数据库对象(数据库,表,字段)

    DML 数据操作语言,用来对数据库表中的数据进行增删改。

    DQL 数据查询语言,用于查询数据库中表的记录

    DCL 数据控制语言,用来创建数据库用户,控制数据库的访问权限。

数据类型

  • 数值类型

类型大小有符号范围(负数)无符号范围(正数)描述
tinyint 1byte -128--127 0-255 小整数值
smallint 2 -32768-32767 0-65535 大整数值
mediumint 3     大整数值
int /intger 4     大整数值
bigint 8     极大整数值
float 4     单精度浮点数值
double 8     双精度浮点数值
cecimal       小数值(精确定点数)
  • 字符串类型

char :定长字符串,性能好 例:性别

varchar :变长字符串 性能较差 例:用户名

  • 日期时间类型

类型格式描述
date YYYY-MM--DD 日期值
time HH:MM:SS 时间值或者持续时间
year YYYY 年份值
datetime YYYY-MM-DD /HH:MM:SS 混合日期和时间值
# DDL 操作数据库 
-- 查询所有数据库
SHOW DATABASES;
-- 查询当前数据库
SELECT DATABASE();
-- 创建数据库
CREATE DATABASE if not EXISTS itcast;
-- 创建数据库并设施默认字符集
CREATE DATABASE itcast default charset utf8mb4;
-- 使用数据库
USE mybatis;
-- 删除数据库
DROP DATABASE itcast;
-- 删除数据库
DROP DATABASE if EXISTS itcast;

# DDL操作表 -查询
-- 查询当前数据库所有表
SHOW tables;
-- 查询表结构
DESC tb_brand;
-- 查询指定表的建表语句
SHOW CREATE TABLE tb_user;

-- 创建表
CREATE table tb_croe(
id int comment '编号',
name VARCHAR(50) COMMENT '名字',
age  int  COMMENT '年龄',
address  VARCHAR(50) COMMENT '地址'
) COMMENT '信息';

-- 设计一张员工表
CREATE TABLE emp (
id int ,
name VARCHAR(10),
gender char(1),
age TINYINT UNSIGNED,
idcard char(18),
entrydate date
);
SHOW TABLEs;
DESC emp;

-- 查询表字段
DESC tb_croe;
-- 查询信息
SHOW CREATE TABLE tb_croe;
-- 删除表
DROP TABLE if exists tb_croe;
-- 设计一张员工表
CREATE TABLE emp (
id int ,
name VARCHAR(10),
gender char(1),
age TINYINT UNSIGNED,
idcard char(18),
entrydate date
);
-- 查所有的表
SHOW TABLEs;
-- 表的字段
DESC emp;


#DDL -表操作-修改
-- 添加字段
ALTER TABLE emp add nickname VARCHAR(20);

-- 修改字段名字和字段类型
ALTER table emp CHANGE newname name varchar(10);

ALTER TABLE emp CHANGE nickname username varchar(30);

-- 删除字段

ALTER TABLE emp DROP username;

-- 修改表名
ALTER TABLE emp rename TO employee;

-- 修改数据类型
alter TABLE emp MODIFY idcard VARCHAR(18);


DESC employee;

-- 删除表
DROP TABLE if EXISTS employee;

-- 删除表并创建表
TRUNCATE table emp;

show create table emp;

 

总结

  1. DDL-数据库操作

    show databases;

    creat database 数据库名;

    use 数据库名;

    select database();

    drop database 数据库名;
  2. DDL--表操作

    show tables;

    create table 表名(字段1 字段类型1,字段2 字段类型2);

    desc 表名;
    -- 查看创建的表的详细数据
    show create table 表名;

    alter table 表名 add/modify/change/drop/rename to...;

    drop table 表名;

DML

DML -添加数据

# DML -添加数据

-- 给指定字段添加数据
INSERT INTO 表名 (字段名1,字段名2,...) VALUES(值1,值2,...);

-- 给全部字段添加数据
INSERT INTO 表名 VALUES(值1,值2,...);

-- 批量添加数据
INSERT INTO 表名 (字段名1,字段名2,...) VALUES(值1,值2,...),(值1,值2,...);

-- 批量给全部字段添加数据
INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...);

-- 注意:
1.插入数据时,指定字段顺序需要与值的顺序是一一对应的。
2.字符串和日期型数据应该包含在引号中。
3.插入的数据大小应该在范围之内

DML-修改数据

UPDATE 表名 SET 字段名1=值1,字段名2=值2,...WHERE 条件;

DML-删除数据

DELETE FROM 表名 WHERE 条件;

DQL

DQL-查询语法

SELECT 
  字段列表

FROM
  表名列表

WHERE
  条件列表

GROUP BY
  分组字段列表

HAVING
  分组后条件列表

ORDER BY
  排序字段列表

LIMIT
    分页参数

 

  • where 与 having区别

    1. 执行时机不同:where是分组之前进行过滤,不满足where条件不参与分组;而having是分组之后对结果进行过滤。

    2. 判断条件不同:where不能对聚合函数进行判断,而having可以。

    3. 注意:

      *执行顺序:where>聚合函数>having

      *分组之后,查询的字段一般为聚合函数和分组字段,查询其它字段没有意义。

DCL

  • DCL-用户管理

    1.查询用户
    use mysql;
    select * from user;

    2.创建用户
    create user '用户名'@'主机名' identified by '密码';

    3.修改用户密码
    alter user '用户名'@'主机名' identified with mysql_native_password BY '新密码';

    4.删除用户
    drop user '用户名'@'主机名';

    函数

     

  • 函数 是指一段可以直接被另一段程序调用的程序或者代码。

字符串函数

函数功能
concat(s1,s2,...sn) 字符串拼接,将s1,s2,...sn拼接成一个字符串
lower(str) 将字符串str全部转为小写
upper(str) 将字符串str全部转为大写
Lpad(str,n,pad) 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度。
Rpad(str,n,pad) 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度。
trim(str) 去掉字符串头部和尾部的空格
substring(str,start,len) 返回从字符串str从start位置起的len长度字符串。
-- 字符串函数
-- concat
SELECT CONCAT('hello','hello2')

-- upper
SELECT UPPER('str');

-- lower
SELECT LOWER('STR');

-- lpad
SELECT LPAD('01',5,'+');

-- rpad 01+++
SELECT RPAD('01',5,'+');

-- trim
SELECT TRIM(' hello mysql');

-- substring 索引从1开始的
SELECT SUBSTRING('hello world',1,5);

-- 练习
UPDATE emp set workno = LPAD(workno,5,'0')

-- 数值函数
-- ceil 向上取整 2
SELECT CEIL(1.8);
-- 2
SELECT CEIL(1.1);

-- 向下取整 1
SELECT FLOOR(1.8);
-- 1
SELECT FLOOR(1.1);

-- 返回x/y 的模 3
SELECT MOD(7,4);

-- 返回0~1内的随机数
SELECT RAND();

-- 求参数x的四舍五入的值,保留y位小数 2.15
SELECT ROUND(2.145,2);

-- 练习: 通过数据库的函数,生成一个六位数的随机数验证码
SELECT RAND()*1000000;
-- 取整
SELECT ROUND(RAND()*1000000,0);-- 012546
-- 填充
SELECT LPAD(ROUND(RAND()*1000000,0),6,'0');

-- 日期函数
-- 返回当前日期
SELECT CURDATE();

-- 返回当前时间
SELECT CURTIME();

-- 返回当前日期和时间
SELECT NOW();

-- 获取指定date的年份
SELECT YEAR(NOW());

-- 获取指定date的月份
SELECT MONTH(NOW());

-- 获取指定date的日期
SELECT DAY(NOW());

-- 返回一个日期/时间值加上一个时间间隔expr后的时间值
SELECT DATE_ADD(NOW(),INTERVAL 70 YEAR);
SELECT DATE_ADD(NOW(),INTERVAL 70 DAY);

-- datediff 时间的差 前面时间减后面时间
SELECT DATEDIFF('2018-6-1','2022-6-22');
SELECT DATEDIFF('2022-6-22','2018-6-1');

-- 练习 :查询所有员工的入职天数,并根据入职天数倒序排
SELECT entrydate from emp;
--
SELECT name ,DATEDIFF(DAY(NOW()),entrydate) as 'entrydate' from emp ORDER BY entrydate DESC;

-- 流程控函数

-- if (value ,t,f) 如果value为true,则返回t,否则f
SELECT IF(true,'hhh','jjj');

-- 如果value不为空,返回value1,否则返回value2
SELECT IFNULL(NULL,'hello');
-- 返回空字符串
SELECT IFNULL('','hello');

-- CASE WHEN [value1] THEN [res1]....ELSE[DEFAULT] end;
-- 如果value1 为true,返回res1,...否则返回default默认值
SELECT CASE
WHEN true THEN
'hello'
ELSE
'world'
END;

-- SELECT CASE expr
-- WHEN true THEN
-- 'val1'
-- ELSE
-- 'default'
-- END;

SELECT CASE 'hello'
WHEN 'hello' THEN
'name'
ELSE
'world'
END;

-- 练习:查询emp表的员工姓名和工作地址(北京/上海---> -- -- 一线城市,其它二线城市)
SELECT
  name,
  CASE address WHEN '北京' THEN '一线城市'  
            WHEN '上海' THEN '一线城市' ELSE '二线城市' END;
from emp;

-- 练习:
SELECT
id,
name,
(CASE WHEN math >=85 THEN '优秀' WHEN math >=60 THEN '及格' ELSE  '不及格' END) '数学';

 (CASE WHEN english >=85 THEN '优秀' WHEN english>=60 THEN '及格' ELSE '不及格' end) '英语',

 (CASE WHEN chinese >=85 THEN '优秀' WHEN chinese >=60 THEN '及格' ELSE  '不及格' END) '汉语';

FROM score;

index索引

  • index是MySQL高效获取数据的数据结构(有序)。

  • 优点:提高数据检索效率,降低数据的IO成本

    通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。

     

B+Tree索引

  • 最常见的索引类型,大部分引擎都支持。是Btree的变种

  • 相对于Btree的区别: 1. 所有的数据都会出现在叶子节点。 2. 叶子节点形成一个单向链表。

Hash 索引

  • Hash 特点:

    1. Hash索引只能用于对等比较(=,in),不支持范围查询( between ,>,<,..)

    2. 无法利用索引完成排序操作

    3. 查询效率高,通常只需要一次检索就可以了,效率通常要高于B+tree索引

    4. 支持的引擎

      Memory引擎,而InnoDB中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。

索引分类

分类含义特点关键字
主键索引 针对于表中主键创建索引 默认自动创建,只能有一个 primary
唯一索引 避免同一个表中某数据列中的值重复 可以有多个 unique
常规索引 快速定位索引 可以有多个  
全文索引 全文索引查找的是文本中的关键词,而不是比较索引中的值 可以有多个 fullText

根据存储形式分

  • 聚集索引 : 叶子节点下挂的是该id对应的那一行数据

  • 二级索引 : 叶子节点下挂的是该字段对应的id

  • 聚集索引选取规则

    1. 如果存在主键,主键索引就是聚集索引

    2. 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。

    3. 如果表没有主键,也没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

     

  • 回表查询:先经过二级索引--->找到id--->再到聚集索引根据id找到对应的数据。

InnoDB 主键索引的B+Tree的高度为多高?

  • 高度为2 :可以存2万

    n为key的个数 ,(n+1)是指针的个数,一个页可以存16K ,1K=1024 ,主键8,指针6

    n* 8+(n+1) * 6=16 * 1024=1170字节

    1170*16=18736

  • 高度为3 :可以存两千万

    可以存储21939856

索引语法

  • 创建索引

    CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name (index_col_name,..);
    # 创建了一个常规索引(不加修饰的话,常规)
    create index idx_user_name ON tb_user (name);

    # 给手机号创建唯一索引
    create UNIQUE index idx_user_phone ON tb_use (phone);

    # 创建一个联合索引
    create index idx_user_pro_age_sta ON tb_user (profession,age,status);

     

  • 查看索引

    SHOW INDEX FROM table_name;

     

  • 删除索引

    DROP INDEX index_name ON table_name; 
  •