1、前言
DB:(database,数据库,数据库实际上在硬盘上以文件的形式存在)
DBMS(database management system(数据库管理系统)常见的有MySQL、Oracle、DB2等等)
SQL:结构化查询语句,便准通用的语言。高级语言,实际上内部先进性编译,在执行sql(sql由DBMS进行编译)
PS:DNMS负责执行sql语句,通过sql语句管理DB中的数据
2、什么是表?
表:table
表:table是数据库的基本组成单元,所有的数据都以表格形式组织,目的是具有可读性
表包括行(数据/记录data)和列(字段column)
3、sql语句分类
DQL(数据查询语言):查询语句
DML(数据操作语言):insert、delet、update对表中的数据增删改语句
DDL(数据定义语言):creat、drop、alter对表结构的增删改
TCL(事务控制语言):commit提交事务,rollback回滚事务(traction)
DCL(数据控制语言):grant授权、revoke撤销权限等
4、导入数据
第一步:登录mysql -uroot -p
第二步:查看有哪些数据库
show database;(mysql命令)
第三步:创建数据库
creat database bjpowernode;(mysql命令)
第四步:使用bjpowernode数据库
use bjpowernode;(mysql命令)
第五步:查看当前使用的数据库中有哪些表
show tables;(mysql命令)
第六步:初始化命令
source C:\Users\29854\Desktop\resources\bjpowernode.sql
以sql结尾的文件叫sql脚本
当一个文件的扩展名是.sql,并且文件中编写了大量的sql语句,称为sql脚本
PS:像批量执行SQL语句,用source命令完成初始化
5、基本命令
1、删除数据库:drop database bj;
2、查看表的结构:desc 表名;
3、表中的数据:select * from dept;
4、常用命令select database();select version();\c;结束一条语句
5、查看创建表时的语句:show create table emp;
6、简单的查询语句:
select 字段名1,2,3,... from 表名;
PS: 1、任何一条语句以“;”结尾 2、sql语句不区分大小写 3、字段可以参加数学运算 4、给查询结果的列重命名 select ename , sal12 as yearsal from emp; select ename , sal12 as ‘年薪’ from emp; 5、sql语句中字符串用单引号括起来
6、设置MySQL密码的不同姿势
0x01 用SET PASSWORD命令
首先登录MySQL。
格式:mysql> set password for 用户名@localhost = password('新密码');
例子:mysql> set password for root@localhost = password('123');
0x02 用mysqladmin
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:mysqladmin -uroot -p123456 password 123
0x03 用UPDATE直接编辑user表
首先登录MySQL。
mysql> use mysql;
mysql> update user set password=password('123') where user='root' and host='localhost';
mysql> flush privileges;
0x04 使用GRANT语句
mysql>grant all on *.* to 'root'@'localhost' IDENTIFIED BY '你的密码'with grant option ;
mysql>flush privileges;
0x05 在忘记root密码或初始化密码的时候
以windows为例:
1. 关闭正在运行的MySQL服务。
2. 打开DOS窗口,转到mysql\bin目录。
3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。
4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。
5. 输入mysql回车,如果成功,将出现MySQL提示符 >。
6. 连接权限数据库: use mysql; 。
6. 改密码:update user set password=password("123") where user="root";(别忘了最后加分号) 。
7. 刷新权限(必须步骤):flush privileges; 。
8. 退出 quit。
9. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。
7、条件查询
select ename from emp where sal = 5000;
select sal from emp where ename = 'SMITH'; //字符串用单引号括起来
select sal,ename from emp where sal>= 3000; //条件查询
select sal,ename from emp where sal <> 3000; //大于小于,等价于!=3000
select sal,ename from emp where sal <= 3000 and sal>=1100;
select sal,ename from emp where sal between 1000 and 3000; //闭区间,使用时左小右大;
select ename from emp where ename between 'A' and 'C';//除了数字,还可以是字符串方面,左闭右开
找出那些人没有津贴。null在数据库中不是一个值,代表什么也没有,为空,必须使用is null或者is not null ```mysql select ename,sal,comm from emp where comm is null;
select ename,sal,comm from emp where comm is not null; ``` [](https://imgtu.com/i/cuFjYR)
- and和or一起用
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);
注意优先级的顺序,and>or;以后优先级的顺序不确定的时候直接使用小括号
- in等同于or:
select ename,job from emp where job = 'MANAGER' or job = 'salesman'; select ename,job from emp where job in ('manager','salesman');
PS:in里边的变量不是区间select ename,job from emp where job in (100,200);
-
not in
-
模糊查询like
找出名字中当中有o的(在模糊查询中掌握两个特殊符号,一个是%,一个是_)
%代表任意多个字符,_代表任意一个字符
//找出名字中第二个字母是A的
select ename from emp where ename like '_A%';
//找出名字中有下划线的
select ename from emp where ename like '%\_%';
//最后一个字母是T
select ename from emp where ename like '%T';
8、排序和分组函数
升序、降序
select ename,sal from emp order by sal;//默认升序
//升序asc
select ename,sal from emp order by sal asc;
//降序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;
分组函数(多行处理函数【输入多行输出一行】)
//所有的分组函数都是对“某一组“数据进行操作,一共5个
count 取得记录数
sum 求和
avg 取平均值
max 取最大值
min 取最小值
分组函数自动忽略空值(null),不需要手动加where条件排除空值 select count(ename) from emp; select count(*) from emp; select sum(sal) from emp; select max(sal) from emp; select min(sal) from emp; select avg(sal) from emp; 一切数据库规定,只要有null参与的运算,结果一定是null ifnull(可能为null的数据,被当作什么处理)//空处理函数if(null,0)
//找出工资水品高于平均薪资的员工
select ename,sal from emp where sal > avg(sal);//ERROR 1111 (HY000): Invalid use of group function无效使用分组函数
//分组函数不能直接在where后边,因为group by在where之后执行。
select .. 5
from .. 1
where .. 2
group by .. 3
having .. 4
order by .. 6
//解决方法
第一步:找出平均工资
select avg(sal) from emp;
第二步:找出高于平均工资的员工
select ename,sal from emp where sal > 2073.214286;
//合并语句(语句嵌套)
select ename,sal from emp where sal > (select avg(sal) from emp);
- ps:count()和count(具体某个字段)的区别。count()统计总记录条数;count(某个字段)统计字段中不为null的数据总数量。
group by和having
- group by :按照某个字段或者某些字段进行分组;
- having:对分组之后的数据进行再次过滤;
group by
select max(sal) from emp group by job;//找出某个岗位的最高薪资
select max(sal),job from emp group by job;//优化
select max(sal),ename from emp group by job;//数据库报错,因为ename不止五行,语法规则严谨。当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。
PS:分组函数一般会和group by联合使用,这也是被称为分组函数的原因。任何一个分组函数(count sum avg max min)都是在group by 语句执行结束后才会执行。当一条语句没有group by,整张表数据自成一组。
select job,avg(sal) from emp group by job;//平均工资
多个字段能不能联合起来一块分组?
案例:找出每个部门不同工作岗位的最高薪资。
select
deptno,job,max(sal)
from
emp
group by
deptno,job;
having
找出每个部门的最高薪资,要求显示薪资大于2500的数据。
select max(sal),deptno from emp group by deptno;