14 MySQL

MySQL

1. 数据库DB

“按照数据结构来组织、存储和管理数据的仓库 " 数据库管理系统 DBMS 系统里面的软件 一个应用程序 服务端程序

数据库意义?

将数据写入文件中: 类型比较单一  操作数据比较麻烦的  
    web项目:
   
页面(浏览器)--->服务器---->控制层(servlet/struts2/springMVC)--->service--->dao(数据持久层 mybatis/mp)--->DB
    用户注册 
    持久化保存用户的数据
1.从存储位置上:
   1.1 基于磁盘的数据库:  磁盘文件  IO 效率偏低  持久化保存  mysql  oracle  sqlserver
   1.2 基于缓存(内存)的数据库: 存储内存  效率非常快  并不能保证持久化  读的时候  redis mogodb
       
2.从关系上:
   2.1 关系型数据库:   表与表  字段与字段  数据与数据  都是有关系的 mysql  oracle  sqlserver
   2.2 非关系型数据库  NOSQL: not only sql   数据: key:value   redis 

RDBMS: 关系型数据库管理系统软件 relation database management system

2. mysql

下载地址: https://dev.mysql.com/downloads/mysql/

https://dev.mysql.com/downloads/windows/installer/5.7.html msi

安装成功之后 会在window系统里面 自动安装一个mysql的服务

用户名:  root
密码: root
安装的目录路径:    C:\Program Files\MySQL\MySQL Server 5.7
数据的目录: C:\ProgramData\MySQL\MySQL Server 5.7
    mysql的核心配置文件:  my.ini
        max_connections=151  最大的连接数       

3. 操作

mysql tcp/ip 前提: 先去连接服务端程序 连接指定的计算机里面服务程序 (获得了一个数据库连接)

mysql:
  很多数据库 database---> 很多表 table ---> 字段  字段类型 约束  数据

3.1 mysql指令

C:\Users\dn>mysql -h 127.0.0.1 -uroot -p
Enter password: ****
 # mysql -h ip地址  -uroot -p
mysql> show databases; 查看所有的数据库
mysql> use mysql; 使用指定的数据库
mysql> select database(); 查看当前正在使用的数据库
mysql> show tables; 查看当前数据库里面所有的table
mysql> desc user; 查看指定表结构
mysql> show create database mydb; 查看创建数据库的详细的信息

3.2 SQL

结构化查询语言 structured query language

1. DDL 数据定义语言 create  drop  alter
2. DML 数据操作语言 insert  delete  update
3. DQL 数据查询语言 select
4. DCL 数据控制语言 grant  commit  rollback
mysql> select * from user; 查询指定表里面所有的数据    *: 通配符 通配表里面所有的字段

1. DDL(了解)

mysql> create database mydb;
# CREATE DATABASE 数据库名称; #名称不可更改
mysql> drop database mydb; 删除数据库(库里面的表也会全部删除)

#创建表 t_student  tb_ studnet 
create table 表名(
   字段名称1  类型  [约束],
   字段名称2  类型  [约束],
   ....
   字段名称n  类型  [约束]
);

#一张表里面 必不可少3个字段  id  create_time update_time
create table tb_student(
  id int, 
  name varchar(20),
  age tinyint(2) unsigned,
  gender char(1),
  birthday date,
  score float(4,1),
  hobby varchar(30),
  create_time datetime,
  update_time datetime
);

操作表结构

mysql> drop table tb_student; 删除表

mysql> alter table tb_student rename student; 修改表名
mysql> alter table student add image varchar(100); 新增新的字段
mysql> alter table student drop image; 删除字段
mysql> alter table student change name stuName varchar(20); 更改字段的名称
mysql> alter table student change stuName name varchar(200); 更改字段的名称/类型
mysql> alter table student modify  gender varchar(2); 更改字段/类型

2. 数据类型

四类八种

1. 整型
 tinyint(m)  -128-127  unsigned 0-255  年龄  tinyint(1) boolean   0  1
 int(m)
 bigint(m)  id  时间毫秒数
  m:11  int(4) 限定单元格宽度
  unsigned 无符号  正整数 
  zerofill  用0填充   int(4)  10001
 
2.小数类型
   float(m,n)  m: 规定小数的总位数   n: 限定小数点后面位数
   double(m,n)
   decimal(m,n)  定点数   money  BigDecimal
   
3.字符串
  char(n)  255  char(1)
  varchar(n) 65535  限定存储的字符个数
  
  char(4) ’a___‘ 查询的时候 自动去除隔空
  varchar(4) ’a‘ 
  
4. 日期类型
   date 年月日
   datetime 年月日 时分秒
   timestamp 时间戳(自动获取当前系统的时间)
   year(4)    

3. DML

数据操作语言

mysql> select * from student;

# insert
#1. 对所有的字段新增
insert into 表名 values (数据1,数据2...数据n),(数据1,数据2...数据n);
mysql> insert into student values (1002,'zhangsa',20,'m','2020-01-01',100,'game,code,music','2020-01-01 12:00:00','2020-01-01 12:00:00');

#2. 指定字段新增
insert into 表名 (字段1,字段2...字段n) values (数据1,数据2...数据n);
mysql> insert into student (id,name,age,create_time) values (1003,'tom',18,now());

#3. 添加多行记录
insert into 表名 (字段1,字段2...字段n) values (数据1,数据2...数据n),(数据1,数据2...数据n),....;
mysql> insert into student (id,name,age,create_time) values (1003,'tom',18,now()),(1004,'lisi',30,now());
#delete
delete from 表名; 清空表里面所有的数据

#有条件的删除  where   and/or
mysql> delete from student where id='1001';
mysql> delete from student where id='1003' and create_time = '2020-12-23 16:38:13';

-- delete from emp where id = ?;  -- DML 
-- TRUNCATE TABLE stu ;-- 效率快  drop table  create table   DDL  
-- 
select *  from  stu;
#update  带条件修改
update 表名 set 字段1=新值1,  字段2=新值2 where 条件 ;
mysql> update student set age=18,gender='m',update_time=now() where id = 1003;

4. 编码格式

mysql> insert into tb_userinfo (id,name,age) values (1002,'张三',20);
ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name' at row 1

mysql> show create database mydb;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| mydb     | CREATE DATABASE `mydb` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-----------------------------------------------------------------+

mysql> show variables like '%character%'; #查看整个mysql服务相关的编码配置
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | gbk                                                     |
| character_set_connection | gbk                                                     |
| character_set_database   | latin1                                                  |
| character_set_filesystem | binary                                                  |
| character_set_results    | gbk                                                     |
| character_set_server     | latin1                                                  |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
# 不能存储中文的数据

#修改指定数据库的编码格式
mysql> alter database mydb  character set utf8;
mysql> show create database mydb;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| mydb     | CREATE DATABASE `mydb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
mysql> insert into tb_userinfo (id,name,age) values (1002,'张三',20);
ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name' at row 1

# 这2张表示在刚刚latin的编码格式下创建的  即使修改了指定数据库编码格式  依然不能添加中文

修改全局的配置  在my.ini
66 default-character-set=utf8
100 character-set-server=utf8
重新启动mysal的服务  加载核心配置文件

客户端

navicat sqlyog    
mysql-front 

3.3 约束

限制字段的数据 (规则: 校验字段数据是否符合指定规则 insert update delete)

行级约束: 单个字段
表级约束: 多个字段(多张表的多个字段)

1. 非空约束 not null

字段的数据不能为null

-- create TABLE a(
-- id int not null,
-- name varchar(20) null,
-- age TINYINT UNSIGNED
-- );
-- ctrl+/ 注释sql


-- insert into a VALUES (1,'jim',20);
-- INSERT into a (name,age) values ('tom',20);
INSERT into a (id) values (2),(3);
select * from a;

INSERT into a (name,age) values ('tom',20)
> 1364 - Field 'id' doesn't have a default value

2. 唯一性约束 unique

唯一性的索引 index 在表里面 有些字段有索引的话 查询效率要快

-- create TABLE b(
-- id int not null UNIQUE,
-- name varchar(20) UNIQUE,
-- age TINYINT UNSIGNED
-- );
-- UNIQUE约束自动过滤null
-- insert into b (id) values(1),(2),(3);
insert into b (id) values(1);
select * from b;
> 1062 - Duplicate entry '1' for key 'id'
 

3. 默认约束 default

给字段设置默认值

-- create TABLE c(
-- id int not null UNIQUE,
-- name varchar(20) UNIQUE DEFAULT '无名氏' ,
-- age TINYINT UNSIGNED
-- );

insert into c (id,name) values(2,'jim');
select * from c;

3. 主键约束 primary key

行级约束(任意类型的字段都可以充当主键列 整型+字符串)

字段的数据就等同于 not null +unique 一张表里面有且只有一个主键列 (可以是多个字段充当一个主键列 联合主键)

代表行记录的唯一性 主键列 自带索引

mysql的三大范式:
 1: 保证列的原子性  列不可再分
    地址:    
 2. 主键保证行记录的唯一性。 
 3. 避免数据出现冗余的情况 (排除主键列和外键列的数据) 
#主键列是整型   一般也不会手动给值  都是mysql自动维护 自增 auto_increment  (并发: )
-- create TABLE d(
-- id int PRIMARY key,
-- name varchar(20) UNIQUE DEFAULT '无名氏' ,
-- age TINYINT UNSIGNED
-- );

-- alter table d change id id int auto_increment;
-- 默认从1开始  步长 1
-- alter table d auto_increment = 1000; 修改自增初始值
-- set GLOBAL auto_increment_increment = 5; 修改自增的步长值

insert into d (name) values('张三8');
select * from d;

insert into d (id,name) values(2,'tom')
> 1062 - Duplicate entry '2' for key 'PRIMARY'

-- create TABLE d(
-- id int PRIMARY key auto_incremnet,
-- name varchar(20) UNIQUE DEFAULT '无名氏' ,
-- age TINYINT UNSIGNED
-- );
#主键列为字符串类型
-- create TABLE e(
-- id  varchar(100) PRIMARY key,
-- name varchar(20) not null UNIQUE ,
-- age TINYINT UNSIGNED not null
-- );
-- 
insert into e (id,name,age) values (uuid(),'kkk','20');
select * from e;
-- select uuid();
-- create TABLE e(
-- id  varchar(100),
-- name varchar(20) not null UNIQUE ,
-- age TINYINT UNSIGNED not null,
-- PRIMARY key(id)
-- );

-- 多个字段同时充当主键列   联合主键

-- create TABLE e(
-- id  int,
-- name varchar(20) ,
-- age TINYINT UNSIGNED not null,
-- PRIMARY key (id,name)
-- );
-- 

insert into e values (1,'a',20);
insert into e values (1,'b',20);
insert into e values (2,'a',20);
select * from e;
表   字段   类型
 映射   
类   属性   数据类型

4. 外键约束 foreign key

表级约束:涉及至少2张表 维护多张表的关系

一张表(子表/从表)里面可以有多个列充当外键列(通过约束来指定) 外键列的数据要严格参照主表里面的主键列的数据

1. 一对一
一个用户有一个角色
主表: 角色表
从表: 用户表 ---> 外键列(参照角色表主键列的数据)

-- 修改从表的表结构
-- alter TABLE tb_userinfo 
-- add CONSTRAINT FOREIGN key fk_roleid (roleid) REFERENCES tb_role(id);

-- 新增/修改子表的数据
-- 先查询角色表里面所有的角色
-- select * from tb_role;  1
-- Cannot add or update a child row: a foreign key constraint fails (`mydb`.`tb_userinfo`, CONSTRAINT `tb_userinfo_ibfk_1` FOREIGN KEY (`roleid`) REFERENCES `tb_role` (`id`))
insert into tb_userinfo (`name`,roleid) values ('张三1',100);

update tb_userinfo set name = 'kkk' , roleid = 1000 where id= 2;


-- 删除子表的数据  对主表没有任何影响的
delete from tb_userinfo where id = 1;

-- 操作主表
-- 子表如果参照主表的数据  主表的记录不能删除的
-- 以上这些情况  外键约束的机制: restrict

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CkiA7erC-1609079465047)(pic/foreign .png)]

-- 外键约束的机制: set  null  (外键列必须可以为null)
-- 操作主表
-- 子表如果参照主表的数据  先将子表的数据置为null 然后再删除主表的数据
delete from tb_role where id = 1;
select * from tb_role;
SELECT * from tb_userinfo;
-- 外键约束的机制: cascade
-- 操作主表
-- 子表如果参照主表的数据  全部删除子表关联的记录
-- 删除主表的数据
delete from tb_role where id = 11;
select * from tb_role;
SELECT * from tb_userinfo;

在实际开发中 外键列正常存在 但是不会添加外键约束的。 在代码的层面上 维护表与表的关系

#【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
#说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度.
2. 一对多
一个订单多个详情: 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N708nqgy-1609079465049)(pic/订单详情id .png)]

中间表维护订单与详情的关系:  弊端: 中间表越来越多
3. 多对多
用户---->角色 --->权限(功能)    
    100个用户
      50  1  2  3  4 5
      50  1  2 3
    
使用中间表实现关系:
删除角色:


删除权限:

3.4 DQL

select * from tb_userinfo; 
select
  表字段
 from
  table1,table2...
[
 where 条件1 and/or   (条件过滤)
 group by 字段(分组查询)
 having 条件1 and/or (分组之后的过滤)
 order by asc/desc(排序)
 limit ?/?,? 限定查询的结果(分页查询)
]

1. 条件查询 where

select/delete/update 都可以与where结合使用
=、!=、<>、<、<=、>、>=;
BETWEEN…AND;是否满足一个区间范围  >=  <=
IN(set);条件的集合
IS NULL;
AND; 连接多个条件的查询
OR;or  满足其中一个条件就可以
NOT;

-- 1.where 查询
-- 查询学生性别为女,并且年龄50的记录
-- SELECT * from  stu where (gender='female' and age = 15);
-- 查询学号为S_1001,S_1002,S_1003的记录
-- SELECT * from  stu where sid = 's_1001' or sid = 'S_1002' or sid = 'S_1003';
-- SELECT * from  stu where sid in ('s_1001','s_1002','s_1003');
-- delete from stu where sid in ('s_1001','s_1002');

-- 查询学号不是S_1001,S_1002,S_1003的记录
-- SELECT * from  stu where sid != 's_1004' and sid != 'S_1005' and sid != 'S_1003';
-- SELECT * from  stu where  sid not  in ('s_1004','s_1005','s_1003');
-- 查询年龄为null的记录
-- select * from stu where age is not null;

-- 查询年龄在20到40之间的学生记录
-- select * from stu where age>=20 and age<=40;
-- select * from stu where age BETWEEN 20 AND 40;
-- 查询性别非男的学生记录
-- select * from stu WHERE gender!='male' or gender is  null;

2. 模糊查询 like

--  2. like
-- 查询姓名由5个字母构成的学生记录 使用通配符_
-- select * from stu where sname like '_____';

-- 查询姓名以“z”开头的学生记录  使用通配符 %
-- select * from stu where sname like 'z%';
-- show VARIABLES like '%character%';

-- 查询姓名中第2个字母为“i”的学生记录
-- select * from stu where sname like '_i%';

-- 查询姓名中包含“a”字母的学生记录
select * from stu where sname like '%a%';

3.字段控制查询

去重 distinct

去除重复的字段/行记录的数据
-- 去重 DISTINCT 只能与select结合使用
-- select DISTINCT gender from stu;
select DISTINCT gender from stu;
select DISTINCT gender,sname from stu;
select DISTINCT * from stu;

null值运算

-- 一个字段本身的数据为null 如果进行相关的算术运算的话  结果还是为null
select sid,sname,age, ifnull(age,18)+1 from stu;
-- ifnull(字段名称,新的值) 如果指定的字段的数据为 null  使用新的值替换  否则还是自身的数据
SELECT empno,ename,sal,comm,(sal+ifnull(comm,0)) from  emp;

别名查询 as 可以省略

SELECT e.empno,e.ename,sal,comm,(sal+ifnull(comm,0))  totalMoney from  emp  e;
-- 多张表关联查询 对表起名称

4. 排序 order by

默认按照升序 asc desc 降序

-- 查询员工信息  先按照薪资排序  薪资一致  再按照编号降序排列
-- 根据id  以及  时间  降序排列
select * from emp  ORDER BY sal desc, empno desc;

5. 分组查询 group by

分组函数

聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
-- 1. 聚合函数(分组函数)  有且只有一个结果
-- 统计emp表总记录数  count(字段)
-- select count(empno),count(comm),count(*),count(1) from emp;
-- 统计emp最高薪资  最低薪资  所有员工的薪资总和  平均薪资
-- select max(sal),min(sal),sum(sal),avg(sal),sum(sal)/count(*)from
-- 查询emp表中月薪大于2500的人数
-- select count(empno)  from  emp  where sal>2500;

-- oracle 分组关联字段必须出现在select后面
-- 查询每个部门的部门编号和每个部门的工资和:
select deptno,sum(sal) from emp GROUP BY deptno;
-- 查询每个部门的部门编号以及每个部门的人数:
select deptno,count(*) from emp GROUP BY deptno;
-- 查询每个部门的部门编号以及每个部门员工工资大于1500的人数:
select deptno,count(*) from emp WHERE sal>1500 GROUP BY deptno;

6. having过滤

-- 查询工资总和大于9000的部门编号以及工资和:
-- > 1111 - Invalid use of group function where 不能与组函数结合使用
-- 一般都是体现在分组后面  对分组之后数据进行过滤  
select deptno,sum(sal) from emp  GROUP BY deptno HAVING sum(sal)>9000;

7. 关联查询

  1. 等值连接
-- 查询员工信息,要求显示员工号,姓名,月薪,部门名称 
-- 56=14*4 笛卡尔积的数据
--  Column 'deptno' in where clause is ambiguous
-- 关联2张表查询 至少有1个条件 
SELECT 
 e.*,dname
from
emp as e,dept as d where e.sal>1500 and e.deptno=d.deptno;
  1. 不等值连接 条件连接不是一个等号
-- 查询员工信息,要求显示:员工号,姓名,月薪,薪水的级别
SELECT 
 DISTINCT e.*,s.GRADE,d.dname
from
emp as e,salgrade s,dept d where e.deptno=d.deptno and e.sal BETWEEN s.LowSAL and s.HISAL
ORDER BY e.sal;
  1. 外连接
# 内外连接  inner join on/where
#左外连接 left join on
#右外连接  right join  on

-- 外连接
-- 内外连接 inner join on/where  等同于普通的表关联查询
-- select d.deptno,d.dname,count(*) 
-- FROM dept d INNER JOIN emp e 
-- where d.deptno=e.deptno GROUP BY e.deptno;

-- 到底使用左/右  要看基表在左边还是右边?
-- 左外连接 left join  on  以左表为基本  右表没有的数据使用null或者0填充
-- 右外连接 right join  on 以右表为基本  左表没有的数据使用null或者0填充
-- select d.deptno,d.dname,count(e.empno) 
-- FROM dept d left JOIN emp e 
-- on d.deptno=e.deptno GROUP BY e.deptno;

  1. 自连接 (把自己当成多张表看待)
-- 查询员工姓名和员工的老板的名称
-- 员工的mgr的数据就是老板的empno
-- SELECT
--  e1.*,e2.empno,e2.ename
-- from
-- emp e1,emp e2 where e1.mgr=e2.empno ORDER BY e1.empno ;

-- SELECT
--  e1.*,e2.empno,e2.ename
-- from
-- emp e1 LEFT JOIN emp e2 on e1.mgr=e2.empno ORDER BY e1.empno ;

-- 展示部门名称 薪资级别
SELECT
 e1.*,d.dname, s.GRADE,e2.empno,e2.ename,e2.sal,d1.dname,s1.GRADE
from
emp e1 LEFT JOIN emp e2 on e1.mgr=e2.empno -- 临时表
,dept d,salgrade s, dept d1,salgrade s1 
where e1.deptno=d.deptno and e1.sal BETWEEN s.LowSAL and s.HISAL
and d1.deptno=e2.deptno and e2.sal BETWEEN s1.LowSAL and s1.HISAL
ORDER BY e1.empno ;

SELECT
 e1.*,d.dname, s.GRADE,e2.empno,e2.ename,e2.sal,d1.dname,s1.GRADE
from
emp e1 LEFT JOIN emp e2 on e1.mgr=e2.empno 
LEFT JOIN dept d on e1.deptno=d.deptno 
LEFT JOIN salgrade s on e1.sal BETWEEN s.LowSAL and s.HISAL
, dept d1,salgrade s1 
where d1.deptno=e2.deptno and e2.sal BETWEEN s1.LowSAL and s1.HISAL
ORDER BY e1.empno ;

SELECT
 e1.*,d.dname, s.GRADE,e2.empno,e2.ename
from
emp e1 LEFT JOIN emp e2 on e1.mgr=e2.empno 
LEFT JOIN dept d on e1.deptno=d.deptno 
LEFT JOIN salgrade s on e1.sal BETWEEN s.LowSAL and s.HISAL
ORDER BY e1.empno ;
  1. 子查询 (查询的条件的数据是未知的)
-- 查询工资为20号部门平均工资的员工信息
select * from emp where sal=(select avg(sal) from emp where deptno=20);
  1. 集合运算
union all  
 vs      
union

-- 分库分表: 所有的用户信息
-- select * from user0;
-- select * from user1;
-- select * from user2;

-- 通过1条sql语句  查出来所有的用户的信息
-- select DISTINCT * from 
-- (select * from user0
-- union all
-- select * from user1
-- union all
-- select * from user2) temp;

-- select * from user0
-- union 
-- select * from user1
-- union 
-- select * from user2;

8. 分页查询 limit

-- 每一页展示固定量的商品信息   100个商品
-- 商品表维护所有的商品的信息
-- 用户只知道请求查看第几页的数据  

-- 分页查询员工表的信息 每页展示5条数据  pageSize
-- 总页数: 14%5==0  int totalPage = 14/5 ; totalPage = totalPage+1;
-- 总记录数: select count(*) from emp; 14
-- -- 第一页的数据:
--    select * from emp ORDER BY empno limit 5;-- 从第一条记录  查询pageSize条
-- 	 select * from emp ORDER BY empno limit 0,5;
-- -- 第2页的数据:	
-- 	 select * from emp ORDER BY empno limit 5,5;-- 1: 从第几条记录  index   2: 查询pageSize条
-- -- 第3页的数据:	
--    select * from emp ORDER BY empno limit 10,5;

-- 取决用户要看第几页的数据: curpage 当前第几页
	 select * from emp ORDER BY empno limit (curpage-1)*pageSize,pageSize;

4. 常用函数

-- 常用函数
-- 字符串操作 String
-- concat(字段名称,str2,…)	连接字符串
-- lower(str)	转成小写
-- upper(str)	转成大写
-- trim(str)	去掉字符串str前缀和后缀的空格
-- length(str)	返回字符串str的长度
-- char_length(str)	返回字符串str的长度
-- SELECT ename,CONCAT(ename,'_','a','_'),upper(lower(ename))  from emp;
-- select LOWER('aHc');
-- select trim(' ffg g  gg  '),LENGTH('我们'),char_LENGTH('我们');
-- repeat(str,count)	返回str重复count次的结果
-- substring(str,pos,len)	从字符串str的pos位置起len个字符长度的子串
-- select REPEAT('abc_',2),SUBSTRING('hello',2),SUBSTRING('hello',2,3);
-- replace(str,from_str,to_str)	用字符串to_str替换字符串str中所有的字符串from_str
-- SELECT REPLACE('hello','l','abc');
-- lpad(str,ien,padstr)	返回字符串str,其左边由字符串padstr填补到len字符串长度
-- rpad(str,len,padstr)	返回字符串str,其左边由字符串padstr填补到len字符串长度
-- SELECT lpad('hello',9,'abc'),rpad('hello',9,'abc');
-- insert(str,pos,len,newstr)	字符串str从第pos位置开始的len个字符替换为新字符串newstr
-- SELECT insert('hello',2,3,'abc');


-- 数值型数据操作  Math
-- select abs(-10),round(rand()*10),ROUND(10.523),round(10.1256,3),TRUNCATE(10.1256,3);
-- SELECT ceil(1.5),ceil(-2.6),FLOOR(1.5),FLOOR(-2.6);


-- 日期相关函数  Date
-- 获得当前系统时间
-- select now(),SYSDATE(),CURRENT_TIMESTAMP(),CURRENT_DATE(),CURRENT_TIME();
-- 查询1981年入职的员工
-- select * from emp where year(hiredate) = 1981;
-- select YEAR(now()),MONTH('2020-10-01'),MONTHName(SYSDATE());
-- select DATEDIFF(now(),'2019-12-01');
-- select UNIX_TIMESTAMP();-- 获得当前系统的时间(毫秒数)

-- insert into a (name,craete_time) values ('jim2',UNIX_TIMESTAMP());
-- SELECT LAST_INSERT_ID();  -- 获得上一次的自增id值
-- SELECT id,name, FROM_UNIXTIME(craete_time,'%Y-%m-%d %H:%i:%S') from a;

-- select uuid();

5. 数据备份

-- 数据备份
-- 1. 物理备份  data
-- 2. 命令 mysqldump -uroot -proot -d 数据库名称  表名 > 路径  只带有数据库表结构
-- mysqldump -uroot -proot 数据库名称  > 路径     带有数据库表结构+数据
-- mysqldump -uroot -proot -d 数据库名称  表名1, 表名1 > 路径
-- 登录的状态下: source 文件路径
-- 异步定时任务(在一个指定时间上备份服务器的数据)  阿里云mysql服务:version
-- 3.navicat: 导入  导出

6. mysql的数据存储引擎

-- 4种引擎
-- myisam  InnoDB  memory  archive
-- myisam(新增+删除)  不支持事务
-- InnoDB 保证事务(ACID) 
-- memory 将数据存储内存
-- archive
show VARIABLES like '%storage_engine%';

7. 连接数据库

# 目前 我们不能使用计算机自动分配的ip连接mysql服务
# 原因:
   mysql用户root只支持localhost/127.0.0.1 进行连接
   如果后期分组开发项目  是存在问题的  因为一个项目 有一个mysql的服务。有可能出现我们要连接其他机器的mysql的服务。
   
#解决方式:
   将localhost改为%  可以允许任意的计算机连接我本机的mysq服务。
   修改完毕  重启服务。

CT id,name, FROM_UNIXTIME(craete_time,’%Y-%m-%d %H:%i:%S’) from a;

– select uuid();






## 5. 数据备份

```mysql
-- 数据备份
-- 1. 物理备份  data
-- 2. 命令 mysqldump -uroot -proot -d 数据库名称  表名 > 路径  只带有数据库表结构
-- mysqldump -uroot -proot 数据库名称  > 路径     带有数据库表结构+数据
-- mysqldump -uroot -proot -d 数据库名称  表名1, 表名1 > 路径
-- 登录的状态下: source 文件路径
-- 异步定时任务(在一个指定时间上备份服务器的数据)  阿里云mysql服务:version
-- 3.navicat: 导入  导出

6. mysql的数据存储引擎

-- 4种引擎
-- myisam  InnoDB  memory  archive
-- myisam(新增+删除)  不支持事务
-- InnoDB 保证事务(ACID) 
-- memory 将数据存储内存
-- archive
show VARIABLES like '%storage_engine%';

7. 连接数据库

# 目前 我们不能使用计算机自动分配的ip连接mysql服务
# 原因:
   mysql用户root只支持localhost/127.0.0.1 进行连接
   如果后期分组开发项目  是存在问题的  因为一个项目 有一个mysql的服务。有可能出现我们要连接其他机器的mysql的服务。
   
#解决方式:
   将localhost改为%  可以允许任意的计算机连接我本机的mysq服务。
   修改完毕  重启服务。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值