mysql 02: 简单查询

MySQL的安装与配置

  • 方法1:直接安装与配置mysql

  • 方法2:docker运行mysql

    docker pull mysql // 拉取镜像

    docker run -d -p 3306:3306 -v /home/wangxun/mysql/conf:/etc/mysql/conf.d
    -v /home/wangxun/mysql/data:/var/lib/mysql
    -v /home/wangxun/mysql/sqlScript:/sqlScript
    -e MYSQL_ROOT_PASSWORD="xxxx"
    --name=mysql_test mysql // 运行容器 + 挂载卷 + 设置登陆密码

登陆MySQL

  • mysql -uroot -p

DB DBMS SQL的关系

  • DBMS --(执行)--> SQL --(操作)--> DB

对表的理解

  • 数据库的基本组成单元
  • 由行和列组成
    • 行表示记录,列表示字段
    • 字段包括:字段名,类型,约束

对SQL语句的分类

  • DQL:select查询 --> 数据查询语言
  • DML:insert, delete, update, 对表中数据的增删改 --> 数据操作语言
  • DDL:create, drop, alter, 对表结构的增删改 --> 数据定义语言
  • TCL:commit提交事务, rollback回滚事务 --> 事务控制语言
  • DCL:grant授权, revoke撤销权限 --> 数据控制语言

导入数据

  • 查看数据库:show databases;
  • 创建数据库:create database wangxun;
  • 使用数据库:use wangxun;
  • 查看数据表:show tables;
  • 初始化数据
    • set names utf8;
      • 设置命令行字符编码,核心目的:mysql字符集,sql脚本字符集,命令行窗口字符集的统一
    • source XXX.sql;
      • 执行sql脚本,批量执行sql语句
  • 删除数据库:drop database wangxun;

对sql脚本的理解

  • 批量化的sql语句
  • 重要的命令:source xxx.sql;
  • 脚本示例:
drop database if exists wangxun;

create database wangxun;

use wangxun;

drop table if exists tb_dept;
drop table if exists tb_emp;
drop table if exists tb_salgrade;

create table tb_dept(deptno int(2) primary key not null,
dname varchar(14) default null,
loc varchar(13) default null
);


create table tb_emp(empno int(4) primary key not null,
ename varchar(10) default null,
job varchar(9) default null,
mgr int(4) default null,
hiredate date default null,
sal double(7,2) default null,
comm double(7,2) default null,
deptno int(2) default null
);

create table tb_salgrade(grade int(11) default null,
losal int(11) default null,
hisal int(11) default null
);

commit;

mysql常用命令(了解)

注意区分mysql命令和标准sql语句

  • 查看使用的数据库名称:select database();

  • 查看使用的数据库版本:select version();

  • 结束一条语句:\c

  • 退出mysql:exit

  • 显示指定数据库中的表:show tables from database_name;

  • 查看创建表的语句:show create table table_name;

  • 查看表结构:desc tb_name;

正式学习sql语句

简单的查询语句(DQL)

  • 语法格式:select 字段名1, 字段名2, ... from tb_name;
  • 查询单个字段,多个字段,全字段(*)
    • select * from tb_name,实际开发不建议用*号,效率低
  • 任何sql语句以分号结尾
  • sql语句不区分大小写
  • 字段可以参与算术运算
  • 可以给查询结果的列重命名
    • 通过as关键字
    • 以空格分隔
  • sql语句中的字符串用单引号括起来(mysql可以用双引号)

条件查询

  • 语法格式:

    select XXX		--最后执行
    from   XXX		--先执行
    where  XXX;		--再执行
    
  • 运算符

    <
    <=
    >
    >=
    <> 或者 !=		 --不等于
    
    between...and...	 --数字方面:闭区间,字符方面:左闭右开
    
    and			 --注意运算符的优先级
    or
    
    null			 --数据库方面,null代表空,不代表一个空值,不能用等号衡量,只能用:is null 或者 is not null
    
    in                       --等同与or,括号里不是区间,是独立的值,还有:not in,不是括号里的那几个值
    
    like                     --模糊查询,两个特殊符号:'%' 和 '_',百分号代表:任意多个字符,下划线代表:任意一个字符
    			 --注意转义字符的使用'\'
    

数据排序

  • select XXX from tb_name order by YYY asc/desc,按照YYY来排序

    • 升序:asc
    • 降序:desc
    • 默认:升序
  • 按照 XXX 降序排,当XXX相同时,按照YYY升序排:select XXX, YYY from tb_name order by XXX desc, YYY asc;

    • 越往前,越能起到排序的主导作用,只有当前面的字段,无法起到排序的作用时,才会启动后面的字段,否则不会启动后面字段
    • 还可以按照字段在第几列来进行排序
      • 但是不健壮,当字段顺序发生改变时,sql语句就不能用了
  • select col_name from tb_name where condition order by condition;

    • 执行顺序:from --> where --> select --> order by

    • 通过起别名来验证语句执行的顺序

      • select ename, sal as salary from emp order by salary;

分组函数

  • 分组函数都是对某一(字段)组数据进行操作的,一共5个,另一个名字:多行处理函数,即:输入多行,输出一行

    • count:计数
    • sum:求和
    • avg:平均值
    • max:最大值
    • min:最小值
  • 自动忽略:NULL

    • 数据库里的规定:只要表达式里有NULL,结果一定是NULL
  • sql中的一个语法规则:分组函数,无法单独出现在where字句后面

    • 因为:group by 是在where执行之后才会执行

    • select		5
      	..
      from 		1
       	..
      where		2	--第一层过滤
      	..
      group by	3	--第一层过滤后分组
      	..
      having 		4	--第二层过滤
      	..
      order by	6
      	..
      
    • 一条sql语句,如果没有group by,则会有一条缺省的group by,用来将整张表分为一组

  • count(*)和count(某个具体字段)

    • count(*):记录条数,与字段无关
    • count(某个具体字段):该字段不为空的记录条数
  • 可以组合起来使用

单行处理函数

  • 单行处理函数:输入一行,输出一行,输入几行,输出几行
  • ifnull():空处理函数
    • 语法:ifnull(XXX, YYY),如果XXX为NULL,则当作YYY使用

分组查询

  • group by:按照某个字段或者某些字段进行分组

    • select max(XX) from tb_name group YY;

    • 分组函数一般都会和group by 联合使用,且都会在group by之后执行,当一条sql语句无group by语句,整张表的数据自成一组

    • 当一条sql有group by语句,select 后只能跟参与分组的字段名和分组函数

    • 多个字段联合起来,一块分组

      select
      	dept, job, max(sal)
      from 
      	emp
      group by
      	deptno, job;
      
  • having:对分组之后的数据进行再次过滤

    • 薪资大于2900
      • select max(sal), deptno from emp group by deptno having max(sal) > 2900; //效率低
      • select max(sal), deptno from emp where sal > 2900 group by deptno; //效率更高
        • 如果是原表中的字段,未经过分组函数处理,可以先过滤再分组,提前把不合理的数据筛除
    • 平均薪资大于2000
      • select avg(sal), deptno from emp group by deptno having avg(sal) > 2000;
      • select avg(sal), deptno from emp where avg(sal) > 2000 group by deptno; //错误
        • 当where搞不定时,仍要用having
    • having是group by的搭档,对分完组之后的数据不满意,再次过滤,如果第一次(where)可以过滤,一定提前过滤

一个完整的DQL语句

select 				// 5 查询出数据
	..		
from 				// 1 从哪张表里查询
	..
where				// 2 第一层过滤
	..
group by			// 3 分组
	..
having				// 4 第二层过滤
	..
order by			// 6 将查询出的数据以某顺序输出
	..

关于查询结果集的去重

  • distinct
    • select distinct XXX from tb_name;
    • 只能出现在所有字段的最前面
    • select distinct XXX, YYY from tb_name;
      • distinct后面所有字段联合去重
    • 统计岗位数量
      • select count(distinct job) from tb_name;
posted @ 2022-07-27 22:04  rocket-raccoon  阅读(33)  评论(0编辑  收藏  举报