暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关于MySQL

稍不留神论 2021-08-01
259

在docker创建mysql容器

docker pull mysql:5.7                                           拉取mysql容器

                                             

关系型数据库是依据关系模型来创建的数据库

a . 登录数据库 mysql -uroot -proot

b. 退出数据库  quit/exit

c.启动和停止mysql服务  net start mysql 启动服务  net stop mysql 停止服务

SQL:结构化查询语音

  数据库中的表相当于Python中的类  ,如 学生类Student ---> 学生表student

  数据库中数据表中的记录相当于Python中通过类创建的对象

  Student("xiaoming",18,66)------------->xiaoming 18 66

  数据库中的数据表中的字段相当于Python中定义的实例属性,如:name,age,score ------>

name varchar(20),age int, score int

SQL分类:

  DDL:数据定义语言(Data Definition Language)

   作用:针对数据库,数据表进行创建,修改和删除的操作

    关键字:create    alter   drop

  DML:数据操作语言(Data Manipulation Language)

   作用:针对数据库的记录,字段进行增删改的操作

    关键字:insert    update   delete/truncate

 DQL:数据查询语言(Data Query Language)

  作用:对数据库中的表,记录,字段进行查询

  关键字:select ...from...  where    like   order by    group by      having    limit     between...and  

                or     in   等

  DCL:数据库控制语言(Data  Control   Language)

  作用:对数据库的安全级别和访问权限进行管理

  关键字:begin    commit   rollback

DDL的用法

show databases;                               查看已有的数据库

 create database  库名;                 创建数据库(建库)

create database 库名  character set  编码格式;               创建数据库的同时指定编码格式

create database  库名  charset     编码格式;                      创建数据库的同时指定编码格式

create database   if   not exists  库名;                               判断数据库是否存在,不存在才创建;

drop database   库名;                                                         删除数据库【删库】

drop  database if   exists  库名;                                        判断数据库是否存在,存在才删除

alther  database 库名  character set  编码格式;                修改数据库的编码格式

show create database  库名;                                                    查询数据库的创建语句及编码格式

use 库名;                                                                                  指定要使用的数据库【连接数据库】

select   database();                                                                     查看当前正在使用的数据库

DDL操作数据表

show  tables;                                                                             查看当前数据库中所有的表;

create table 表名(字段名   字段类型  [约束],字段名  字段类型  [约束],...)          

                                                                          判断表是否已存在,不存在才创建;

create table if    not exists    表名(字段名   字段类型   [约束],字段名   字段类型  [约束],...)

                                                                         判断表是否已存在,不存在才创建

create   table  xxx  (字段名   字段类型  [约束],字段名   字段类型  [约束],...)  charset= xxx;

                                                                         创建表,同时指明编码格式

drop  table  表名;                                              删除表

drop   table if   exists  表名;                             判断表是否已存在,存在才删除;

create   table   新表名     like    被复制的表名;            复制表结构

alter    table   旧表名   rename  to  新表名;           修改表名

rename  table   旧表名  to   新表名;                       修改表名

show   create table   表名;                                         查看表格的创建细节;

 desc     表名;                                                             查看表结构

修改表结构:(字段)

alter  table   表名   add   新字段   字段类型   [约束];                     添加新字段

alter table   表名    character        set;                                            新的编码格式

alter table    表名   drop   字段;                                                       删除字段

alter  table  table_name  modify   字段1  数据类型   first|after   字段2

                                first:设置成第一个

                                after   字段2:在指定字段2的后面

(alter table wanger modify  num varchar(20) after hobby;)                                                                                                                 修改字段的排名位置;

alter  table   表名   modify   字段  类型;                                       修改字段数据类型

alter table   表名   change  旧字段名  新字段名    类型;              修改字段名

DML操作数据

select * from 表名                       *---表示所有字段,                     查询表中所有记录

insert  添加记录

insert   into  表名  values(值1,值2,值3,...);                              向所有字段添加数据

insert    into   表名    (字段1,字段2,...)     value    (值1,值2,值3,);              #   values:插入单条数据

insert    into    表名  (字段1,字段3, ...)      values    (值1,值2,....);                 #   values:插入多条数据

                                                                                                              向指定字段添加数据

insert    into    表名    values     (值1,值2,值3, ...),(值1,值2,值3,...)........;    

                                                                                                             批量添加  (所有字段)

删除记录delete

delete  from  表名;                                                                删除表中所有记录

truncate table  表名;                                                             删除表中所有记录

delete  from 记录表名  where  条件;                                   根据条件删除指定

[MySQL删除表的三种方式]

drop table             drop是直接去除表信息,速度最快,但是无法找回数据      

                                    例如:删除user表--------------------drop table  user;

truncate table               truncate是删除表数据,不删除表的结构,速度排第二,但不能与where 一起使用

                                   例如:删除user表---------------------truncate table  user;

delete from        delete 是删除表中的数据,不删除表结构,速度最慢,但可以与where 连用,可以删除指  

                            定的行      例如:删除user表的所有数据      delete   from  user;

                                                          删除user表的指定记录     delete   from   user where use_id = 1;

希望删除表结构时,用drop;          

希望保留表结构,但要删除所有记录时,用truncate;

希望保留表结构,但要删除部分记录时,用delete;

update 表名 set 字段名1 = 字段值1,字段名2 = 字段值2,... where   条件;         根据条件修改指定记录

update  表名 set 字段名1= 字段值1,字段名2= 字段值2,....                                     修改所有记录

select  database   ()                                                查看当前正在使用的数据库

(update stu set score=0 where score is null)

(update stu set score+10,grade='No' where score=0 )

DQL数据查询语言

查询返回的结果集是一张虚拟表

SELECT  列名  FROM  表名【WHERE --->  GROUP BY  ---> HAVING----> ORDER  BY]

select  *  from 表名;                                           查询全部

select    字段名1,字段名2,.... from 表名;     根据指定字段查询

create table emp(    -> empno int,    -> emoname varchar(30),    -> gender varchar(10),    -> job varchar(10),    -> leaderno int,    -> birth date,    -> salary int,    -> extra int,    -> deptno int    -> );

1.查询工资在2000~3000之间的员工信息

select * from emp where salary between 2000 and 3000;

select * from emp where salary>=2000 and salary <= 3000;

2.查询部门10中的员工信息

select *from emp where deptno=10;

3.查询工资为2000,3000,4000,5000的员工信息

select * from emo where salary=2000 or salary=3000 or salary=4000 or salary=5000;

select * from emp where salary in (2000,3000,4000,5000);

4.查询工资不为2000,3000,4000,5000的员工信息

select * from emp where salary not in (2000,3000,4000,5000);

5.查询没有奖金的员工信息

select * from emp where extra is null;

6.查询性别不为male的员工信息

select * from emp where gender<>'male';

select * from emp where gender!='male';

7.查询性别为'female'且在30号部门的员工信息

select * from emp where gender='female' and deptno=30;

8.查询性别为'male'或在10号部门的员工信息

select * from emp where gender='male' or deptno=10;

条件查询-where

主要结合where子句使用,在where关键字后跟上条件,查询时根据条件进行筛选

逻辑运算符

and、or、not

&&、||、!

关系运算符

大于、大于等于、小于、小于等于、等于(=)、不等于(!=、<>)

指定范围之内

between  ... and …   注意:包头包尾【闭区间】

在指定列表中

in (值1,值2,值3,...)

not in不在指定列表中

空和非空

判断为空 is null

判断不为空 is not null

模糊查询-like

where等于子句号(=),用来精确匹配工作,如 author='习大大‘。但也有可能,我们要求过滤掉所有的结果,author应包含的名称:"习"。这时需要使用where子句结合like子句使用

通配符:

_:可以匹配任意一个字符

%:任意0~n个字符【n大于等于1】

alter table emp change emoname empname varchar(32);

1.查询名字为4个字母的员工信息

select * from emp where empname like "";

2.查询名字由5个字母组成,并且以t结尾的员工信息

select * from emp where empname like "___t";

3.查询名字以s开头的员工信息

select * from emp where empname like "s%";

4.查询名字中第二个字母是a的员工信息

select * from emp where empname like "_a%";

5.查询名字中包含b的员工信息

select * from emp where empname like "%b%";

字段控制查询

as: 可以给表、字段起别名,为了区分,为了简化

    用法:select 字段 as 别名

     注意:as 可以省略

infnull():将null转化为其他数据

distinct: 去除重复记录

对多个字段同时去重,distinct只需要写一次,多个字段的值必须都相同才能同时去重

as 一般用于多表查询,子查询以及子连接中

select * from emp as e;    给表名起别名

select  empname as n  from emp;  

select e.birth,e.empname from emp as e;            给字段起别名

select  empname n from emp;

select empnaem 姓名,salary 工资 from emp;sel

# 2.distinct

insert into emp values(7566,'jones','female','managen',7839,'1981-04-02',2975,null,30);

insert into emp values(7654,'martin','male','salesman',7698,'1981-09-28',1250,1400,30);


# 只对一个字段去重

select distinct empno  from emp;


# 对多个字段同时去重,distinct只需要写一次,多个字段的值必须都相同才能同时去重

select distinct empno,empname,salary from emp;


insert into emp values(7566,'aaaa','female','managen',7839,'1981-04-02',2975,null,30);

select distinct empno,empname,salary from emp;



# 3.ifnull()

select extra from emp;

select ifnull(extra,0) from emp;


select salary + ifnull(extra,0) as 实发工资 from emp;

排序-order by

我们已经看到使用SQL SELECT命令从MySQL表中获取数据。当选择数据行,MySQL服务器可以自由地返回它们的顺序,除非有指示它按照怎样的结果进行排序。但是排序结果可以通过增加一个ORDER BY子句设定列名称或要排序的列。

order   by :指定数据返回的顺序,用法:select * from 表 order by  字段  排序方式

asc:升序【Ascending】,默认

desc:降序【Descending】

select * from emp order by salary asc;

select * from emp where gender='male' and empname like '_l%' order by salary asc;

select avg(salary) from emp where gender = 'female' group by deptno order by avg(salary);

分组查询-group by

group by:分组查询

where :当。。。。表示条件

having:有….,表示条件

注意:分组之后查询的字段格式应该是:分组字段,聚合函数

【面试题】where和having 的区别

a.where表示在分组之前条件限制条件,having表示在分组之后添加限制条件

b.where之后不能跟聚合函数,但是,having后可以使用聚合函数进行筛选

# 1.查询每个部门的平均工资

select deptno,avg(salary) from emp group by deptno;


# 2.查询男员工和女员工的最高收入

select gender,max(salary) from emp group by gender;


# 3.查询每个部门女性员工的平均工资,以平均工资进行降序排序

select deptno,avg(salary) from emp where gender='female' group by deptno order by avg(salary) desc;


# 4.查询平均工资高于2500的部门

select deptno,avg(salary) from emp group by deptno having avg(salary)>2500;


# 5.查询每个部门男性员工的平均工资大于2800的部门

select deptno,avg(salary) from emp where gender='male' group by deptno having avg(salary)>2800;

分页查询-limit

limit:用来限定查询结果的起始行,以及总行数

语法:limit  i,n

说明:i表示起始的索引,n表示需要查看的条数

# 1,查询前两条数据

select * from emp limit 2;

select * from emp limit 0,2;


# 2.从索引为2的位置开始,向后查询两条

# 或者  从第三条开始,查询两条

select * from emp limit 2,2;


select * from emp limit 5,4;


文章转载自稍不留神论,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论