目录
(5)concat(列名1/字符串1, 列名2/字符串2,..... 列名n/字符串n)
创建表
语法格式:
create table 表名(
列名1 数据类型 primary key,
列名2 数据类型,
列名3 数据类型,
......,
列名n 数据类型
);
说明:
- 表名不可以重复
- primary key表示主键,可以省略
- 列名不可以重复
(d)创建表格式中,最后一行不加逗号
案例:创建一张表,表名为test01
use 数据库名称;
create table test01(
id int(8),
name varchar(30),
sex char(3)
);
查看数据库(仓库)中全部的表
语法格式:show tables;
查看表结构
语法格式:desc 表名;
案例:查看test01表的,表结构
desc test01;
插入语句
向全部列插入数据
语法格式:
insert into 表名 values(列值1,列值2,列值3....列值n);
说明:
- 列值与列值之间使用逗号分隔
- values中的列值,必须和表结构中的列名是一一对应的(数量、顺序、类型)
验证: select * from 表名;
案例:向test01表中,插入数据
(1)查看test01的表结构
desc test01;
(2)根据语法格式,插入数据
insert into test01 values(
1001,'rose','女');
insert into test01 values(
1002,'jack','男');
说明:在插入数据时,字符类型和日期类型需要加单引号
(3)验证数据是否插入成功
select * from test01;
向指定列插入数据
语法格式:
insert into 表名(列名1,列名2,....列名n)values(列值1,列值2,...列值n);
说明:
- 列名和列名之间使用逗号分隔
- values中的列值必须和表名中的列名是一一对应的(数量、顺序、类型)
验证:select * from 表名;
案例:向test03表中,插入数据
id name sex age score stime
1 rose 20 85
2 tom 男 22
3 女 18 2020-7-4
4 31 2020-8-1
5 jack 男
(1)查看test03表的,表结构
desc test03;
(2)根据语法格式,插入数据
insert into test03(
id,name,age,score) values(1, 'rose',20,85);
insert into test03(
id,sex,age,stime) values(3, '女',18, '2020-7-4');
insert into test03(id,name,sex,age) values(2,'tom', '男',22);
insert into test03(id,age,stime) values(4,31,'2020-8-1');
insert into test03(id,name,sex) values(5, 'jack', '男');
(3)验证数据是否插入成功
select * from test03;
批量插入数据(MySQL) --了解
语法格式1:
insert into 表名 values(列值1,列值2,列值3....列值n),(列值1,列值2,列值3....列值n),(列值1,列值2,列值3....列值n)...(列值1,列值2,列值3....列值n);
案例:向test01表中,插入数据
select * from test01;
insert into test01 values(1003,'张三', '男'),(1004,'李四', '男'),(1005,'丽丽', '女');
select * from test01;
语法格式2:
insert into 表名(列名1,列名2,....列名n)values(列值1,列值2,...列值n), (列值1,列值2,...列值n),.... (列值1,列值2,...列值n);
案例:向test02表中,插入数据
id name age sal
111 肉丝 20
112 杰克 23
113 西红柿 25
114 土豆丝 27
115 金庸 88
116 古龙 86
insert into test02(id,name,age) values(111,'肉丝',20),(112,'杰克',23),(113,'西红柿',25);
select * from test02;
insert into test02(id,name,age) values(114, '土豆丝',27),(115,'金庸',88),(116,'古龙',86);
select * from test02;
更新语句
语法格式:
update 表名 set 列名1=该列新值,列名2=该列新值,...列名n=该列新值 where 条件;
说明:
(a)如果没有where 条件,修改全部的列值
验证:select * from 表名;
案例:更新test03表,编号(id)是3号的记录,将姓名(name)更新为:田七
update test03 set name='田七' where id=3;
select * fromtest03;
案例:更新test03表,姓名(name)是jack的记录,将年龄(age)更新为25
update test03 set age=25 where name='jack';
select * fromtest03;
删除表中数据
语法格式:
delete from 表名 where 条件;
说明:如果没有where 条件,删除表中全部数据
验证:select * from 表名;
案例:删除test03表中,编号(id)是4号的记录
select * from test03; 删除前
delete from test03 where id=4;
select * from test03; 删除后
删除表
语法格式:drop table 表名;
案例:删除test03表,并验证
drop table test03;
show tables;
查询语句 ---> 重点
普通(简单)查询语句
(1)查询表中,全部列的数据
语法格式:
select * from 表名;
说明: * 表示全部的"列"
案例:查询emp表中,全部列数据
select * from emp;
(2)查询表中,指定列的数据
语法格式:
select 列名1,列名2,....列名n from 表名;
案例:查询emp表中,员工编号(empno),姓名(ename),职位(job),工资(sal)的信息
select empno,ename,job,sal from emp;
给"列"起别名
语法格式:
select 列名1 as 别名1,列名2 as 别名2,....列名n as 别名n from 表名;
说明:可以去掉as,在列名和别名之间使用空格分隔
案例:查询emp表中,员工编号(empno),姓名(ename),职位(job),入职时间(hiredate),工资(sal),并给每列起别名显示
select empno as 编号,ename as 姓名,job as 职位,hiredate as 入职时间,sal as 工资 from emp;
select empno 编号,ename姓名,job职位,hiredate入职时间,
sal工资 from emp;
去掉重复的列值(distinct)
语法格式:
select distinct 列名 from 表名;
案例:查询emp表中,员工的职位(job),并去重显示
select * from emp;
select distinct job from emp;
限制查询(limit)
语法格式:
select */列名 from 表名 limit 初始位置,行数;
说明:
(a)初始位置表示从哪里开始查询,是一个可选值,默认值是:0,表示第一行记录
(b)行数表示要查询的记录(行)数
案例:查询emp表中,前5条记录
select * from emp limit 0,5;
或者
select * from emp limit 5;
案例:查询emp表中数据,从第3行开始,共查询6条记录
select * from emp limit 2,6;
排序(order by)
语法格式:
select */列名 from 表名 order by 列名1 asc/desc,列名2 asc/desc;
说明:
(a) asc 表示升序 desc 表示降序
(b)如果多列进行排序,先排第1列数据,如果第1列数据中,有相同的列值,在排第2列数据,反之不排。
案例:查询emp表中,员工编号(empno),姓名(ename),职位(job),工资(sal),根据员工编号降序排列
select empno,ename,job,sal
from emp
order by empno desc;
条件查询
语法格式:
select */列名 from 表名
where 条件
order by 列名1 asc/desc,列名2 asc/desc;
说明-条件:
(1)关系运算符
>、<、=、>=、<=、
<>或者 !=(不等于)
(2)逻辑运算符
and(与)、 or(或)、 not(非)
(3)特殊情况
案例:查询emp表中,部门编号(deptno)是30号的,员工编号(empno),姓名(ename),职位(job),部门编号(deptno)
select empno,ename,job,deptno
from emp
where deptno=30;
案例:查询emp表中,工资(sal)大于2000的,员工编号(empno),姓名(ename),工资(sal),奖金(comm)
select empno,ename,sal,comm
from emp
where sal > 2000;
案例:查询emp表中,工资在1000
~5000之间的,员工的编号(empno),姓名(ename),工资(sal),部门编号(deptno)
select empno,ename,sal,deptno
from emp
where sal>1000 and sal<5000;
说明:and表示并且的意思,通过and可以连接多个条件。
例如:条件1 and 条件2 and 条件3..........
案例:查询student表中,分数(score)大于70分或者地址(address)是杭州的,学员的编号(sid),姓名(sname),分数(score),地址(address)
select sid,sname,score,address
from student
where score>70 or address='杭州';
说明:or表示或者的意思,通过or可以连接多个条件
例如:条件1 or 条件2 or 条件3.....
案例:查询emp表中,工资(sal)不等于1250的,员工的编号(empno),姓名(ename),工资(sal),入职时间(hireda
te),根据入职时间降序排列
select empno,ename,sal,hiredate
from emp
where sal<>1250
order by hiredate desc;
------------------------------------
select empno,ename,sal,hiredate
from emp
Where not sal=1250
order by hiredate desc;
说明:not表示取反意思,一般情况下,not添加在列名前
(1)查询列值为NULL的情况
案例:查询emp表中,没有上级领导编号(mgr)的,员工信息
select * from emp where mgr is null;
练习:查询emp表中,奖金(comm)为null的,员工信息
select * from emp where comm is null;
(2)查询列值不为NULL的情况
案例:查询emp表中,有上级领导编号(mgr)的,员工信息
select * from emp where mgr is not null;
(3)between....and
查询从某个范围之间的数值
语法格式:
select 列名 from 表名 where 列名 between 初值 and 终值;
案例:查询emp表中,工资(sal)在1000~5000之间的,员工的编号(empno),姓名(ename),工资(sal)
select empno,ename,sal
from emp
where sal between 1000 and 5000;
说明:使用between...and查询的数值包含初值和终值。
select empno,ename,sal
from emp
where sal >=1000 and sal<=5000;
(4)in ---> 重点
比较一个列中,是否存在要查找的几个列值
语法格式:
select 列名 from 表名 where 列名 in(列值1,列值2,.....列值n);
案例:查询emp表中,员工编号(empno)是7521、7654、7902的员工信息
select * from emp
where empno in(7521,7654,7902);
------------------------------------
select * from emp where empno=7521 or empno=7654 or empno=7902;
练习:查询student表中,地址(address)是北京、上海、成都、杭州的学员信息
select * from student where address in('北京','上海','成都','杭州');
(5)模糊查询 ---> 重点
语法格式:
select 列名 from 表名 where 列名 like 条件;
说明-条件:
- % 表示0个或者多个任意字符
- _ 表示任意1个字符
案例:查询emp表中,员工姓名(ename)以M开头的(首字母/第1个字母),员工的编号(empno),姓名(ename),职位(job)
分析: Mabc M --->M%
select empno,ename,job
from emp
where ename like 'M%';
案例:查询emp表中,员工姓名(ena
me)包含(含有)字母N的,学员编号(empno),姓名(ename),职位(job)
分析:Ndf N ferN rtrNdfd
----->%N%
select empno,ename,job
from emp
where ename like'%N%';
聚合(分组)函数
count sum avg min max
(1)count(*/列名)
*:表示统计某张表中,数据的总条数
列名:表示统计某列中,列值不为NULL的,数据的总条数
案例:查询emp表中,员工的总数量
并起别名显示
select count(*) as 员工总数 from emp;
案例:查询emp表中,奖金(comm)不是NULL的,员工的总数量
select count(comm) from emp;
(2)sum(列名)
统计某列中,列值的累加之和
案例:查询emp表中,员工的工资(sal)总和并起别名显示
select sum(sal) 工资总和 from emp;
(3)avg(列名) 求平均数
案例:查询emp表中,员工的平均工资(sal)
select avg(sal) from emp;
(4)min(列名) 求最小值
案例:查询emp表中,员工的最低工资(sal)
select min(sal) from emp;
(5)max(列名) 求最大值
案例:查询emp表中,员工的最高工资(sal)
select max(sal) from emp;
分组查询
分组查询就是,根据表中的某一"列",把数据分成几组(列值相同的分成一组),然后对每一组数据使用聚合函数,
聚合函数经常和分组查询一起使用。
语法格式:
select 列名/聚合函数 from 表名
where 条件
group by 列名
order by 列名1/聚合函数 asc/desc,列名2/聚合函数 asc/desc;
案例:查询student表中,学员的性别(sex),每个性别的人数
select sex,count(*)
from student
group by sex;
having语句
having语句就是对分组后的数据,再次进行过滤,使用having语句,
having语句必须和group by一起使用。
语法格式:
select 列名/聚合函数 from 表名
where 条件
group by 列名
having 条件
order by 列名1/聚合函数 asc/desc,列名2/聚合函数 asc/desc;
where和having的区别:
- where是对整张表中的数据,进行过滤,可以单独使用
- having是对分组后的数据,进行过滤
不可以单独使用,必须和group by一起使用。
案例:查询emp表中,部门的平均工资高于2000的,部门的编号(deptno),部门的人数,部门的平均工资
select deptno,count(*),avg(sal)
from emp
group by deptno
having avg(sal)>2000;
说明:如果是表中存在的"列",使用where,不存在的"列",使用having
子查询(嵌套查询)
子查询就是在一条SQL语句内部,又包含一条SQL语句
案例:查询emp表中,工资高于平均工资的,员工的编号(empno),姓名(ena
me),职位(job),工资(sal)
(1)先求出emp的平均工资
select avg(sal) from emp;
(2)合成
select empno,ename,job,sal
from emp
where sal>(select avg(sal) from emp);
MySQL数据库-函数
数值类型函数
(1)round(数值,位数) 四舍五入函数
如果位数>0,保留小数点后几位小数
如果位数=0,不保留小数
如果位数<0,小数点前第几位,进行四舍五入
select round(35.376,2); --35.38
select round(35.376,1); --35.4
select round(35.776,0); --36
select round(35.376,-1); --40
select round(35.376,-2); --0
select round(75.376,-2); --100
select round(35.376,0); --35
(2)truncate(数值,位数) 截取函数
如果位数>0,保留小数点后几位小数
如果位数=0,不保留小数
如果位数<0,舍弃小数点前第几位
select truncate(45.937,2); --45.93
select truncate(45.937,1); --45.9
select truncate(45.937,0); --45
select truncate(45.937,-1); --40
select truncate(45.937,-2); --0
select truncate(75.937,-2); --0
(3)rand(n) 随机数函数
rand随机数函数,可以生成0~1之间的随机数,当n数值固定不变时,生成的随机数也固定不变
select rand();
select rand(5);
select rand()*100;
(4) sqrt(n) 平方根函数
select sqrt(2);
select sqrt(3);
select sqrt(4);
(5)mod(n,m) 余数函数
select mod(10,3);
select mod(10,4);
字符类型函数-->重点
(1)length(列名/字符串)
统计列值/字符串中字符的长度(个数)
案例:查询emp表中,员工姓名以及姓名的长度
select ename,length(ename) from emp;
案例:查询HelloPython字符串的长度
select length('HelloPython');
(2)trim(列名/字符串)
去掉列值/字符串2端的空格
案例:去掉字符串北京欢迎你2端的空格
select trim(' 北京 欢迎您 ');
(3)substring(参数1,参数2,参数3)
用于字符串/列值的截取
说明:
参数1:被截取的字符串/列名
参数2:从哪里开始截取
如果是正数,表示从正数第几位开始截取
如果是负数,表示从倒数第几位开始截取
参数3:截取字符串/列值的长度
截取字符串/列值的方向是自左向右截取
案例:截取字符串HelloPython
select substring('HelloPython',3,5);
select substring('HelloPython',-5,3);
练习:查询emp表中,员工姓名,以及姓名最后2个字母
select ename,substring(ename,-2,2) from emp;
(4)reverse(列名/字符串)
字符串逆序函数
案例:将字符串abcde逆序显示
select reverse('abcde');
(5)concat(列名1/字符串1, 列名2/字符串2,..... 列名n/字符串n)
字符串拼接函数
案例:字符串拼接
select concat('百川东到海', '何时复西归', '少壮不努力', '老大徒伤悲');
日期类型函数
(1)curdate() 获取系统当前日期
select curdate();
(2)curtime() 获取系统当前时间
select curtime();
(3)sysdate() 获取系统当前日期时间
select sysdate();
(4)year(date) 获取年份
select year(sysdate());
(5)month(date) 获取月份
select month('2020-11-11');