DDL定义数据库结构
create/drop/alter(修改表)
DML操作数据
insert/delete(删除)/update(修改)
DQL查询数据
select
DCL控制用户权限
grant(授权)/revoke(授权)
一、SQL命令
1、修改
update 数据库名称 set 列名称=值,列名称=值…where 条件;
#修改数据
UPDATE USER SET email=‘123@abc.com’,phone=‘123456258’ WHERE uid=‘1’;
2、删除
delete from 数据库名称 where 条件;
#删除数据
DELETE FROM USER WHERE uid=‘01’;
二、计算机中如何存储字符
1、如何存储英文字符
ASCLL:对128个英文字母及其符号进行了编译
Latin-1:总共有256个,对欧洲字符进行了编码,兼容ASCLL(MySQL默认)
2、如何存储中文字符
GB2312:对常用的6千多汉字进行了编码,兼容ASCLL
GBK:对2万多的汉字进行了编码,兼容GB2312
Unicode码:对世界是主流国家常用的语言进行了编码,分为三种存储方案分别是utf-8,utf-16,utf-32
3.解决MySQL中文乱码
(1)脚本文件另存为的编码为utf8
(2)客户端连接服务器端的编码为utf8
#设置客户端连接服务器端使用的编码utf-8
SET names utf8;
(3)服务器端创建数据库,存储字符编码为utf8
#创建新的数据库,设置存储字符编码为utf8
CREATE DATABASE xz charset = utf8;
(4)特殊情况:如果以上在交互模式哈有乱码,需要先推出交互模式然后执行修改命令行的编码为utf8
chcp 65001
三、常见的列类型
列类型 :在创建数据表的时候,指出的列所能存储的数据类型
create table user(
列名称 列类型,
列名称 列类型
);
数值型
tinyint 微整型 1个字节,范围-128~127
smallint 小整型 2个字节,范围-32768~32767
int 整型 4个字节 ,范围-2147483648~214748647
bigint 大整型 8个字节
浮点型
float 单精度浮点型,占4个字节,存的的值越大,精度越低
double 双精度浮点型,占8个字节,存的的值越大,精度越低
decimal 定点小数,存储的值小数点不会发生变化
decimal(M,D) M表示总的有效位数,D表示小数点后的位数
eg:9999999.99 decimal(9,2)
boolean布尔型(只有两个值)
true 真
false 假
true和false是关键字,使用时不能加引号
boolean会自动转为tinyint,true转为1,false转为0,也可以直接插入1和0
常用于存储只有两个值的数据,eg:性别(男、女);是否在线(是、否);
.
日期时间型
date 日期型 ‘2021-10-20’
time 时间型 ‘13:52:43’
datetime 日期时间型 '2013-11-12 15:20:26'
字符串类型——必须加引号
varchar(M) 变长字符串,不会产生空间浪费,数据操作速度相对慢,M最大值65535
存储变化长度的数据,例如:文章标题,详情,姓名…
char(M) 定长字符串,可能会产生浪费,数据操作速度相对快,M最大值255
存储固定长度的数据,例如:手机号码,身份证号码…
text(M) 大型变量字符串,M最大值2G
( \0表示空格 )
| varchar (5) | char(5)
a | a\0 | a\0\0\0\0
ab | ab\0 | ab\0\0\0
一二三 | 一二三\0 | 一二三\0\0
四、列约束
MySQL可以对插入的数据进行验证,只有通过验证才允许插入,例如:编号不能重复、性别只能是男女,一个人的成绩范围~100
create table t1(
id int 列约束
);
1、主键约束——primary key
声明了主键约束的列,不允许插入重复的值,一个表里只能有一个主键约束,通常加在编号列,可以加快数据的查找速度
null:表示空,代表一个暂时无法确定的值,例如:无法确定一个员工的手机号码、邮箱、性别等
null为关键字,使用这个值的时候不能加引号
2、非空约束——not null
声明了非空约束的列不允许插入null
3、默认值约束——default
如果插入数据,不提供值,会使用默认值;
使用default关键字设置默认值
4、唯一约束——unique
声明了唯一约束的列上不允许出现重复的值
一个表中可以有多个唯一约束,允许插入null,甚至多个null
5、检查约束——check
也称为自定义约束,用户可以自己指定约束条件
creat table student(
score tinyint check(score>=0 and score<=0)
);
MySQL不支持检查约束,后期由JS代替
6、外键约束——foreign key(外键列) references 外键列所在的表名称(主键列)
声名了外键约束的列上插入的值必须是另一个表的主键列出现过,目的是为了确保两个表之间建立关联,
外键约束和另一个表主键的列类型保持一致, 外键约束里面允许插入null
#把familyid作为外键,取值必须在family表的fid出现过
foreign key(familyid) references family(fid)
五、自增列
auto_increment:自动增长,如果设置了自增列,在插入编号的时候只需要赋值为null,就会获取最大值然后加1插入
自增列必须应用在整形形式的主键列
允许手动赋值
六、简单查询
1、查询特定的列
示例:查询所有员工的编号和姓名
select eid, ename from emp;
练习:查询出所有员工的姓名,性别,生日,工资
select ename,sex,birthday,salary from emp;
2、查询所有的列
(方法1) select eid,ename,sex,birthday,salary,deptid from emp;
(方法2)select * from emp;
3、给列起别名
示例:查询出所有员工的编号和姓名,使用一个字母作为别名
select eid as a,ename as b from emp;
练习:查询出所有员工的姓名,生日,工资,使用一个字母作为别名
select ename as a,birthday as b,salary as s from emp;
as意思是作为,作用是用来连接别名的
as作为关键字,可以省略,保留空格
4、显示不同的记录
示例:查询出员工都分布在那些部门
select distinct deptid from emp;
联系:查询出有哪些性别的员工
select distinct sex from emp;
5、查询时执行计算
示例:计算出2+5-9+812
select 2+5-9+812;
练习:查询出所有员工的姓名及其年薪
select ename,salary*12 from emp;
假设每个员工的工资增加2000,年终是20000,查询出所有员工姓名及其年薪,使用一个字母作为别名
select ename as a,(salary+2000)*12+20000 as s from emp;
6、查询结果排序
示例:查询出所有的部门,结果按照编号从小到大排序
select * from dept order by did asc; #ascendent升序
示例:查询出所有的部门,结果按照编号从大到小排序
select * from dept order by did desc; #descendant 降序的
练习:查询出所有的员工,结果按照工资降序排列
select * from emp order by salary desc;
练习:查询出所有的员工,结果按照生日升序排列
select * from emp order by birthday asc;
练习:查询出所有的员工,结果按照姓名升序排列
select * from emp order by ename asc;
按照字符串排列,按照字符的编码排列
不加排序规则,默认是按升序排列
示例:查询出所有员工,结果按照工资降序排列,如果工资相同,按照姓名排列
select * from emp order by salary desc,ename asc;
练习:查询出所有员工,结果按照性别排序,如果性别相同,则按照生日从小到大排列
select * from emp order by sex asc,birthday asc;
7、条件查询
示例:查询出编号为10的员工
select * from emp where eid=10;
练习:查询出姓名为king 的员工
select * from emp where ename=‘king’;
练习:查询出工资在6000以上的员工有哪些
select * from emp where salsry>6000;
比较运算符
> < >= <= = !=(不等于)
练习:查询出不在10号部门的员工有哪些
select * from emp where deptid!=10;
练习:查询出没有明确部门的员工
select * from emp where deptid is null;
查询出有明确部门的员工
select * from emp where deptid is not null;
示例: 查询7000以上的女员工都有哪些
select * from emp where salary>7000 and sex=0;
练习:查询7000~10000之间的员工有哪些
select * from emp where salary>7000 and salary<10000;
练习:查询7000一下或者10000以上的员工;
select * from emp where salary<7000 or salary>10000;
练习:查询出20号部门或者30号部门的员工
(方法1): select * from emp where deptid=20 or deptid=30;
(方法2):select * from emp where deptid in(20,30);
练习:查询出不在20号并且不在30号部门的员工
(方法1): select * from emp where deptid !=20 and deptid !=30;
(方法2):select * from emp where deptid not in(20,30);
and(&&):并且,要求两个条件都满足
or(||):或者,要求两个条件满足其一
8、模糊条件查询
不明确的条件,常用于搜索
示例:查询出员工姓名中含有e的员工有哪些
select * from emp where ename like’%e%‘;
练习:查询出员工姓名以e结尾的员工有哪些
select * from emp where ename like’%e’;
练习:查询出员工姓名中倒数第二个字符是e的员工有哪些
select * from emp where ename like’%e_';
%:匹配任意个字符 >=0
_ :匹配任意1个字符 =1
以上匹配符号必须结合like 关键字使用
9、分页查询
查询的结果有太多数据,一次显示不完可以做成分页显示
需要有两个已知条件:当前页码、每页的数量
| 每页开始查询的值=(当前的页码-1)*每页的数据量 |
select * from emp limit 开始查询的值,每页的数据 /*注意事项:limit 后面的两个值必须是数值型,不能加引号*/
示例:假设每页显示5条数据,查询出前四页每页的数据
第1页:select * from emp limit 0,5;
第2页:select * from emp limit 5,5;
第3页:select * from emp limit 10,5;
第4页:select * from emp limit 15,5;
七、复杂查询
1、聚合查询/分组查询
函数:是一个功能体,需要提供若干个数据,然后返回结果
聚合函数:
count()/sum()/avg()/max()/min()
数量 总和 平均 最大 最小
示例:查询出所有员工的数量
select count(*) from emp;
结果:16个员工
练习:使用员工编号列查询出员工数量
select count(eid) from emp; #建议使用主键列
结果:16个员工
练习:使用所属部门列查询出员工数量
select count(deptid) from emp;
结果:15个员工
练习:查询出所有女员工的工资总和
select sum(salary) from emp where sex=0;
练习:查询出10号部门的平均工资
select avg(salary) from emp where deptid=10;
练习:查询出男员工的最低工资
select min(salary) from emp where sex=1;
练习:查询出年龄最小员工的生日(查询出生日的最大值)
select max(birthday) from emp;
分组查询通常查询聚合函数和分组条件
示例:查询出男女员工的数量、平均工资、工资总和
select count(eid),avg(salary),sum(salary),sex from emp group by sex;
练习:查询出各部门的工资总和,最高工资,最低工资
select sum(salary),max(salary),min(salary),deptid from emp group by deptid;
2、子查询
是多个sql命令的组合,将一个查询的结果作为另一个的条件
示例:查询高于平均工资的员工有哪些
步骤1:查询出平均工资=11125
select avg(salary) from emp;
步骤2:查询出工资大于的员工
select * from emp where salary>11125;
综合:
select * from emp where salary>(select avg(salary) from emp);
练习:查询和tao同一个部门的员工有哪些
步骤1:查询tao所在的部门——20
select deptid from emp where enamr=‘tao’;
步骤2:查询出部门20为的员工有哪些
select * from emp where deptid=20;
综合:
select * from emp where deptid=(select deptid from emp where ename=‘tao’) and ename!=tao;
| year() 获取日期中的年份
| 示例:查询出所有员工的出生年份
| select year(birthday) from emp;
| 示例:查询出1993年出生的员工
| select * from emp where year(birthday)=1993;
练习:查询出和tom同一年出生的员工有哪些
select * from emp where year(birthday)=(select year(birthday) from emp where ename='tom') and ename!='tom';
3、多表查询
要查询的数据分别在多个表中,前提表之间已经建立了关联
示例:查询出所有员工的姓名及其部门名称
select ename,deptid from emp,dept where deptid=did;
select emp.ename,dept.dname from emp,dept where emp.deptid=dept.did;
(1)内连接
select ename,dname from emp inner join dept on deptid=did;
和之前的查询结果一样
(2)左外连接
左表 left outer join 右表 on 左表外键=右表主键
select ename,dname from emp left outer join dept on deptid=did;
显示左侧表中的所有记录,先写哪个表哪个就是左
(3)右外连接
左表 right outer join 右表 on 左表外键=右表主键
select ename,dname from emp right outer join dept on deptid=did;
显示右侧表中所有记录,后写哪个表哪个就是右
(4)全连接
full join...on
同时显示左侧和右侧表中的所有记录
mysql不支持全连接
union all 联合后不合并相同的项
union 联合后合并相同的项
(select ename,dname from emp left outer join dept on deptid=did)
union all
(select ename,dname from emp right outer join dept on deptid=did);
共32条记录
(select ename,dname from emp left outer join dept on deptid=did)
union
(select ename,dname from emp right outer join dept on deptid=did);
共17条记录
解决方案:将左外连接和右外连接进行联合,合并相同的项
综合练习:查询出工资在7000以上的男员工的姓名,性别,生日,工资;结果按照工资从高到低排列,只能显示前3个人;给列使用别名
select ename a,sex b,birthday c,salary d from emp where sex=1 and salary>7000 order by salary desc limit 0,3;