MySQL(基础篇)

Posted 不做码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL(基础篇)相关的知识,希望对你有一定的参考价值。

mysql(基础篇)

通过本文的学习,你将会学会MySQL的一些基本知识。

一、MySQL概述

MySQL是一种开源的关系型数据库管理系统(RDBMS)。

1.1分类

MySQL分为以下的几种类型:

  • DML(Data Manipulation Language): 数据操纵语句,用于添加、删除、修改、查询数据库记录,并检查数据完整性
INSERT:添加数据到数据库中。
UPDATE:修改数据库中的数据。
DELETE:删除数据库中的数据。
SELECT:选择(查询)数据。(SQL语言的基础,重要)
  • DDL(Data Definition Language): 数据定义语句,用于库和表的创建、修改、删除。
CREATE TABLE:创建数据库表
ALTER TABLE:更改表结构、添加、删除、修改列长度
DROP TABLE:删除表
CREATE INDEX:在表上建立索引
DROP INDEX:删除索引
  • DCL(Data Control Language): 数据控制语句,用于定义用户的访问权限和安全级别。
COMMIT:提交事务处理
ROLLBACK:事务处理回退
SAVEPOINT:设置保存点
GRANT:授予访问权限
REVOKE:撤销访问权限
LOCK:对数据库的特定部分进行锁定

1.2图解MySQL程序结构

MySQL程序结构

1.3启动和停止MySQL服务

通过命令行:

   启动:net start mysql 服务名
   停止:net stop mysql 服务名

1.4MySQL服务端的登录退出

通过命令行:

    登录:mysql –h 主机名 –u用户名 –p密码
   退出:exit

1.5MySQL语法规范

  • 不区分大小写
  • 每句话用 ;\g结尾
  • 各子句一般分行写
  • 关键字不能缩写也不能分行
  • 用缩进提高语句的可读性

二、查询

查询是SQL语言的基础!!!

2.1基础查询

  1. 语法

    select  查询列表  from 表名;
  2. 特点

    • 查询列表可以是表中的 字段常量值表达式函数
    • 查询的结果是一个虚拟的表格
  3. 案例

    # 1.查询表中的字段
    select last_name from employees;
    # 2.查询所有的字段
    select * from employees;
    # 3.如果要查询的字段有重名的情况,使用别名可以区分开来
    # 起别名(使用AS)
    select last_name as 姓,first_name as 名 from employees;
    # (不带AS)
    select last_name 姓,first_name 名 from employees;
    # 4.去重(使用distinct)
    select distinct department_id from employees;
    # 5.+号的作用(+号在mysql 中只要一个作用:运算符)
    select 100 + 90; #两个操作数都是数值型,则做加法运算
    select '123' + 90; #其中一个为字符型,试图将字符型数值转换为数值型,如果转换成功,则继续做加法运算
    select 'wzl' + 90; #如果转换不成功,则将字符型数值转换为0
    select null + 90; #只要其中一方为null,则结果肯定是null
    # 6.字符串连接(concat) 显示全名
    select concat(last_name,first_name) from employees;

2.2条件查询

  1. 语法

    select  查询列表 from 表名 where 筛选条件;
  2. 分类

    • 按条件表达式筛选

      条件运算符> < = < >  != >= <=

    • 按逻辑表达式筛选:用于连接条件表达式

      逻辑运算符&& || and or not

    • 模糊查询

    like

    • like一般和通配符搭配使用
    • %任意多个字符包含0个字符
    • _任意单个字符

    between and

    • 提高语句的简洁度
    • 包含临界值 且两个临界值不要调换顺序

    in

    • 判断某字段的值是否属于in列表的某一项
    • in列表中的值类型必须一致或者兼容

    is null

    • = 或<>不能用来判断null值
    • is null 或者is Not null可以判断null值
  3. 案例

    ## 1.按条件表达式筛选 
    ## 查询员工工资>12000的员工信息
    select * from employees where salary > 12000;
    ## 查询部门编号不等于90号的员工名和部门编号
    select last_name 员工名,department_id 部门编号
    from employees
    where department_id != 90;
    ## 2.按逻辑表达式筛选
    ## 查询工资在10000到20000之间的员工名、工资以及奖金
    select last_name 员工名,salary 工资,commission_pct 奖金
    from employees
    where salary >=10000 and salary <= 20000;
    ## 3.like
    ## 查询员工名中包含字符z的员工信息
    select * from employees where last_name like '%z%';
    ## 查询员工名中第二个字符为z的信息
    select * from employees where last_name like '_z%';
    ## 4.between and
    ## 查询员工编号在100到120之间的员工信息
    select * from employees where employee_id >= 100 and employee_id <= 120;

    select * from employees where employee_id BETWEEN 100 and 120;
    ## 5.in
    ## 查询员工的工种编号为001、002、003中的员工信息
    select * from employees
    where job_id = '001' or job_id = '002' or job_id = '003';

    select *
    where job_id in('003','001','002');
    ## 6.is null
    ## 查询编号为null的员工信息
    select * from employees where employee_id is null

2.3排序查询

  1. 语法

    select 查询列表 from 表 where 筛选条件 order by 排序列表 asc|desc
  2. 特点

    • asc是升序, desc是降序   默认升序
    • order by子句中可以支持单个字段,多个字段,表达式,函数,别名
    • order by子句一般放在最后, limit子句除外
  3. 案例

    ## 查询员工信息,要求工资从高到低
    select * from employees order by salary desc;

2.4常见函数

  1. 函数就是将一组逻辑语句封装,对外暴露了方法名称,为了实现特定的功能,类似于java中的方法

  2. 特点

    • 隐藏了实现细节
    • 提高了重用性
  3. 语法

    select 函数名(实参列表) from 表;
  4. 分类

    • 单行函数

      concatlengthifnull

    • 分组函数(统计函数,聚合函数、组函数)

      sum 求和、avg 平均值、max 最大值、min最小值、count数量等

  5. 特点

    • sum, avg一般用于处理数值型, max, min, count可以处理任意类型
    • 分组函数都忽略null值
    • 可以和 distinct搭配去重运算
    • count函数一般使用count(*)做计算行数
    • 分组函数一同查询的字段要求是 group by后的字段
  6. 案例

    # 1.字符函数
    # length(str) 获取参数值的字节个数(字母1个字节,汉字3个字节)
    select length('wzl');
    # cancat(str1,str2,...) 拼接字符串
    select concat(last_name,'_',first_name) from employees;
    # lower(str) 小写,upper(str) 大写
    select upper('wzl');
    # substr、substring(注意索引从1开始) 截取字符串
    select substr('wzllby',4); /*截取从指定索引处后面的字符*/
    select substr('wzllby',2,3); /*截取从指定索引处指定字符长度的字符*/
    # insrt(str,substr) 返回子串第一次出现的索引,如果找不到返回0
    select instr('wzllby','wzl');
    # trim 去掉字符前后的空格
    select trim('a' from 'aaaaawzlaaaalbyaaaaaaaa');/*去掉字符串前后的某个字符*/
    # lpad(str,len,padstr) 用指定的字符实现左填充指定的长度
    # rpad(str,len,padstr) 用指定的字符实现右填充指定的长度
    select lpad('wzl',10,'*');
    select rpad('wzl',10,'*')
    # replace 替换
    select replace('wzllbywzllby','wzl','lby');

    # 2.数组函数
    # round 四舍五入
    select round(2.61); /*四舍五入*/
    select round(2.61,1); /*四舍五入,保留1位小数*/
    # ceil 向上取整,返回>=该参数的最小整数
    # floor 向下取整,返回<=该参数的最大整数
    select ceil(4.558);
    select floor(4.558);
    # truncate 截断
    select truncate(4.558,2);
    # mod 取余
    select mod(10,3);

    # 3.日期函数
    # now() 返回当前系统日期+时间
    # curdate() 返回当前系统日期,不包含时间
    # curtime() 返回当前系统时间,不包含日期
    # 获取指定的年、月、日、小时、分钟、秒
    select year(now()); /*年*/
    select month(now()); /*月*/
    select monthname(now()); /*英文月名*/
    # str_to_date() 将字符通过指定的格式转换为日期
    select str_to_date('1998-05-08','%Y-%m-%d');
    # date_format() 将日期转换为字符
    select date_format(now(),'%Y年%m月%d日');
    # datediff() 计算两个时间相差的天数
    select datediff(now(),'1997-4-5');

    # 4.其他函数
    # 版本version()
    # 数据库 database()
    # 用户user()

    # 5.分组函数
    select sum(salary) from employees;
    select avg(salary) from employees;
    select max(salary) from employees;
    select min(salary) from employees;
    select count(salary) from employees;

2.5流程控制函数

  1. 语法

    # if-else 的效果 if函数
    select if(逻辑运算,true值,false值)
    #  switch case的效果 case函数使用一
    case 要判断的字段或表达式
    when 常量1 then 要显示的值1或语句1;
    ...
    else 要显示的值n或语句n;
    end
    # 多重if的效果 case函数的使用二
    case
    when 条件1 then 要显示的值1或语句1
    ...
    else 要显示的值n或语句n
    end


  2. 案例

    # 1.if函数
    select if(20 > 5,20,5);
    # 2.case的第一种使用方式
    # 要求部门号=001,显示工资 * 2 部门号=002,显示工资 * 1.5,部门号=003,显示工资 * 3,其他部门,显示原工资
    select salary,department_id,
    case department_id
    when 001 then salary*2
    when 002 then salary*1.5
    when 003 then salary*3
    else salary
    end 新工资
    from employees;
    # 3.case的第二种使用方式
    # 如果工资>10000,显示A;如果工资>6000,显示B;如果工资>4000,显示C;否则,显示D
    select salary,
    case
    when salary>10000 then 'A'
    when salary>6000 then 'B'
    when salary>4000 then 'C'
    else 'D'
    end 等级
    from employees;

2.6分组查询

  1. 语法

    select 分组函数,列(要求出现在group by的后面)
    from 表
    group by 分组的列表
  2. 特点

    • 分组前筛选:使用 wheregroup by之前
    • 分组后筛选:使用 havinggroup by之后
  3. 案例

    # 1.查询每个工种的最高工资
    select job_id,max(salary) from employees group by(job_id);
    # 2.查询部门的员工个数>2的部门id
    select count(*),department_id
    from employees
    group by department_id 、
    having count(*) >2;

2.7连接查询(多表查询)

  1. 含义

    当查询的字段来自于多个表时,就会用到连接查询。

  2. 笛卡尔乘积

    表1有m行,表2有n行,结果=m*n行

    避免方式:添加有效的连接条件

  3. 分类

    内连接(inner):等值连接、非等值连接、自连接

    外连接:左外连接(left outer)、右外连接(right outer)、全外连接(full outer)

    交叉连接(cross )

  4. 语法

    select 查询列表
    from 表1 别名 【连接类型】
    join 表2 别名
    on 连接条件
  5. 内连接特点

    • 添加排序、分组、筛选
    • inner可以省略
    • 筛选条件放在where后,连接条件放在on后,提高分离性,便于阅读
  6. 外连接特点

    • 外连接查询结果= 内连接结果+ 主表中有而从表没有的记录
    • 左外连接, left join左边的是主表;右外连接, right join右边的是主表
    • 左外和右外交换两个表的顺序,可以实现同样的效果
    • 全外连接= 内连接的结果+ 表1中有但表2没有的+ 表2中有但表1没有的

2.8分页查询

  1. 语法

    select 查询列表
    from 表
    where 筛选条件
    group by 分组字段
    having 分组后的筛选
    order by 排序的字段】
    limit offset,size;
    /*offset要显示条目的起始索引(起始索引从0开始)size 要显示的条目个数*/
  2. 特点

    • limit语句放在查询语句的最后

    • 公式:要显示的页数 page,每页的条目数size

      select 查询列表
      from 表
      limit (page-1)*size,size;
  3. 案例

# 查询前五条员工信息
select * from employees limit 0,5;
# 查询第6条——第10条员工信息
select * from employees limit 5,5;

2.9联合查询

  1. 联合

    将多条查询语句的结果合并成一个结果

  2. 语法

    查询语句1
    union
    查询语句2
    union
    ...
  3. 应用场景

    查询的结果来自于多个表,且多个表没有直接连接关系,但查询的信息一致

  4. 特点

    • 多条查询语句的查询 列数一致
    • 多条查询语句的查询的 每一列的类型和顺序一致
    • union关键字默认去重,如果使用 union all可以包含 重复项
  5. 案例

    # 查询部门编号=001或工种编号为001的员工信息
    select * from employees where department_id = '001'
    union
    select * from employees where job_id = '001';

三、增删改

3.1插入语句(insert)

  1. 语法

    # 方法一
    insert into 表名(列名,...) values(值1,...);
    # 方法二
    insert into 表名
    set 列名=值,列名=值,...
  2. 特点

    • 插入的值的类型要与列的类型一致或兼容
    • 不可以为null的列必须插入值
    • 列的顺序可以调换
    • 列数和值的个数必须一致
    • 可以省略列名,默认所有列,而且列的顺序和表中列的顺序一致

3.2修改语句(update)

  1. 语法

    update 表名
    set 列=新值,列=新值,...
    where 筛选条件;

3.3删除语句(delete)

  1. 语法

    # 方法一
    delete 表1的别名,表2的别名
    from 表1 别名,表2 别名
    where 连接条件
    # 方法二
    truncate table 表名;
  2. 比较

    • delete 可以加where 条件,truncate不能加
    • truncate删除,效率高一丢丢
    • 假如要删除的表中有自增长列,如果用delete删除后,再插入数据,自增长列的值从断点开始;而truncate删除后,再插入数据,自增长列的值从1开始.
    • truncate删除没有返回值,delete删除有返回值
    • truncate删除不能回滚,delete删除可以回滚

以上是关于MySQL(基础篇)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL基础篇 | 简单的查询条件查询排序查询

MySQL基础篇 | 经典三十四道练习题

Python小白到老司机,快跟我上车!基础篇(十三)

配置 VScode 编辑器 (前端篇)

《MySQL45讲》基础篇总结

MySQL(基础篇)