MySQL
数据库(DataBase 简称DB): 按照数据结构来组织,存储和管理数据的文件仓库;
数据库管理系统(DataBase Management System简称DBMS):管理数据库的软件.
常见的DBMS
MySQL
Oracle公司产品, MySQL 08年被Sun公司收购,09Sun公司被Oracle收购. 目前市占率排名第一, 开源软件, 原MySQL创始人从Oracle离开创办MariaDB
Oracle
Oracle公司产品, 拉里埃里森32, 闭源产品, 性能最高价格最贵. 市占率排名第二
SQLServer
微软公司产品,闭源产品, 市占率第三, 主要应用在微软的整套解决方案中
DB2
IBM公司产品,闭源产品 主要应用在IBM整套解决方案中.
SQLite
轻量级数据库 安装包只有几十k,主要应用在移动设备或嵌入式设备中
数据库的执行
执行SQL语句需要先连接数据库,windows: 开始->所有程序->MariaDB或MySQL->MySQL Client 点击运行 输入密码后回车.
SQL语言分类
DDL:数据定义语言,负责数据库和表相关的操作
DML: 数据操作语言, 负责对数据进行增删改查
DQL: 数据查询语言, 只负责查询
TCL: 事务控制语言, 负责处理事务相关
DCL: 数据控制语言, 负责创建用户及分配用户权限相关
DDL数据定义语言
往数据库软件中保存数据,需要先创建数据库, 在数据库里面创建表, 最后往表里面插入数据
数据库相关SQL
1. 查询所有数据库
格式: show databases;
2. 创建数据库
格式: create database 数据库名;
指定字符集格式: create database 数据库名 character set utf8/gbk;
3. 查询数据库详情
格式: show database 数据库名;
4. 删除数据库
格式: drop database 数据库名;
5. 使用数据库
格式: use 数据库名;
表相关SQL语句
注:操作表必须提前使用了某个数据库不然会报错 No database selected
1. 查询所有表
格式: show tables;
2. 创建表
格式: create table 表名(字段名1 类型,字段名2 类型, ......);
指定字符集格式: create table 表名(字段名1 类型,字段名2 类型, ......) charset = utf8/gbk;
查询表详情
格式: show create table 表名;
3. 删除表
格式: drop table 表名;
4. 修改表名
格式: rename table 原表名 to 新表名;
5. 添加表字段
最后面添加格式: alter table 表名 add 字段名 类型;
最前面添加格式: alter table 表名 add 字段名 类型 first;
在XXX字段的后面添加: alter table 表名 add字段名 类型 after 字段名;
6. 查看表字段
格式: desc 表名;
7. 删除表字段
格式: alter table 表名 drop 字段名;
8. 修改表字段
格式: alter table 表名 change 原字段名 新字段名 类型;
DML数据操作语言
操作数据必须使用了某个数据库并且保证已创建了保存数据的表
例:
create database mydb3 character set utf8;
use mydb3;
create table person(name varchar(50),age int) charset=utf8;
1. 插入数据
全表插入格式: insert into 表名 values (值1,值2....);
指定字段插入格式: insert into 表名(字段名1,字段名2...) values (值1,值2...);
2. 批量插入
insert into 表名 values('AAA',10),('BBB',11),('CCC',12);
insert into 表名(字段名)values("XXX"),("YYY"),("ZZZ");
3. 查询数据
格式: select 字段信息 from 表名 where 条件;
例:
查询所有数据 select * from person;
只查名字 select name from person;
查询年龄小于12岁的信息 select * from person where age<12;
4. 修改数据
格式: update 表名 set 字段名1 = 值, 字段名2 = 值 where 条件;
5. 删除数据
格式: delete from 表名 where 条件;
如若只为null,则delete from 表名where 字段名is null;
不加条件,则delete from 表名; 表示删除所有数据
6.导出数据和表结构:
格式: mysqldump -u用户名 -p 数据库名 > 数据库名.sql
例: mysqldump -uroot -p dbname > dbname .sql //之后会弹出来让你输入密码
数据类型
1.整数
int ( m ) 和 bigint ( m ) m代表显示长度
例:
m=10 18 0000000018 起到补零的作用, 需要和zerofill关键字结合使用
举例: create table t1(name varchar(10),age int(10) zerofill);
insert into t1 values('Tom',18);
select * from t1;
2.浮点数
double ( m , d ) m代表总长度 d代表小数长度
23.532 m=5 d=3
decimal(m,d) 是超高精度浮点数 只有涉及超高精度运算时使用
字符串
3.文本
Char ( m ) : m代表字符长度 , 固定长度 m=10 存"abc" 占10 , 执行效率略高 最大长度255
varchar(m): 可变长度, m=10 存"abc" 占3 节省空间 最大长度65535 ,建议保存255以内的字符串 超过255使用text
text(m):可变长度 最大长度65535
4.日期
date 只能保存年月日 yyyy-MM-dd
time 只能保存时分秒 hh-MM-ss
datetime 默认值null 最大值 9999-12-31
timestamp 时间戳默认值当前系统时间 最大值为2038-1-19
主键约束
表示数据唯一性的字段称为主键 ; 创建表时给表字段添加的限制条件
主键约束primary key: 唯一且非空例:
create table t3(id int primary key,name varchar(10));
insert into t3 values(1,'aaa');
insert into t3 values(1,'bbb');
主键约束+自增
自增规则:从历史最大值+1
例:
create table t4(id int primary key auto_increment,name varchar(10));
insert into t4 values(null,'aaa'); 1
insert into t4 values(null,'bbb'); 2
insert into t4 values(10,'bbb'); 10
insert into t4 values(null,'ccc'); 11
delete from t4 where id>9;
insert into t4 values(null,'ddd'); 12
1. 导入*.sql批处理文件
source sql文件地址;
测试 select * from emp; 如果有乱码 执行 set names gbk; 再查
2. is null 和 is not null
例:
查询没有上级领导的员工信息
select * from emp where mgr is null;
查询有上级领导的员工姓名和领导编号
select ename,mgr from emp where mgr is not null;
3. 去重 distinct
例:
查询员工表中出现的不同的工作有哪些
select distinct job from emp;
查询员工表中出现的部门编号 去掉重复
select distinct deptno from emp;
4. and和or
and 类似java中的&& or 类似java中的||
例:
查询1号部门工资低于2000的员工信息
select * from emp where deptno=1 and sal<2000;
查询3号部门或工作是程序员的员工信息
select * from emp where deptno=3 or job='程序员';
查询有上级领导的员工中工资小于2000的员工姓名,工资和领导编号
select ename,sal,mgr from emp where mgr is not null and sal<2000;
5. 比较运算符 > < >= <= = != 和<>
例:
查询不是程序员的员工中工资小于等于1600的员工信息
select * from emp where job !='程序员' and sal<=1600;
select * from emp where job <>'程序员' and sal<=1600;
6. in关键字
例:
查询工资为3000,1500,5000的员工信息
select * from emp where sal=3000 or sal=1500 or sal=5000;
select * from emp where sal in(3000,1500,5000);
查询工资不是3000,5000的员工信息
select * from emp where sal!=3000 and sal!=5000;
select * from emp where sal not in(3000,5000);
7. between x and y 包含x和y
例:
1. 查询工资在1000到2000之间的员工信息
select * from emp where sal between 1000 and 2000;
2. 查询工资在1000到2000之外的员工信息
select * from emp where sal not between 1000 and 2000;
8. 模糊查询like
_:代表1个未知字符
%:代表0或多个未知字符
样式:
以x开头 x%
以x结尾 %x
第二个是x _x%
包含x %x%
第2个是x倒数第三个是y _x%y_ _
例:
1. 查询名字中包含悟字的员工姓名
select ename from emp where ename like "%悟%";
2. 查询工作中第二个字是售 的员工信息
select * from emp where job like '_售%';
3. 查询名字中以精结尾的员工姓名
select ename from emp where ename like '%精';
4. 查询姓孙的员工信息
select * from emp where ename like '孙%';
9. 排序 order by
格式: order by 字段名 asc升序(默认)/desc降序
例:
1. 查询每个员工的姓名和工资 按照工资升序排序
select ename,sal from emp order by sal;
2. 查询每个员工的姓名和工资,按照工资降序排序
select ename,sal from emp order by sal desc;
多字段排序; 在order by后面写多个字段用逗号分隔
例:
1. 查询每个员工的姓名工资和部门编号,按照部门编号升序排序 如果部门编号一致则按照工资降序排序
select ename,sal,deptno from emp order by deptno,sal desc;
10. 分页查询limit
例:
1. 查询每个员工的姓名和工资 按照工资升序排序
select ename,sal from emp order by sal;
2. 查询每个员工的姓名和工资,按照工资降序排序
select ename,sal from emp order by sal desc;
例:
1. 查询员工姓名和工资按照工资降序排序查询前三条
select ename,sal from emp order by sal desc limit 0,3;
2. 查询第二页的4条数据
select * from emp limit 4,4;
3. 查询第3页的3条数据
select * from emp limit 6,3;
4. 查询最惨员工信息(工资最低)
select * from emp order by sal limit 0,1;
11. 别名
例:
对查询的字段名起一个新的名字
select ename as '姓名' from emp;
select ename '姓名' from emp;
select ename 姓名 from emp;
12. 数值计算 + - * / %
例:
查询每个员工的姓名 工资和年终奖(年终奖=5个月的工资)
select ename,sal,5*sal 年终奖 from emp;
查询1号部门员工的姓名/工资和涨薪5块钱之后的工资
select ename,sal,sal+5 涨薪后 from emp where deptno=1;
聚合函数
对查询的多条数据进行统计查询
统计方式: 求平均值, 最大值,最小值, 求和, 计数
1. 平均值avg(字段名)
例:
查询2号部门的平均工资
select avg(sal) from emp where deptno=2;
查询程序员的平均工资
select avg(sal) from emp where job='程序员';
2. 最大值max(字段名)
例:
查询1号部门的最高工资
select max(sal) from emp where deptno=1;
3. 最小值min(字段名)
例:
查询销售的最低工资
select min(sal) from emp where job='销售';
4. 求和sum(字段名)
例:
查询销售工作的工资总和
select sum(sal) from emp where job like '%销售%';
5. 计数count(字段名) count(*)
例:
查询1号部门员工人数
select count(*) from emp where deptno=1;
分组查询 group by
格式: group by 字段名
以分组字段相同值的数据为一组 进行统计查询
例:
1. 查询每个部门的平均工资
select deptno,avg(sal) from emp group by deptno;
2. 查询每个部门的最高工资
select deptno,max(sal) from emp group by deptno;
3. 查询每种工作的人数
select job,count(*) from emp group by job;
4. 查询1号部门每种工作的人数
select job,count(*) from emp where deptno=1 group by job;
各个关键字的顺序
select * from 表名 where 条件 group by 分组字段 order by 排序字段 limit 跳过条数,请求条数
Having
where后面只能写普通字段的条件, 聚合函数条件需要写在having后面, having写在group by的后面 要和分组查询结合使用
例:
1. 查询每个部门的平均工资要求只查询平均工资大于2000的信息
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000 ;
2. 查询只有一个人的工作名称
select job,count(*) c from emp group by job having c=1;
3. 查询每个部门的工资总和,只查询有领导的员工,并且要求工资总和高于5400;
select deptno,sum(sal) s from emp where mgr is not null group by deptno having s>5400;
4. 查询每个部门的平均工资,只查询工资在1000到3000之间的,并且过滤掉平均工资低于2000的部门
select deptno,avg(sal) a from emp where sal between 1000 and 3000 group by deptno having a>=2000;
5. 查询每种工作的人数要求人数大于1个,并且只查询1号部门和2号部门的员工, 按照人数降序排序
select job,count(*) c from emp where deptno in(1,2) group by job having c>1 order by c desc;
各个关键字的顺序
select * from 表名 where 普通字段条件 group by 分组字段 having 聚合函数条件 order by 排序字段 limit 跳过条数,请求条数;
子查询(嵌套查询)
例:
1. 查询工资高于1号部门平均工资的员工信息
select avg(sal) from emp where deptno=1;
select * from emp where sal>(select avg(sal) from emp where deptno=1);
2. 查询工资最高的员工信息
select max(sal) from emp;
select * from emp where sal=(select max(sal) from emp);
3. 查询工资高于2号部门最低工资的员工信息
select min(sal) from emp where deptno=2;
select * from emp where sal>(select min(sal) from emp where deptno=2);
4. 查询和孙悟空相同工作的其它员工信息
select job from emp where ename='孙悟空';
select * from emp where job=(select job from emp where ename='孙悟空') and ename!='孙悟空';
5. 查询拿最低工资员工的同事们的信息(同事指相同部门)
select min(sal) from emp; //得到最低工资
select deptno from emp where sal=(select min(sal) from emp);//最低工资的部门编号
select * from emp where deptno=(select deptno from emp where sal=(select min(sal) from emp)) and sal!=(select min(sal) from emp);
6. 查询白骨精的部门信息(需要用到部门表)
select deptno from emp where ename='白骨精';
select * from dept where deptno=(select deptno from emp where ename='白骨精');
关联关系
创建表时,表和表之间存在的业务关系
有哪几种关系?
一对一:有AB两张表,A表中一条数据对应B表中的一条数据,同时B表中的一条数据也对应A表中的一条数据 称为一对一关系
一对多:有AB两张表,A表中一条数据对应B表中的多条数据,同时B表中的一条数据对应A表中的一条数据 称为一对多关系
多对多:有AB两张表,A表中一条数据对应B表中的多条数据,同时B表中的一条数据也对应A表中的多条数据 称为多对多关系
表和表之间如何建立关系?
通过一个单独的字段指向另外一个表的主键,这个单独的字段称为外键.
关联查询
同时查询多张存在关联关系的表时,使用的查询查询方式称为关联查询
关联查询的方式有三种: 1. 等值连接 2.内连接 3. 外连接
关联查询之等值连接
格式: select * from A,B where A.x=B.x(关联关系) and A.age>30;
例:
1. 查询1号部门每一个员工的姓名和对应的部门名
select e.ename,d.dname
from emp e,dept d
where e.deptno=d.deptno and e.deptno=1;
2. 查询工资高于2000的员工姓名/工资和工作地点(部门地点)
select ename,sal,loc
from emp e,dept d
where e.deptno=d.deptno and e.sal>2000;
关联查询之内连接
和等值连接作用一样, 查询的是两张表的交集数据
格式: select * from A,B where A.x=B.x(关联关系) and A.age>30;
格式: select * from A join B on A.x=B.x(关联关系) where A.age>30;
例:
查询1号部门每一个员工的姓名和对应的部门名
select ename,dname from emp e join dept d on e.deptno = d.deptno where e.deptno=1;
关联查询之外连接
查询的是一张表的全部和另外一张表的交集
insert into emp (empno,ename) values(100,'Tom');
格式: select * from A left/right join B on A.x=B.x(关联关系) where A.age>30;
例:
查询所有员工的名字和对应的部门名
select e.ename,d.dname from emp e left join dept d on e.deptno=d.deptno;
关联查询总结:
1. 如果查询的是两张表的交集数据使用等值连接或内连接(推荐)
2. 如果查询的是一张表的全部和另外一张表的交集则使用外连接
本文精选MySQL基本数据操作,如有错误或者补充请留言或私信 版权@Healer_小振