【数据库】必知必会~

举报
xcc-2022 发表于 2022/11/28 18:49:52 2022/11/28
【摘要】 12、表结构:​ 不看表中的数据,只看表的结构,有一个命令:desc 表名;mysql> desc dept;+--------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+...

12、表结构:

​ 不看表中的数据,只看表的结构,有一个命令:desc 表名;
mysql> desc dept;

image-20221022090133475

+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| DEPTNO | int(2)      | NO   | PRI | NULL    |       |部门编号
| DNAME  | varchar(14) | YES  |     | NULL    |       |部门名字
| LOC    | varchar(13) | YES  |     | NULL    |       |地理位置
+--------+-------------+------+-----+---------+-------+
mysql> desc emp;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| EMPNO    | int(4)      | NO   | PRI | NULL    |       |员工编号
| ENAME    | varchar(10) | YES  |     | NULL    |       |员工姓名
| JOB      | varchar(9)  | YES  |     | NULL    |       |工作岗位
| MGR      | int(4)      | YES  |     | NULL    |       |上级编号
| HIREDATE | date        | YES  |     | NULL    |       |入职日期
| SAL      | double(7,2) | YES  |     | NULL    |       |工资
| COMM     | double(7,2) | YES  |     | NULL    |       |补助
| DEPTNO   | int(2)      | YES  |     | NULL    |       |部门编号
+----------+-------------+------+-----+---------+-------+
mysql> desc salgrade;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| GRADE | int(11) | YES  |     | NULL    |       |工资等级
| LOSAL | int(11) | YES  |     | NULL    |       |最低工资
| HISAL | int(11) | YES  |     | NULL    |       |最高工资
+-------+---------+------+-----+---------+-------+

describe缩写为:desc
mysql> describe dept;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| DEPTNO | int(2)      | NO   | PRI | NULL    |       |
| DNAME  | varchar(14) | YES  |     | NULL    |       |
| LOC    | varchar(13) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

13、简单查询

13.1、查询一个字段?

​ select 字段名 from 表名;
​ 其中要注意:
​ ==select和from都是关键字。==
​ ==字段名和表名都是标识符。==

​ 强调:
​ 对于SQL语句来说,是通用的,
​ 所有的SQL语句以“;”结尾。
​ 另外SQL语句不区分大小写,都行。

	查询部门名字?
		mysql> select dname from dept;

13.2、查询两个字段,或者多个字段

​ 使用逗号隔开“,”
​ 查询部门编号和部门名?
select deptno,dname from dept;

13.3、查询所有字段怎么办?

	第一种方式:可以把每个字段都写上
		select a,b,c,d,e,f... from tablename;

	第二种方式:可以使用*
		select * from dept;

这种方式的缺点:
1、效率低
2、可读性差。
在实际开发中不建议,可以自己玩没问题。
你可以在DOS命令窗口中想快速的看一看全表数据可以采用这种方式。

13.4、给查询的列起别名?

mysql> select deptno,dname as deptname from dept;

		+--------+------------+
		| deptno | deptname   |
		+--------+------------+
		|     10 | ACCOUNTING |
		|     20 | RESEARCH   |
		|     30 | SALES      |
		|     40 | OPERATIONS |
		+--------+------------+

使用as关键字起别名。
注意:只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname
记住:select语句是永远都不会进行修改操作的。(因为只负责查询)

as关键字可以省略吗?可以的
		mysql> select deptno,dname deptname from dept;

​ 假设起别名的时候,别名里面有空格,怎么办?

mysql> select deptno,dname dept name from dept;
		DBMS看到这样的语句,进行SQL语句的编译,不符合语法,编译报错。
		怎么解决?
			select deptno,dname 'dept name' from dept; //加单引号
			select deptno,dname "dept name" from dept; //加双引号

注意:在所有的数据库当中,字符串统一使用单引号括起来,
单引号是标准,双引号在oracle数据库中用不了。但是在mysql中可以使用。

​ 再次强调:数据库中的字符串都是采用单引号括起来。这是标准的。双引号不标准。

13.5、计算员工年薪?sal * 12

mysql> select ename,sal from emp;

mysql> select ename,sal*12 from emp; // 结论:字段可以使用数学表达式!

mysql> select ename,sal*12 as yearsal from emp; //起别名
mysql> select ename,sal*12 as '年薪' from emp; //别名是中文,用单引号括起来。

14、条件查询

14.1、什么是条件查询?

​ 不是将表中所有数据都查出来。是查询出来符合条件的。
​ 语法格式:

select  字段1,字段2,字段3....from 表名 where 条件;

14.2、都有哪些条件?

=等于

查询薪资等于800的员工姓名和编号?
select empno,ename from emp where sal = 800;

image-20221018082551007

<>或!= 不等于

查询薪资不等于800的员工姓名和编号?
		select empno,ename from emp where sal != 800;
		select empno,ename from emp where sal <> 800; // 小于号和大于号组成的不等号
image-20221018082703704

< 小于

查询薪资小于2000的员工姓名和编号?
		mysql> select empno,ename,sal from emp where sal < 2000;

<= 小于等于

查询薪资小于等于3000的员工姓名和编号?
		select empno,ename,sal from emp where sal <= 3000;

>大于

查询薪资大于3000的员工姓名和编号?
		select empno,ename,sal from emp where sal > 3000;

>= 大于等于

查询薪资大于等于3000的员工姓名和编号?
		select empno,ename,sal from emp where sal >= 3000;

and

那如果我要查询2000到3000之间的值呢:

第一种方式:>= and <= (and是并且的意思。)

查询薪资在20003000之间的员工信息?包括20003000
select empno,ename,sal from emp where sal >= 2000 and sal <= 3000;

image-20221018083338543

第二种方式:

between … and …

 select empno,ename,sal from emp where sal between 2000 and 3000;

image-20221018083350466

注意:
使用between and的时候,必须遵循左小右大。
between and是闭区间,包括两端的值。

我们会查询薪资了,那我们要怎么查找名字呢?

查询SMITH的编号和薪资?
		select empno,sal from emp where ename = 'SMITH'; //字符串使用单引号

image-20221018083639670

is null

is null 为 null(is not null 不为空)

查询哪些员工的津贴/补助为null?
	 select empno,ename,sal,comm from emp where comm = null;
查询哪些员工的津贴/补助不为null?
	 select empno,ename,sal,comm from emp where comm is null;
image-20221018084846591

注意:在数据库当中null不能使用等号进行衡量。需要使用is null
因为数据库中的null代表什么也没有,它不是一个值,所以不能使用
等号衡量。

and 并且

查询工作岗位是MANAGER并且工资大于2500的员工信息?
	select empno,ename,job,sal from emp where job = 'MANAGER' and sal > 2500;

image-20221018085842253

or 或者

查询工作岗位是MANAGERSALESMAN的员工?
		select empno,ename,job from emp where job = 'MANAGER';
		select empno,ename,job from emp where job = 'SALESMAN';

使用or一句到位: select empno,ename,job,sal from emp where job = 'MANAGER' or job = 'SALESMAN';

优先级

那么问题来了:and和or同时出现的话,有优先级问题吗?

查询工资大于2500,并且部门编号为1020部门的员工?
正常逻辑:select *from emp where sal > 2500 and deptno = 10 or deptno = 20;

运行结果:image-20221018091402318

分析以上语句的问题?
and优先级比or高。
以上语句会先执行and,然后执行or。
以上这个语句表示什么含义?

找出工资大于2500并且部门编号为10的员工,或者20部门所有员工找出来。
select *from emp where sal > 2500 and (deptno = 10 or deptno = 20);
	and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”
	以后在开发中,如果不确定优先级,就加小括号就行了。

image-20221018091531986

in (包含)

包含,相当于多个 or (not in 不在这个范围中)

查询工作岗位是MANAGERSALESMAN的员工?
			select * from emp where job = 'MANAGER' or job = 'SALESMAN';
			select * from emp where job in('MANAGER', 'SALESMAN');

image-20221018092706679

==注意:in不是一个区间。in后面跟的是具体的值。==

查询薪资是8005000的员工信息?
			select * from emp where sal = 800 or sal = 5000;
			select *from emp where sal in(800, 5000); //这个不是表示800到5000都找出来。

image-20221018093223784

// not in 表示不在这几个值当中的数据。
			select ename,sal from emp where sal not in(800, 5000, 3000);
image-20221018093316895

not 可以取非,主要用在 is 或 in 中
is null
is not null
in
not in

like

称为模糊查询,支持%或下划线匹配
%匹配任意多个字符
下划线:任意一个字符。
(%是一个特殊的符号,_ 也是一个特殊符号)

找出名字中含有O的?
		mysql> select ename from emp where ename like '%O%';

image-20221018094539052

		找出名字以T结尾的?
			select ename from emp where ename like '%T';
		找出名字以K开始的?
			select ename from emp where ename like 'K%';
		找出第二个字每是A的?
			select ename from emp where ename like '_A%';
		找出第三个字母是R的?
			select ename from emp where ename like '__R%';
找出名字中有“_”的?
		select name from t_student where name like '%_%'; //这样不行。
 select name from t_student where name like '%\_%'; // \转义字符。

15 、排序

15.1 升序(asc)

select ename,sal from emp  order by sal ;//默认是升序
select ename,sal from emp  order by sal asc;

15.2 降序(desc)

select ename,sal from emp  order by sal desc;

image-20221018101119864

15.3 多字段排序

查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,再按照名字升序排列。
	select empno,ename,sal from emp order by sal asc ,ename asc;// sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。

15.4 根据字段位置排序

select ename,sal from emp order by 2; // 2表示第二列。第二列是sal
	按照查询结果的第2列sal排序。
image-20221018102857075

了解一下,不建议在开发中这样写,因为不健壮。因为列的顺序很容易发生改变,列顺序修改之后,2就废了。

16、综合案例

找出工资在12503000之间的员工信息,要求按照薪资降序排列。
select * from emp where sal between 2500 and 5000 order by sal desc;

image-20221018103212150

==关键字顺序不能变:==
select…from…where…order by…

	以上语句的执行顺序必须掌握:
		第一步:from
		第二步:where
		第三步:select
		第四步:order by(排序总是在最后执行!)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。