Day——02 数据库及表操作



创建、删除、查看数据库

提示: (1)SQL语句对大小写不敏感。推荐关键字使用大写,自定义的名称(库名,表名,列名等)使用小写。

SHOW DATABASES; -- 查看当前数据库服务器中的所有库
CREATE DATABASE mydb1; -- 创建mydb1库

(2)并且在自定义名称时,针对多个单词不要使用驼峰命名,而是使用下划线连接。(例如:tab_name,而不是 tabName )

– 01.查看mysql服务器中所有数据库

show databases; -- 查询服务器所有的数据库
show tables; -- 查询当前库所有表

– 02.进入某一数据库(进入数据库后,才能操作库中的表和表记录)

– 语法:USE 库名;

use mysql; -- 进入到‘mysql’数据库

– 查看已进入的库(了解)

select database();

– 03.查看当前数据库中的所有表

-- 先进入某一个库,再查看当前库中的所有表
use test;
show tables;

– 04.删除mydb1库

– 语法:DROP DATABASE 库名;

drop database mydb1;

-- 思考:当删除的库不存在时,如何避免错误产生?

drop database if exists mydb1;

– 05.重新创建mydb1库,指定编码为utf8

– 语法:CREATE DATABASE 库名 CHARSET 编码;

– 需要注意的是,mysql中不支持横杠(-),所以utf-8要写成utf8;

create database mydb1 charset utf8;

– 如果不存在则创建mydb1;

create database if not exists mydb1 charset utf8; 

– 06.查看建库时的语句(并验证数据库库使用的编码)

– 语法:SHOW CREATE DATABASE 库名;

show create database mydb1; -- 查看mydb1库的建库语句

创建、删除、查看表

– 07.进入mydb1库,删除stu学生表(如果存在)

– 语法:DROP TABLE 表名;

use mydb1; -- 进入到mydb1库
drop table if exists stu; -- 如果存在stu表,则删除

– 08.创建stu学生表(编号[数值类型]、姓名、性别、出生年月、考试成绩[浮点型]),建表的语法:

CREATE TABLE 表名(
	列名 数据类型,
	列名 数据类型,
	...
  	列名 数据类型
);

SQL语句:

-- 修改建表语句,将id设置为主键,并设置主键自增策略
use mydb1;
drop table if exists stu; -- 如果存在则删除stu表
create table stu(
    id int primary key auto_increment,
    name varchar(20),
    gender varchar(10),
    birthday date,
    score double
);

– 09.查看stu学生表结构

– 语法:desc 表名

desc stu;

新增、更新、删除表记录


– 10.往学生表(stu)中插入记录(数据)

– 语法:INSERT INTO 表名(列名1,列名2,列名3…) VALUES(值1,值2,值3…);

-- 如果是在cmd窗口(默认编码为GBK)中插入记录,在插入之前,先set names GBK;通知mysql服务器用GBK接收cmd发送过去的数据,这样可以避免中文乱码问题
insert into stu(id,name,gender,birthday,score) values(1,'tom','male','2000-2-3',85);
insert into stu values(null,'张飞','male','1988-1-1',78);
insert into stu values(3,'刘备','male','1985-4-5',90);

提示:

(1)当为所有列插入值时,可以省写列名,但值的个数和顺序必须和声明时列的个数和顺序保持一致!
(2)SQL语句中的值为字符串或日期时,值的两边要加上单引号(有的版本的数据库双引号也可以,但推荐使用单引号)。
(3)(针对cmd窗口)在插入数据之前,先设置编码:set names gbk;
或者用以下命令连接mysql服务器:
	mysql --default-character-set=gbk -uroot -proot
	一般的状态是  在导入到数据库里面的数据出现对应的乱码的时候
等价于:
	mysql -uroot -proot
	set names gbk;

– 11.查询stu表所有学生的信息

– 语法:SELECT 列名 | * FROM 表名

select * from stu;

– 12.修改stu表中所有学生的成绩,加10分特长分

– 修改语法: UPDATE 表名 SET 列=值,列=值,列=值…[WHERE子句];

update stu set score=score+10;
update stu set score+=10; -- mysql不支持+=

– 13.修改stu表中编号为1的学生成绩,将成绩改为83分。

update stu set score=83 where id=1;

提示:where子句用于对记录进行筛选过滤,保留符合条件的记录,将不符合条件的记录剔除。

– 14.删除stu表中所有的记录

– 删除记录语法: DELETE FROM 表名 [where子句]

delete from stu; -- 删除表中的所有记录

– 仅删除符合条件的

delete from stu where id>2; -- 删除id大于2的记录

查询表记录


– 准备数据: 以下练习将使用db10库中的表及表记录,请先进入db10数据库!!!

基础查询

SELECT 语句用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。

语法:SELECT 列名称 | * FROM 表名

提示:(1) *(星号)为通配符,表示查询所有列。

(2)但使用 *(星号)有时会把不必要的列也查出来了,并且效率不如直接指定列名

– 15.查询emp表中的所有员工,显示姓名,薪资,奖金

select name,sal,bonus from emp;

– 16.查询emp表中的所有部门和职位

select dept,job from emp; -- 其中包含大量重复记录

思考:如果查询的结果中,存在大量重复的记录,如何剔除重复记录,只保留一条? */

– 在select之后、列名之前,使用DISTINCT 剔除重复的记录

select distinct dept,job from emp; -- 剔除重复的记录

WHERE子句查询

WHERE子句查询语法:SELECT 列名称 | * FROM 表名称 WHERE 列 运算符 值

WHERE子句后面跟的是条件,条件可以有多个,多个条件之间用连接词(or | and)进行连接

下面的运算符可在 WHERE 子句中使用:
在这里插入图片描述

– 17.查询emp表中【薪资大于3000】的所有员工,显示员工姓名、薪资

select name,sal from emp where sal>3000;

– 18.查询emp表中【总薪资(薪资+奖金)大于3500】的所有员工,显示员工姓名、总薪资

-- 因为任何值和null做运算,结果还是null,所以下列查询的结果不准确
select name, sal+bonus from emp where sal+bonus > 3500;

– ifnull(列名, 值)函数: 判断指定的列是否包含null值,如果有null值,用第二个值替换null值

-- 用ifnull()函数处理bonus列中的null值,如果有null值,用0替换
select name, sal+ifnull(bonus,0) from emp 
where sal+ifnull(bonus,0) > 3500;

– 注意查看上面查询结果中的表头,如何将表头中的 sal+bonus 修改为 “总薪资”

– 使用as可以为表头指定别名

select name as 姓名, sal+ifnull(bonus,0) as 总薪资 from emp 
where sal+ifnull(bonus,0) > 3500;

– 另外as可以省略

select name 姓名, sal+ifnull(bonus,0) 总薪资 from emp 
where sal+ifnull(bonus,0) > 3500;

– 19.查询emp表中【薪资在3000和4500之间】的员工,显示员工姓名和薪资

select name,sal from emp
where sal>=3000 and sal<=4500;

– 提示: between…and… 在…和…之间

select name,sal from emp
where sal between 3000 and 4500;

– 20.查询emp表中【薪资为 1400、1600、1800】的员工,显示员工姓名和薪资

select name,sal from emp
where sal=1400 or sal=1600 or sal=1800;

– 或者

-- 只要员工的薪资满足 () 中的任何一个值,就算符合条件!
select name,sal from emp
where sal in (1400,1600,1800);

– 21.查询薪资不为1400、1600、1800的员工,显示员工姓名和薪资

select name,sal from emp
where not(sal=1400 or sal=1600 or sal=1800);
-- 或者是
select name,sal from emp
where sal not in (1400,1600,1800);

– 22.(自己完成) 查询emp表中【薪资大于4000和薪资小于2000】的员工,显示员工姓名、薪资。

select name,sal from emp
where sal>4000 or sal<2000;

– 23.(自己完成) 查询emp表中薪资大于3000并且奖金小于600的员工,显示员工姓名、薪资、奖金。

select name,sal,bonus from emp
where sal>3000 and bonus<600; -- 没有处理null值,结果不准确

– 处理null值

select name,sal,ifnull(bonus,0) from emp
where sal>3000 and ifnull(bonus,0)<600;

– 24.查询没有部门的员工(即部门列为null值)

select * from emp where dept=null; -- 任何值都不等于null
-- 查询某一列中有没有null值,用 is, 不要用 = 判断
select * from emp where dept is null;

– 思考:如何查询有部门的员工(即部门列不为null值)

select * from emp where not(dept is null);
-- 或
select * from emp where dept is not null;

模糊查询

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

可以和通配符(%、_)配合使用,其中"%"表示0或多个任意的字符,"_"表示一个任意的字符

语法:SELECT 列 | * FROM 表名 WHERE 列名 LIKE 值

示例:

– 25.查询emp表中姓名中以"刘"字开头的员工,显示员工姓名。

select name from emp where name like '刘%'; 
-- %:表示0或多个任意字符

– 26.查询emp表中姓名中包含"涛"字的员工,显示员工姓名。

select name from emp where name like '%涛%';

– 27.查询emp表中姓名以"刘"开头,并且姓名为两个字的员工,显示员工姓名。

-- 以"刘"开头,并且姓名为两个字的员工
select name from emp where name like '刘_';
-- 以"刘"开头,并且姓名为三个字的员工
select name from emp where name like '刘__';

多行函数查询

多行函数也叫做聚合(聚集)函数,根据某一列或所有列进行统计。

常见的多行函数有:

多行函数作用
COUNT( 列名 | * )统计结果集中指定列的记录的行数。
MAX( 列名 )统计结果集中某一列值中的最大值
MIN( 列名 )统计结果集中某一列值中的最小值
SUM( 列名 )统计结果集中某一列所有值的和
AVG( 列名 )统计结果集中某一列值的平均值

提示:(1)多行函数不能用在where子句中

(2)多行函数和是否分组有关,分组与否会直接影响多行函数的执行结果。

(3)多行函数在统计时会对null值进行过滤,直接将null值丢弃,不参与统计。

– 28.统计emp表中薪资大于3000的员工个数

-- count(*): 对所有列求行数
select count(*) from emp where sal>3000; -- 7行

– 29.求emp表中的最高薪资

select max(sal) from emp; -- 求最高薪资, 5000
select min(sal) from emp; -- 求最低薪资, 1400

– 30.统计emp表中所有员工的薪资总和(不包含奖金)

select sum(sal) from emp; -- 对薪资这列的值求和, 39650
select sum(bonus) from emp; -- 对奖金这列的值求和, 5900

– 31.统计emp表员工的平均薪资(不包含奖金)

select sum(sal) / count(*) from emp;
select avg(sal) from emp;

多行函数需要注意的问题:

  • 多行函数和是否分组有关,如果查询结果中的数据没有经过分组,默认整个查询结果是一个组,多行函数就会默认统计当前这一个组的数据。产生的结果只有一个。

  • 如果查询结果中的数据经过分组(分的组不止一个),多行函数会根据分的组进行统计,有多少个组,就会统计出多少个结果。

select * from emp;

例如:统计emp表中的人数

select count(*) from emp; -- 12

结果返回的就是emp表中的所有人数

再例如:根据性别对emp表中的所有员工进行分组,再统计每组的人数,显示性别和对应人数

select gender,count(*) from emp group by gender; -- 2,10

分组查询

GROUP BY 语句根据一个或多个列对结果集进行分组。

在分组的列上我们可以使用 COUNT,SUM,AVG,MAX,MIN等函数。

语法:SELECT 列 | * FROM 表名 [WHERE子句] GROUP BY 列;

– 32.对emp表,按照部门对员工进行分组,查看分组后效果。

select * from emp group by dept;

– 33.对emp表按照职位进行分组,并统计每个职位的人数,显示职位和对应人数

-- 分成几个组,就会统计几个组的人数
select job,count(*) from emp group by job;

– 34.对emp表按照部门进行分组,求每个部门的最高薪资(不包含奖金),显示部门名称和最高薪资

select dept,max(sal) from emp group by dept;

排序查询

使用 ORDER BY 子句将结果集中记录根据指定的列排序后再返回

语法:SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC]

ASC(默认)升序,即从低到高;DESC 降序,即从高到低。

– 35.对emp表中所有员工的薪资进行升序(从低到高)排序,显示员工姓名、薪资。

select name, sal from emp order by sal; -- 默认是asc,也就是升序
select name, sal from emp order by sal asc;

– 36.对emp表中所有员工的奖金进行降序(从高到低)排序,显示员工姓名、奖金。

select name, bonus from emp order by bonus desc;

分页查询

在mysql中,通过limit进行分页查询,查询公式为:

limit (页码-1)*每页显示记录数, 每页显示记录数

– 37.查询emp表中的所有记录,分页显示:每页显示3条记录,返回所有页的数据。

-- 每页显示3条,查询第 1 页
select * from emp limit 0, 3;
-- 每页显示3条,查询第 2 页
select * from emp limit 3, 3;
-- 每页显示3条,查询第 3 页
select * from emp limit 6, 3;
-- 每页显示3条,查询第 4 页
select * from emp limit 9, 3;

– 38.求emp表中薪资最高的前3名员工的信息,显示姓名和薪资

-- 查询员工姓名和薪资, 按照降序显示薪资
select name,sal from emp order by sal desc;
-- 在上面查询的基础上分页查询,每页显示3条,只查询第一页
select name,sal from emp order by sal desc limit 0,3;

其他函数

函数名解释说明
curdate()获取当前日期,格式是:年月日
curtime()获取当前时间 ,格式是:时分秒
sysdate()/now()获取当前日期+时间,格式是:年月日 时分秒
year(date)返回date中的年份
month(date)返回date中的月份
day(date)返回date中的天数
hour(date)返回date中的小时
minute(date)返回date中的分钟
second(date)返回date中的秒
CONCAT(s1,s2…)将s1,s2 等多个字符串合并为一个字符串
CONCAT_WS(x,s1,s2…)同CONCAT(s1,s2,…)函数,但是每个字符串之间要加上x,x是分隔符

– 39.查询emp表中所有【在1993和1995年之间出生】的员工,显示姓名、出生日期。

select name, birthday from emp
where birthday >= 1993 and  birthday <= 1995; -- 错误写法!
-- 可以将1993和1995转成日期,再和birthday进行比较
select name, birthday from emp
where birthday >= '1993-1-1' and birthday <= '1995-12-31';

-- 将birthday中的年份提取出来,再和1993、1995进行比较
select name, birthday from emp
where year(birthday) between 1993 and 1995;

– 40.查询emp表中本月过生日的所有员工

-- 本月过生日的员工(当前月份=员工的出生月份)
select * from emp
where month( now() ) = month( birthday );
-- 下个月过生日的员工(当前月份为12月时,无法查出下个月过生日的员工)
select * from emp
where month( now() ) + 1 = month( birthday );
-- 下个月过生日的员工(无论哪个月份,都可以查出下个月过生日的员工)
select * from emp
where (month( now() ) + 1) % 12 = month( birthday ) %12;

– 41.查询emp表中员工的姓名和薪资(薪资格式为: xxx(元) )

select name, concat(sal,'(元)') from emp;

– 补充练习:查询emp表中员工的姓名和薪资(薪资格式为: xxx/元 )

-- concat函数,是对传入其中的字符串进行拼接,没有任何间隔符
select name, concat(sal,'/元') from emp;
-- concat_ws函数,传入的第一个参数是分隔符,将其他字符串拼接在一起,在拼接各个字符串时,会通过分隔符进行分割
select name, concat_ws('/',sal,'元') from emp;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值