mysql----查询(DQL)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43666423/article/details/96478412

MySQL
1。创建数据库:create database +数据库名;
2。删除数据库:drop database + 数据库名;
3。指定当前用的数据库:use + 数据库名;
4。终止一条SQL语句,重新输入:\c
5。导入数据到数据库:source 文件位置\文件.sql(必须在先使用数据库的时候,才能导入)
6。查询数据:显示表格:show tables;(显示所有表格)
查询表格结构:desc 表格名;(查询表格组成)
7。查询当前数据库管理系统中有多少个数据库:show databases;(数据库管理系统会自带几个数据库)
8。在进入DBMS后,查看MySQL版本:select version();
在没进入DBMS时,查看MySQL版本:MySQL --version
9。查询当前正在使用的是哪个数据库:select database();
10。退出MySQL:exit 或 快捷键:ctrl+ c 或 quit
11。在当前数据库中查看别的数据库中的表:show tables from +别的数据库名称;
12。查看当初创建这张表的时候使用的是那些语句:show create table +表的名字;
注:SQL语句不区分大小写,SQL语句后需要加分号;

查询语句

  1. select +需要查询的数据 + from + 需要查询的数据所在的表;
    (如:select name from onetable; 为从onetable中查询name的相关信息)

多字段查询:
select +需要查询的数据1,需要查询的数据2 + from + 需要查询的数据所在的表;
(如:select name,age from onetable; 为从onetable中查询name和age的相关信息)

查询表中的所有数据:select * from onetable;(不建议使用*,最好将所有要查询的数据全部写出来)

  1. 可以在SQL语句中直接进行计算

select name,sal*12 from onetable; (name为员工名字,sal为员工的月薪,这个语句为从onetable中查询员工的年薪)
注:该语句只是将数据库中的数据查询出来,并不会修改数据库中的数据;

select name,sal12 as yearsal from onetable;
as yearsal作用是将显示的输出的表中sal
12替换为yearsal,更清晰的表达出表的数据(as关键字可以省略不写,空格就行)(yearsal可以是中文,但是要用单引号将中文字段括起来,但不建议用中文,别给自己找麻烦)
注:同样,该语句只是将数据库中的数据查询出来,并不会修改数据库中的数据;

条件查询
​​在这里插入图片描述

  1. select name,sal from onetable where sal = 5000;
    在onetable中查询工资等于5000的员工,where关键字后写条件;
    上面的条件也可以写成:sal = ‘5000’;同样正确,他会自动转型

  2. select name,sal from onetable where sal >=3000 and sal <= 5000;
    select name,sal from onetable where sal between 3000 and 5000;(between中前面是小值3000,后面是大值5000)
    两条语句都表示找出sal大于等于3000 并且小于与等于5000的数据;

select name from onetable where name between ‘A’ and ‘F’;
(表示查询表中的name中首字母在A到F之间的数据,包括A,但不包括F)

  1. is null用法
    select comm from onetable where comm is null;
    comm 为补助,查询表格中补助为空的数据;不能用 comm=null;

  2. in
    select name,sal from onetable where sal in(3000,5000);
    找出工资为3000 和 5000的员工数据
    select name,sal from onetable where name in(‘tony’,‘mency’);
    找出名字为tony和mency的员工;
    注:查找字符时加的单引号,not in 即查找工资不为3000或5000的员工数据,名字不为tony或mency的员工数据
    注:not in 后面如果是表格,那么表格中的要查的数据不能为空,如果为空,需要先去除空值;但是in不用,in可以自动去除空值;
    in后面也可以接一个表格;

  3. like(模糊查询)
    select name from onetable where name like ‘%o%’;
    查询名字中带有o的员工;
    注:“%”代表0-n个任意字符

select name from onetable where name like ‘o%’;
查询名字中第一个字母是o的员工;

select name from onetable where name like ‘%o’;
查询名字中最后一个字母是o的员工;

select name from onetable where name like ‘_o%’;
查询名字中第二个字母是o的员工;
注:一个下划线代表一个任意字符

排序

  1. order by 字段 asc\desc(注:asc:升序,desc:降序)

select name,sal from onetable order by sal asc;
select name,sal from onetable order by 2 ;(不建议使用这种方法)
两种方法都是将薪水按照升序排列

select name,sal from onetable order by sal asc,name asc;
先按工资排序,工资相同的情况下,按名字的排序;

数据处理
​​在这里插入图片描述

select lower(ename) from emp; (lower:小写)
将ename字段的数据从emp中取出,并且小写

select upper(ename) from emp; (upper:大写)
将ename字段的数据从emp中取出,并且大写

select substr(ename,a,b) from emp;
从emp中取出ename字段中每个数据(从第a个字符开始截取,截取长度为b)
​​在这里插入图片描述截取第二个字母是A的数据

select length(ename) from emp;
获取ename字段中的每个数据(名字)的长度

​​在这里插入图片描述
去除前后空白,即在不考虑空格的情况下进行搜索

select round(123.456,a); (round:四舍五入)
a为保留小数点的位数
select round(123.456,2);结果为:123.46

select round(rand()*100);
生成0到100 的随机数

select ename,ifnull(comm,’a‘) as comm from emp;
如果comm字段代表的数据为空,则显示a,并将字段的名字重命名为comm
注:在数据库里边,只要有空值参与的运算结果都为空;

str_to_date
查询1981-02-20入职的员工(将字符串转换成date类型)
select * from emp where HIREDATE=str_to_date(‘1981-02-20’,’%Y-%m-%d’);select * from emp where HIREDATE=str_to_date(‘02-20-1981’,’%m-%d-%Y’);
注意:Y大写

date_format
查询1981-02-20以后入职的员工,将入职日期格式化成yyyy-mm-dd hh:mm:ss
select empno, ename, date_format(hiredate, ‘%Y-%m-%d %H:%i:%s’) as hiredate from emp;

now() 获得当前时间
select date_format(now(),’%Y-%m-%d %H %i %s’);

分组函数(自动忽略空值)
count/sum/avg/min/max
count :记录一共有多少个数据
avg:数据的平均值
例:select max(sal) from emp; 求出薪水中的最大值

select count(sal) from emp; 求出薪水的个数
count(字段):这个字段中不为空的元素总数

select count(sal) from emp where comm is
;
count(*):所有字段中满足后面条件的元素总条数
注:分组函数不能直接使用在where语句中

distinct(去重)
select distinct ename from emp; 去除字段中重复的内容
select distinct deptno,job from emp; 去除两个字段中同样重复 - 的内容;即 部门和工作岗位 都相同的情况下,去重;
注:distinct只能出现在所有字段的前方

分组(group by,having)
group by:对字段进行分组;
select deptno,avg(sal) from emp group by deptno; 先对deptno进行分组,然后在每组中求sal的平均值;
注:查询字段中不能有分组之外的字段,如:
select ename,deptno,avg(sal) from emp group by deptno;是不被允许的;

select deptno,avg(sal) from emp where deptno<>‘10’ group by deptno; 先设定条件,再分组;

having和where一样,都是对数据进行过滤,后面都是添加条件
但:where是在group by 之前对数据进行过滤;
having是在group by 之后对数据进行过滤;
select job,avg(sal) from emp group by job having avg(sal) > 1500;
注:在where 可以过滤的情况下,先使用where 进行过滤;之后再考虑having ;

sql语句的关键词顺序,不能改变
​​在这里插入图片描述
​​在这里插入图片描述

内链接和外连接
​​在这里插入图片描述
即在emp表中查询ename,在dept表中查询dname,过滤条件是两张表中的deptno相同(e.deptno = d.deptno)

​​在这里插入图片描述
sql99比sql92好的地方是如果不满意结果,可以在后面直接加where + 条件,而sql92则需要在后面加and,再加过滤条件;相比之下sql99结构更清晰;

inner可以省略不写
在这里插入图片描述
内外连接区别
​​在这里插入图片描述

外连接
​​在这里插入图片描述
​​在这里插入图片描述
注:任何一个右外连接都可以写成左外连接,反之同理;
注:​​
在这里插入图片描述
多张表进行连接:
​​在这里插入图片描述
注:a先和b进行连接,满足后面的条件;然后,a和c进行连接,同样满足后面的条件;

子查询
​​在这里插入图片描述

在where后面出现出现子查询:
找出公司薪水比平均薪水高的员工:
select ename,avg(sal) from emp; — 2066.071429
select ename,sal from emp where sal > 2066.071429;
两式合并得下面:
select ename,sal from emp where sal > (select avg(sal) from emp);

在from后面出现子查询
​​在这里插入图片描述
​​在这里插入图片描述

在select后出现子查询
​​在这里插入图片描述

union:(将两个结果合并在一起)
​​在这里插入图片描述
注:两个语句的字段的数量必须相同,字段名可以不同,类型也可以不同;

limit:(mysql数据库中独有的)​​
在这里插入图片描述
在这里插入图片描述
​​在这里插入图片描述
​​
limit出现在sql语句中的最后位置:
​​在这里插入图片描述

分页查看:
​​在这里插入图片描述
pageNo:页数,即第几页
pageSize:每页的信息条数,即每页有多少条信息
t:某个表
t.x:表中的某个字段
注:因为一张表中的数据太多的话,在一页显示的话不方便,所以可以分页;

补充:case…when…then…when…then…else…end
select
ename,sal,newsal as (case sal when ‘1600’ then sal1.5 when ‘2500’ then sal1.1 else sal end)
from
emp;
这段语句表示查询薪水和新薪水,
新薪水是:当(case)薪水(sal)为1600时,薪水变为原来的1.5倍成新薪水,当薪水为2500时,薪水变为原来的1.1倍成新薪水,其余的薪水不变,依然为原来的数;
注:练习题:https://www.bilibili.com/video/av14716238/?p=58
https://www.bilibili.com/video/av14716238/?p=59

补充:to_days(hiredate),是一个将年转换成天数的函数
如:select to_days(now());结果为737401

猜你喜欢

转载自blog.csdn.net/qq_43666423/article/details/96478412