20201015_陈宇_

Centos7下安装Dockerhttps://blog.csdn.net/u014069688/article/details/100532774

使用docker安装mysqlhttps://www.cnblogs.com/jiefu/p/12204555.html

docker每次进入mysql步骤:
1、重启Mysql容器 docker restart mysqlserver
2、进入mysql容器 docker exec -it mysqlserver env LANG=C.UTF-8 bash (进入容器并设置字符集为utf-8)
3、登录 mysql -uroot -p

1、建库、建表

1.1 数据库的相关操作

-- 创建数据库
create database if not exists db_name;//当数据库不存在时创建
-- 使用数据库
USE company_info; //选择要连接的数据库
-- 删除数据库
DROP DATABASE hws_20191106;//删除指定的数据库语法结构

2.1 数据表的相关操作

-- 创建表
create table tab_name( 
    col_name datatype default null/number comment '注释', 
    col_name datatype //注意最后一列不要加,
)CHARACTER set 编码格式;

-- 例:
CREATE TABLE dept( 
    deptno INT DEFAULT 1 COMMENT '部门编号', 
    deptname VARCHAR(20) DEFAULT NULL COMMENT '部门名称' 
)CHARACTER SET utf8;

-- 查看表结构
DESCRIBE dept;
-- 创建和dept结构一样的表 
CREATE TABLE d LIKE dept;
-- 删除表
DROP TABLE table_name;
-- 添加列
ALTER TABLE dept ADD age int;
-- 修改列
ALTER TABLE dept MODIFY age VARCHAR(20);
-- 删除列
ALTER TABLE dept DROP age;
-- 重命名表
RENAME TABLE dept to info;

2、CRUD操作

-- 添加数据
INSERT INTO dept VALUES(1,'销售部');
INSERT INTO dept(dept_no,dept_name)VALUES(2,'市场部INSERT INTO dept VALUES(3,'行政部'),(4,'技术部');
-- 查询数据
 -- 查询所有
    SELECT * FROM dept;
 -- 查询某列
    SELECT dept_name FROM dept;
 -- 根据条件查询
    SELECT dept_no FROM dept WHERE dept_name = '市场部';
--修改数据
 -- 修改所有
     UPDATE dept SET dept_name=6;
 -- 根据条件修改
     UPDATE dept SET dept_name = '研发部' WHERE dept_no=1;                                -- 删除数据
 -- 删除数据一定要加WHERE条件
    DELETE FROM dept WHERE dept_no = 2;
 -- 全部删除
     DELETE FROM dept; //只是清空了表中的数据,如果再次添加数据时,主键的值会变为最后一个被删除的元                          素主键的值+1;
 -- 清空所有数据
     TRUNCATE TABLE dept; //清空当前表中的数据,再重新创建一个表
       

2.1 where条件连接

a and b:表示需要同时满足a条件和b条件
a or b:表示满足a条件或者b条件都可以
in(a,...,b):表示在a到b之间都可以

2.2 数据备份和还原

mysqldump -h127.0.0.1 -uroot -proot db_name>path; //path-->要备份到的路径
mysql -h127.0.0.1 -uroot -proot db_name<back.sql  

2.3 约束

-- 唯一约束(对于非主键列中的值也要求唯一性时,就需要唯一约束)
ALTER TABLE dept ADD CONSTRAINT UNIQUE(deptname);
-- 外键约束
ALTER TABLE emp ADD CONSTRAINT fk_dept_no FOREIGN KEY (dept_no)REFERENCES dept(dept_no);

3、高级查询

dept表

image-20201015210630798

emp表

image-20201015210705518

3.1 笛卡尔乘积

-- 笛卡尔乘积
SELECT * FROM emp,dept; //表查询中的笛卡尔乘积现象:多行表在查询时,如果定义了无效连接或者漏写了连接条件,就会产生笛 卡尔乘积现象,所谓的笛卡尔乘积及时每个表的每一行都和其他表的每一行组合

3.2 等值连接查询

-- 等值连接查询(n个表进行等值连接查询,少需要n-1个等值条件来约束)
    -- 查询每个部门的所有员工
     SELECT dept.dname,emp.ename from dept,emp WHERE dept.deptno = emp.deptno;

image-20201015210807659

3.3 自连接查询

-- 自连接查询
  -- 查询当前公司员工和所属上级员工的信息
  SELECT e1.empno as 员工编号,e1.ename as 员工姓名,e2.empno as 领导编号,e2.ename as 领导 
名 from emp as e1,emp as e2 WHERE e1.mgr = e2.empno;

image-20201015212741822

3.4 内连接查询

-- 内连接查询
内连接查询使用 inner join 关键字实现, inner 可以省略。内连接查询时,条件用 on 连接,多个条 件使用 () 将其括起来.
    -- 查询每个部门的所有员工
    SELECT dept.dname,emp.ename FROM emp inner join dept on emp.deptno=dept.deptno

image-20201015213350651

3.5 外连接查询

-- 外连接查询
外连接分为左外连接( left outer join ) 和右外连接( right outer join )其值 outer 可以省 略。外连接查询时,条件用 on 连接,多个条件使用 () 将其括起来.
左外连接表示以左表为主表,右外连接表示以右表为主表。查询时将主表信息在从表中进行匹配
 -- 查询每个部门的所有员工
    SELECT dept.dname,emp.ename FROM dept left join emp on emp.deptno = dept.deptno;
dept left join emp //此时以左表的信息为主,也就是dept表,emp中没有人属于财务部,因此财务部的员工名称为NULL。

image-20201015214350014

SELECT dept.dname,emp.ename FROM emp left join dept on emp.deptno = dept.deptno;
emp left join dept // 此时以 emp表的信息为主,emp表中没人属于财务部,因此dname中没有财务部。

image-20201015214814467

右外连接与之类似,此处不再赘述。

3.6 子查询

3.6.1 单行子查询

-- 查询软件部门下的所有员工
SELECT * FROM emp e WHERE e.deptno = (SELECT d.deptno FROM dept d WHERE d.dname='销售部');

image-20201015215546345

3.6.2 多行子查询

-- 统计所有的员工分布在那些部门的信息 
 SELECT * FROM dept d WHERE d.deptno IN (SELECT e.deptno FROM emp e) -- > (10,20,30);

image-20201015221526818

-- 查询公司中比任意一个员工的工资高的所有员工 
 select * from emp e1 where e1.sal > any (select e1.sal from emp e2);

image-20201015221902443

-- 查询公司中比所有的文员工资高但不是文员的员工 
select * from emp e1 where e1.sal > all(select e2.sal from emp e2 where e2.job like '%文
员');

image-20201015222212229

>any 表示大于子查询中的任意一个值,即大于小值 
>all 表示大于子查询中的所有值,即大于大的值

3.6.3 多列子查询(单行多列)

--查询公司中和员工***相同薪水的员工
select * from emp e1 where (e1.sal) = (select e2.sal from emp e2 where e2.ename = ' 葛亮');

image-20201015223043022

3.6.4 分页查询limit子句

select * from table_name  limit (页码 - 1) * 每页数量, 每页数量;

image-20201015223313032

第一个参数0是表示从第几条开始查询 (这里的 0 是可以省略不写的); 
第二个参数 表示查询出几条数据 后面不够的,有多少写多少;

3.6.5 distinct

在 select 语句中,可以使用 distinct 关键字对查询的结果集进行去重。去重必须结果集中每个列的 值都相同
select distinct  e.sal from emp e order by e.sal ; //工资去重的列 升序排序
select distinct  e.sal from emp e order by e.sal desc ;//工资去重的列 降序排序

image-20201015224210344

3.6.6 order by

order by 用于对结果进行排序显示,可以使用 ASC / DESC 两种方式进行排序,可以有多个排序条件
ASC :表示升序排序(默认为此排序方式)
DESC :表示降序排序

3.6.7 聚合函数

Mysql中内置了 5 种聚合函数,分别是: SUM 、 max 、 min 、 avg 、 count 。
select sum(e.sal) from emp e where job='销售员' order by sum(e.sal) ; -- 查询销售员的总工资

image-20201015224842813

3.6.8 group by

group by 是对数据进行分组,分组时,表中有相同值的分为一组。分组后可以进行聚合查询。
group by 分组后的查询中, select 的列不能出现除了 group by 分组条件以及聚合函数外的其他列

select 列1, 列2, (聚合函数) from table_name group by 列1, 列2; 

3.6.9 having

having 是对 group by 分组后的结果集进行筛选。
select 列1, 列2, (聚合函数) from table_name group by 列1, 列2 having 分组后条件; 

3.6.10 综合查询

书写顺序

select distinct * from emp join dept on emp.deptno = dept.deptno where hridate >= '2000-01-01' group by deptno having count(*) >= 2 order by count(*) desc limit 0,5;

执行顺序

from --> on --> join --> where --> group by --> having -->  select --> distinct-- > order by--> limit

4、单行函数

4.1 字符串函数(从0开始)

image-20201015225547327

4.2 数学函数

image-20201015225658247

4.3 日期函数

image-20201015225738267

标签

评论

this is is footer