MySQL数据库(基础一)

MySQL基础知识

什么是表

1、表:table是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。
一个表包括行和列:
行:被称为数据/记录(data)
列:被称为字段(column)

2、每一个字段应该包括哪些属性?

字段名、数据类型、相关的约束

3、SQL语句分类:

DQL(数据查询语言):查询语句,凡是select语句都是DQL
DML(数据操作语言):insert delect update 。对表当中的数据进行增删改。
DDL(数据定义语言):create drop alter,对表结构的增删改。
TCL(事务控制语言):commit提交事务,rollback回滚事务.
DCL(数据控制语言):grant授权、revoke撤销权限等.

4、导入数据

第一步:登录mysql数据库管理系统
通过cd进入安装MuSQL文件目录的bin目录下,(默认安装目录为:C:\Program Files\MySQL\MySQL Server 8.0\bin)
输入:mysql -u root -p
注:Mysql安装成功后,默认的root用户密码为空,所以直接回车就行。
登陆成功后会看见Welcome to the MySQL monitor.,证明成功登录了
在这里插入图片描述
第二步:查看有哪些数据库
show databases; //注意加分号 (这个不是SQL语句,属于MySQL的命令行)
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
±-------------------+
(以上的是系统自带的数据库)
第三步:创建属于我们自己的数据库
create database bjpowernode;(这个不是SQL语句,属于MySQL的命令。)

第四步:使用bjpowernode数据
use bjpowernode; (这个不是SQL语句,属于MySQL的命令。)

第五部:查看当前使用的数据库中有哪些表?
使用 show tables; (这个不是SQL语句,属于MySQL的命令。)
±----------------------+
| Tables_in_bjpowernode |
±----------------------+
| dept |
| emp |
| salgrade |
±----------------------+

第六部:初始化数据

查看版本:select version();

5.bjpowernode.sql,这个文件以sql结尾,这样的文件被称为”sql脚本“。什么是sql脚本呢??

当一个文件的扩展名是.sql,并且该文件中编写了大量的sql语句,我们称这样的文件为sql脚本。
注意:直接使用source命令可以执行sql脚本。
sql脚本的中的数据太大的时候,无法打开,请使用source命令完成初始化。

6.删除数据库:drop database bjpowernode

7.查看表结构:(desc ----) 查看表结构

±----------------------+
| Tables_in_bjpowernode |
±---------------------- +
| dept | (部门表)
| emp | (员工表)
| salgrade | (工资等级表)
±----------------------+

mysql> desc dept
-> ;
±-------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±-------±------------±-----±----±--------±------+
| DEPTNO | int | NO | PRI | NULL | | (部门的编号)
| DNAME | varchar(14) | YES | | NULL | | (部门的名称)
| LOC | varchar(13) | YES | | NULL | | (部门的位置)
±-------±------------±-----±----±--------±------+

mysql> desc emp;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| EMPNO | int | NO | PRI | NULL | |
| ENAME | varchar(10) | YES | | NULL | |
| JOB | varchar(9) | YES | | NULL | |
| MGR | int | YES | | NULL | |
| HIREDATE | date | YES | | NULL | |
| SAL | double(7,2) | YES | | NULL | |
| COMM | double(7,2) | YES | | NULL | |
| DEPTNO | int | YES | | NULL | |
±---------±------------±-----±----±--------±------+

mysql> desc salgrade;
±------±-----±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±-----±-----±----±--------±------+
| GRADE | int | YES | | NULL | |
| LOSAL | int | YES | | NULL | |
| HISAL | int | YES | | NULL | |
±------±-----±-----±----±--------±------+

8.表结构的数据:(select * from ----)

一: mysql> select * from emp;
±------±-------±----------±-----±-----------±--------±--------±-------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
±------±-------±----------±-----±-----------±--------±--------±-------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
±------±-------±----------±-----±-----------±--------±--------±-------+

二: mysql> select * from dept
-> ;
±-------±-----------±---------+
| DEPTNO | DNAME | LOC |
±-------±-----------±---------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
±-------±-----------±---------+

三: mysql> select * from salgrade;
±------±------±------+
| GRADE | LOSAL | HISAL |
±------±------±------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
±------±------±------+
5 rows in set (0.00 sec)

9.常用命令:

查看版本 :mysql> select version();

±----------+
| version() |
±----------+
| 8.0.26 |
±----------+
1 row in set (0.00 sec)

查看当前使用的数据库: mysql> select database();

±------------+
| database() |
±------------+
| bjpowernode |
±------------+

\c 结束一条语句

exit 命令,退出mysql。

10.查看创建表的语句:

show create table emp;

11.简单的查询语句(DQL)

语法格式:

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

提示:1.任何一条sql语句以”;"结尾。
2.sql语句不区分大小写。

查询员工的年薪?
select ename,sal *12 from emp;

给查询结果的列重命名?

select ename,sal*12 as yearsal from emp;
±-------±---------+
| ename | sal *12 |
±-------±---------+
| SMITH | 9600.00 |
| ALLEN | 19200.00 |
| WARD | 15000.00 |
| JONES | 35700.00 |
| MARTIN | 15000.00 |
| BLAKE | 34200.00 |
| CLARK | 29400.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
| TURNER | 18000.00 |
| ADAMS | 13200.00 |
| JAMES | 11400.00 |
| FORD | 36000.00 |
| MILLER | 15600.00 |
±-------±---------+

别名中有中文??

select ename,sal*12 as 年薪 from emp; //错误 ,8.0版本后的这个也正确

select ename,sal*12 as ‘年薪’ from emp; //正确
±-------±---------+
| ename | 年薪 |
±-------±---------+
| SMITH | 9600.00 |
| ALLEN | 19200.00 |
| WARD | 15000.00 |
| JONES | 35700.00 |
| MARTIN | 15000.00 |
| BLAKE | 34200.00 |
| CLARK | 29400.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
| TURNER | 18000.00 |
| ADAMS | 13200.00 |
| JAMES | 11400.00 |
| FORD | 36000.00 |
| MILLER | 15600.00 |
±-------±---------+

注意:标准的sql语句中要求字符串使用单引号括起来。虽然mysql支持双引号,尽量别用。

as 关键字可以省略

select empno,ename,sal*12 yearsal from emp;

查询所有字段?
select * from emp; //实际开发中不建议使用 * ,效率较低。

13.条件查询:

语法格式:
select
字段,字段。。。
from
表明
where
条件;

执行顺序:先from,然后where,最后select

查询工资等于5000的员工的姓名?
	select ename from emp where sal = 5000;

±------+
| ename |
±------+
| KING |
±------+
1 row in set (0.04 sec)

 找出工资高于3000的员工?
 select ename,sal from emp where sal >3000;

select ename,sal from emp where sal>=3000;

select ename,sal from emp where sal<3000;

select ename,sal from emp where sal <=3000;

找出工资不等于3000的?
select ename,sal from emp where sal <> 3000;
select ename,sal from emp where sal != 3000;


找出工资在1100和3000之间的员工,包括1100和3000?
select ename,sal from emp where sal >=1100 and sal <=3000;

select ename,sal from emp where sal between 1100 and 3000;   //between.....and.....是闭区间

select ename,sal from emp where sal between 3000 and 1100;   //查询不到

between and 在使用的时候必须左小右大。

between and 除了可以使用在数字方面之外,还可以使用在字符串方面。//字符方面是左闭右开

select ename from emp where between 'A' and 'C';
+-------+

| ename |
±------+
| ALLEN |
| BLAKE |
| ADAMS |
±------+
3 rows in set (0.04 sec)

找出哪些人没有津贴?
在数据库当中NULL不是一个值,代表什么也没有,为空。
空不是一个值,不能用等号来衡量
必须使用 is null或者is not null
select ename,sal,comm from emp where comm is null;
±-------±--------±-----+
| ename | sal | comm |
±-------±--------±-----+
| SMITH | 800.00 | NULL |
| JONES | 2975.00 | NULL |
| BLAKE | 2850.00 | NULL |
| CLARK | 2450.00 | NULL |
| SCOTT | 3000.00 | NULL |
| KING | 5000.00 | NULL |
| ADAMS | 1100.00 | NULL |
| JAMES | 950.00 | NULL |
| FORD | 3000.00 | NULL |
| MILLER | 1300.00 | NULL |
±-------±--------±-----+

找出哪些人津贴不为NULL?
select ename,sal,comm from emp where comm is not null;
±-------±--------±--------+
| ename | sal | comm |
±-------±--------±--------+
| ALLEN | 1600.00 | 300.00 |
| WARD | 1250.00 | 500.00 |
| MARTIN | 1250.00 | 1400.00 |
| TURNER | 1500.00 | 0.00 |
±-------±--------±--------+

找出哪些人没有津贴?
select ename,sal,comm from emp where comm is null or comm=0;
±-------±--------±-----+
| ename | sal | comm |
±-------±--------±-----+
| SMITH | 800.00 | NULL |
| JONES | 2975.00 | NULL |
| BLAKE | 2850.00 | NULL |
| CLARK | 2450.00 | NULL |
| SCOTT | 3000.00 | NULL |
| KING | 5000.00 | NULL |
| TURNER | 1500.00 | 0.00 |
| ADAMS | 1100.00 | NULL |
| JAMES | 950.00 | NULL |
| FORD | 3000.00 | NULL |
| MILLER | 1300.00 | NULL |
±-------±--------±-----+

找出工作岗位是MANAGER和SALESMAN的员工?

select ename,job from emp where job =‘MANAGER’ or job = ‘SALESMAN’;
±-------±---------+
| ename | job |
±-------±---------+
| ALLEN | SALESMAN |
| WARD | SALESMAN |
| JONES | MANAGER |
| MARTIN | SALESMAN |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| TURNER | SALESMAN |
±-------±---------+

and和or联合起来用:找出薪资大于3000的并且部门编号是20或30部门员工。
select ename,sal,deptno from emp where sal > 1000 and deptno =20 or deptno =30; //错误的
select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30);//正确的
注意:当运算符的优先级不确定的时候加小括号。

in等同于or:找出工作岗位是MANAGER和SALESMAN的员工?
select ename,job from emp where job = 'SALESMAN' or job = 'MANAGER';
select ename,job from emp where job in('SALESMAN','MANAGER');
select ename,job from emp where sal in(1000,5000); //in后面的值不是区间,是具体的值.

not in :不在这几个值当中。
select ename,job from empwhere sal not in(800,5000);

模糊查询like:
找出名字当中含有o的?
(在模糊查询中,必须掌握两个特殊的符号,一个是%,一个是_)
%代表任意多个字符,_代表任意1个字符。
select ename from emp where ename like ‘%o%’;
±------+
| ename |
±------+
| JONES |
| SCOTT |
| FORD |
±------+
找出名字中第二个字母是A的?
select ename from emp where ename like ‘_A%’;
±-------+
| ename |
±-------+
| WARD |
| MARTIN |
| JAMES |
±-------+

找出名字里面有下划线的?
select name from t_user where name like ‘%_%’; //错误
select name from t_user where name like ‘%_%’; //正确

找出名字中最后一个是T的?
select ename from emp where ename like ‘%T’;
±------+
| ename |
±------+
| SCOTT |
±------+

13.排序(升序、降序)

按照工资升序,找出员工名和薪资?
select
ename,sal
from
emp
order by
sal;
±-------±--------+
| ename | sal |
±-------±--------+
| SMITH | 800.00 |
| JAMES | 950.00 |
| ADAMS | 1100.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN | 1600.00 |
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| JONES | 2975.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| KING | 5000.00 |
±-------±--------+
注意:默认是升序。怎么指定 升序或者降序呢? asc表示升序,desc表示降序。
select ename ,sal from emp order by sal; //升序
select ename ,sal from emp order by sal asc; //升序
select ename ,sal from emp order by sal desc; //升序

按照工资的降序排列,当工资相同的时候再按照名字的升序排列。
select ename,sal from emp order by sal desc;
select ename,sal from emp order by sal desc,ename asc;
注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。

找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列。
select ename,job,sal from emp where job = ‘SALESMAN’ order by sal desc;
±-------±---------±--------+
| ename | job | sal |
±-------±---------±--------+
| ALLEN | SALESMAN | 1600.00 |
| TURNER | SALESMAN | 1500.00 |
| WARD | SALESMAN | 1250.00 |
| MARTIN | SALESMAN | 1250.00 |
±-------±---------±--------+

select
* 3
from
tablename 1
where
条件 2
order by
… 4

order by 是最后执行

14.分组函数?
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值

记住:所有的分组函数都是对”某一组“数据进行操作的。

找出工资总和?
select sum(sal) from emp;
找出最高工资?
select max(sal) from emp;
找出最低工资?
select min(sal) from emp;
找出平均工资?
select avg(sal) from emp;
找出总人数?
select count(*) from emp;
select count(ename) from emp;

分组函数一共5个。
分组函数还有另一个名字:多行处理函数。
多行处理函数的特点:输入多行,最终输出的结果是1行。

分组函数自动忽略null

select count(comm) from emp;

±------------+
| count(comm) |
±------------+
| 4 |
±------------+

找出工资高于平均工资的员工?
select avg(sal) from emp; //平均工资
±------------+
| avg(sal) |
±------------+
| 2073.214286 |
±------------+

select ename,sal from emp where sal > avg(sal); //ERROR 1111 (HY000): Invalid use of group function

思考以上的错误信息:无效的使用了分组函数?
原因:SQL语句当中有一个语法规则,分组函数不可直接使用在while子句当中。why???
因为group by是在where执行之后才会执行的。

		select
			..
		from					1
			..
		where				2
			..
		group by			3
			..
		having				4
			..
		order by
			..

count(*) 和 count(具体的某个字段),他们有什么区别?

count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(comm):表示统计comm字段中不为NULL的元素;

分组函数也能组合起来用:
select count(),sum(sal),avg(sal),max(sal),min(sal) from emp;
±---------±---------±------------±---------±---------+
| count(
) | sum(sal) | avg(sal) | max(sal) | min(sal) |
±---------±---------±------------±---------±---------+
| 14 | 29025.00 | 2073.214286 | 5000.00 | 800.00 |
±---------±---------±------------±---------±---------+

15.单行处理函数

什么是单行处理函数?
输入一行,输出一行。

计算每个员工的年薪?
select ename,(sal+comm)*12 as yearsal from emp;
重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。

ifnull() 空处理函数
	ifnull(可能为NULL的数据,被当作什么处理);   属于单行处理函数。
	select ename,ifnull(comm,0) as comm from emp;
+--------+---------+

| ename | comm |
±-------±--------+
| SMITH | 0.00 |
| ALLEN | 300.00 |
| WARD | 500.00 |
| JONES | 0.00 |
| MARTIN | 1400.00 |
| BLAKE | 0.00 |
| CLARK | 0.00 |
| SCOTT | 0.00 |
| KING | 0.00 |
| TURNER | 0.00 |
| ADAMS | 0.00 |
| JAMES | 0.00 |
| FORD | 0.00 |
| MILLER | 0.00 |
±-------±--------+

16. group by 和 having

group by :按照某个字段或者某些字段进行分组。
having: having 是对分组之后的数据进行再次过滤

案例: 找出每个工作岗位的最高薪资。
select max(sal) from emp group by job;

注意:分组函数一般都会和group by 联合使用。这也是为什么它被称为分组函数的原因。
并且任何一个分组函数(count sum avg max min)都是在group by语句执行完之后才会执行。当一条sql语句没有group by的话,整张表的数据会自成一组。
select ename,max(sal),job from emp group by job;
以上在mysql当中,查询结果是有的,但是结果没意义,在Oracle数据库当中会报错。语法错误。
Oracle的语法规则比MySQL的语法规则严谨。
记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。

每个工作岗位的平均薪资?
select job,avg(sal) from emp group by job;
±----------±------------+
| job | avg(sal) |
±----------±------------+
| CLERK | 1037.500000 |
| SALESMAN | 1400.000000 |
| MANAGER | 2758.333333 |
| ANALYST | 3000.000000 |
| PRESIDENT | 5000.000000 |
±----------±------------+
多个字段能不能联合起来一块分组?
案例: 找出每个部门不同工作岗位的最高薪资。
select
deptno,job,max(sal)
from
emp
group by
deptno,job;
案例: 找出每个部门的最高薪资,要求显示薪资大于2500的数据。
select
deptno,max(sal)
from
emp
group by
deptno;

第一步:找出每个部门的最高薪资
+----------+--------+
| max(sal) | deptno |
+----------+--------+
|  3000.00 |     20 |
|  2850.00 |     30 |
|  5000.00 |     10 |
+----------+--------+

第二步: 找出薪资大于2900
select max(sal),deptno from emp group by deptno having max(sal) > 2900;  //这种方式效率低
+----------+--------+
| max(sal) | deptno |
+----------+--------+
|  3000.00 |     20 |
|  5000.00 |     10 |
+----------+--------+


select max(sal),deptno from emp where sal >2900 group by deptno;  //效率较高,建议能够使用where过滤的尽量使用where
+----------+--------+
| max(sal) | deptno |
+----------+--------+
|  3000.00 |     20 |
|  5000.00 |     10 |
+----------+--------+

17.总结一个完整的DQL语句怎么写?

select		5
	..
from			1
	..
where		2
	..
group by	3
	..
having		4
	..
order by		6
	..	
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值