Java学习 day39_SQL

数据库

介绍

数据库其实就是用来存储和管理数据的仓库。

其实我们身边的其他从业人员大多都是使用Excel来存储和管理数据的,我们的数据库其实就是和excel是类似的,也是一个一个表来给我们管理数据。数据库的使用比excel要强大很多。

分类

数据库分为两种:

  • 关系型数据库

    关系型数据库其实就是表示这种数据库不光光可以用来存储数据,还可以存储数据与数据之间的关系。关系型数据库存储数据一般都存储在磁盘上,去读写数据的时候就要经过磁盘的IO,所以速度比较慢。

    在这里插入图片描述

    产品:

    • Oracle:Oracle是目前市面上使用率最广的数据库之一,是收费的
    • MySQL:MySQL也是目前市面上使用率最广的数据库之一,目前是Oracle公司的产品,但是有两个版本,一个是社区版,一个是收费版
    • MariaDB:目前用户比较多的一款开源数据库产品,国内用的不太多,国外用的比较多
    • SQL server:是微软的一个数据库产品,目前在国内市场上,大概和Oracle、MySQL三足鼎立
    • Access:也是微软的一款数据库产品,目前使用的用户比较少
    • SQL lite:这个其实是一个很小的数据库产品,我们在Android手机中,用这个数据库来存储联系人,短信等等信息
    • OceanBase:这个是阿里巴巴的一个数据库产品。目前只有在银行和证券公司中有使用,互联网公司中用的比较少。
  • 非关系型数据库

    非关系型数据库其实就是只是用来存储数据,不能用来存储数据与数据之间的关系。非关系型数据库在出现的时候,不是用来替代关系型数据库的,而是作为关系型数据库的一个良好的补充,所以非关系型数据库一般是把数据存储在内存中,读写会比较快,但是容易丢失。

    • Memcache 其实就是一个内存管理工具,是一个比较老的非关系型数据库
    • Redis:是目前使用的最多,最火的一个非关系型数据库产品
    • MongoDB
    • HBase

安装

  • MySQL的安装
    网上找教程吧!!!!

按照文档来卸载安装即可。

  • Navicat的安装

    是一个数据库的图形化界面工具,可以让我们减少一些命令的操作,可以很方便的帮助我们去操作数据库

使用

首先我们来学习关系型数据库怎么使用

问题:关系型数据库的产品这么多,那么是不是我们每一个关系型数据库都需要我们来学习呢?

其实不是的,我们去操作关系型数据库都有一个统一的标准,这个标准叫做SQL标准语法

SQL:Structured Query Language 结构化查询语言,这个SQL是操作所有的关系型数据库的一个标准,有了这个标准,我们只需要学习SQL标准语法就可以去操作各个数据库了。

SQL其实就是一套单独的操作数据库的语言,其实是和我们的Java语言是一样的,但是比Java语言要简单很多,SQL语法只是由一些简单的关键字组成,组成一条一条的SQL语句,通过这些SQL语句,我们就可以让数据库做出相应的操作。

数据库的组成

在这里插入图片描述


SQL语法

库的操作

CRUD:表示增删改查

程序员 = CRUD boy


连接数据库

命令行连接:mysql -uroot -p

图形化界面连接:

在这里插入图片描述


软件的产品形态:

C/S架构:Client/Server,一般来说c++开发c/s

B/S架构:Browser/Server,java开发b/s

mysql是c/s架构,服务端是mysql运行的服务,navicat和命令行相当于客户端

在这里插入图片描述


create database dbName;

我们在创建数据库的时候需要指定字符集,字符集一般使用 UTF-8。默认的字符集不是UTF-8,而是Latin1,这种字符集的缺点是不支持中文。所以我们在创建数据库的时候要指定我们想要的字符集。

如果需要修改默认的字符集,那么需要在my.ini配置文件中,增加以下配置:

# 服务端使用的字符集默认为UTF8
character-set-server=utf8

# 设置mysql客户端默认字符集
default-character-set=utf8

一般来说,我们在创建数据库的时候,需要手动的去指定数据库的字符集。

create database dbName character set utf8 collate utf8_general_ci;

官方参考:字符集和校对规则

常用的字符集除了utf8之外,还有一个叫做utf8mb4,这个是utf8的一个拓展字符集。

常用的校对规则:

  • utf8-bin 二元校对规则,区分大小写
  • utf8_general_ci:case insensitive 不区分大小写的

中括号里面的内容,表示可以加可以不加。加上 if exists ,表示如果有对应的库,就去删除,如果没有,直接退出,不会报错。

drop database [if exists] dbName;

SQL标准语法没有给我们提供修改库的名字的方法,我们只能去修改库的字符集和校对规则。

alter database dbName character set utf8 collate utf8_bin;

  • 查看所有的数据库

    show databases;

  • 查看数据库的建库语句

    show create database dbName;


首先,我们需要让数据库知道我们是在哪一个库里面对表进行操作

use dbName;

# 创建表
create table user(
name,
age,
gender
);

# 整型 int byte short long 
# 因为占用的字节数不一样,所以存储范围不一样
create table t_int (
t1 tinyint,
t2 smallint,
t3 int,
t4 bigint
)character set utf8 collate utf8_bin;

# 浮点型 float double BigDecimal
# float double decimal 
create table t_f(
t1 float(4,2),
t2 double(6,2),
t3 decimal(8,2)
)character set utf8;

# 时间类型
create table time1(t1 year, t2 time, t3 date, t4 datetime, t5 timestamp);

# now(): 这个函数在mysql里面表示当前时间
insert into time1 values (now(),now(),now(),now(),now());

# 修改时区
set time_zone='+10:00'; 
# 修改了时区以后,我们发现 timestamp是跟着系统的时间走的,而datetime是跟着数据库的时区设置走的

# 字符串类型 char(),varchar() 括号里面的内容指的是字符的个数
create table t_str(
t1 char(5),
t2 varchar(20),
t3 text
)character set latin1;

# enum 在Java里面,枚举类是自己定义的,在我们定义枚举类的时候,我们要定义好这个枚举类具体的对象,枚举类型不能自己new对象
# 使用场景:例如我们去存储学生的性别的时候,那么这个时候性别只能是男或者女,这个时候我们可以使用枚举类来定义,这么做的目的其实就是让我们的编码更加规范,帮助我们去取限定值
create table stu(
	name varchar(20),
	gender enum('男','女'),
	age int
)character set utf8 collate  utf8_bin;

# set 集合类型
create table t_set(
t1 set('1','2','3')
);

# 集合类型里面的值只能存储集合类型定义的子集
create table t_set2(
t1 set('tom','bob','alice')
);

# 通常来说,我们不会使用enum和set这两种数据类型,其实这种两种数据类型就是在存储数据的时候,MySQL给我们加了一层逻辑,但是在工作中,我们一般不用MySQL给我们提供的逻辑

SET 存储数据底层逻辑官方解释

练习:创建员工表

## 练习
CREATE TABLE employee (
	id INT,
	NAME VARCHAR ( 20 ),
	gender enum ( 'male', 'female' ),
	birthday date,
	entry_date date,
	job VARCHAR ( 20 ),
	salary DOUBLE ( 8, 2 ),
	resume text 
) CHARACTER SET utf8;

# 当表名、列名需要用到MySQL里面的关键字的时候,我们需要使用 ` 给他包起来
create table `order`(
id int,
no varchar(255)
)character  set utf8;

drop table if exists tableName;

alter

  • 修改表名

    rename table employee to user;

  • 修改表的字符集

    alter table user character set utf8 collate utf8_bin;

  • 修改表的列

    • 新增列

      alter table stu add id int;

    • 删除列

      alter table stu drop userid;

    • 修改名字

      -- change 修改 修改字段的名字change 可以修改类型和名字 alter table stu change id userid bigint;

    • 修改类型

      -- modify 修改字段的类型modify 只能修改类型 alter table stu modify userid int;

  • 查看所有的表

    show tables;

  • 查看表的结构

    describe employee;
    desc employee;

  • 查看表的建表语句

    show create table employee;

数据

insert into user2 values (1,'张三','male','1989-10-22','2010-10-28','开发工程师',5000,null);

insert into user2 values 
(2,'张飞','male','1989-10-22','2010-10-28','屠夫',5000,null),
(3,'张东升','male','1989-10-22','2010-10-28','奥数老师',5000,null),
(4,'张宇','male','1989-10-22','2010-10-28','歌手',5000,null);

insert into user2 values (5,'佩奇',null,null,null,null,null,null);

insert into user2 (id,username) values (6,'红太狼'),(7,'小灰灰');
-- 注意:空串不是null
delete from user2 where username = '高圆圆';
-- 如果没有添加条件限制,那么会把表中的所有数据都删掉
delete from stu;
-- 这个也是清空表,但是一般不用
truncate tableName;
-- 修改数据
update user2 set gender = 'male';

update user2 set gender = 'female' where username = '红太狼';

update user2 set job='抓羊工程师',salary=100 where username = '红太狼';
基本语法
-- * 表示所有的列,如果不需要所有的列,那么就不要写*
-- 查询出来的结果大家可以理解为是一个新的表
select * from user2;
select id,username,job from user2;
条件限制语句-where
  • 逻辑运算符

    -- where 条件限制语句的目的是在表的所有的记录中给我们筛选出符合条件的所有的几率
    -- = != > < >= <=  and or in like between and not in not like
    select * from t_students where id = 4;
    select * from t_students where id != 4;
    select * from t_students where id <> 4; -- 不等于
    select * from t_students where id > 4;
    select * from t_students where id < 4;
    select * from t_students where id >= 4;
    select * from t_students where id <= 4;
    
  • in、not in、and、or、between and、like、not like

    -- and 
    select * from t_students where chinese = 90 and english = 90 and math = 100;
    -- or
    select * from t_students where class = '一班' or class = '二班';
    -- in 范围查找
    
    select * from t_students where class = '一班' or class = '二班' or  class = '三班';
    select * from t_students where class in ('一班','二班','三班');
    
    select * from t_students where id in (1,2,3,4);
    
    select * from t_students where id not in (1,2,3,4);
    
    -- between and 是根据一个范围区间进行查找,注意是闭区间
    select * from t_students where chinese between 80 and 100;
    
    -- like 模糊查询 %:表示通配  _:表示占位
    select * from t_students where name like '黄__';
    -- 查询出所有的名字中有'药'字的学生的信息
    select *from t_students where name like '%药%';
    -- 常见的baidu、google等等的搜索不是使用like关键字来做的,因为like的效率其实没有那么高,当我们需要大量的使用这种全局搜索的时候,我们应该使用搜索引擎(Solr、ES、lucense)
    
    -- 在MySQL中,0表示false、非0表示true
    select * from t_students where 100;
    
函数
  • distinct 过滤

    select distinct(class),id from t_students;

  • limit 限制结果集

    -- limit m,n: m表示从哪一条开始,第一条编号是0,n表示查询多少条
    select * from t_students limit 2,4;
    -- 分页的场景 pageSize pageNum
    select * from tableName limit (pageNum-1)*pageSize,pageSize;
    
  • 排序 order by

    -- 指定排序方向(ASC, DESC)
    select * from t_students order by chinese desc;
    -- 首先对语文成绩从高到低排序,然后对英语成绩从低到高排序,然后对数学成绩从高到低排序
    select * from t_students order by chinese desc,english asc,math desc;
    
  • 计算字段

    -- 查询各个学生的姓名以及总成绩
    select name as '用户名',chinese + english + math as '总成绩' from t_students;
    
  • 别名

    -- 查询各个学生的姓名以及总成绩
    select name as '用户名',chinese + english + math as '总成绩' from t_students;
    
    -- 也可以给表起别名
    select * from t_students as s where s.id = 1;
    

    as可以省略,但是不建议大家省略,因为省略了之后sql语句的可读性会变差,不利于维护

  • 分组

    也就是我们可以对我们查询出的结果集进行分组在这里插入图片描述

    -- 分组之外其他的字段,需要使用group_concat这个函数
    select GROUP_CONCAT(id) as ids,group_concat(name) as names,class  from t_students group by class;
    
    select class  from t_students group by class;
    
  • 聚合函数

    我们的分组通常来说是配合聚合函数一起来使用的

    • max 求最大值

    • min 求最小值

    • count 统计行数

    • sum 求和

    • avg 求平均值

    select max(id) from t_students;
    select min(id) from t_students;
    
    select count(1) from t_students;
    
    select max(id), class from t_students group by class;
    select min(id), class from t_students group by class;
    select min(id), class from t_students group by class;
    
    -- 求各个班级有多少个人
    select class, count(*) as '总人数' from t_students group by class;
    
    -- 求和
    -- 求一班数学的总分
    select sum(math) from t_students where class = '一班';
    -- 求一班数学的均分
    select avg(math) from t_students where class = '一班';
    
    -- 求各个班级数学的总分以及平均分
    select  
    	class,
    	sum(math) as '数学总分',
    	avg(math) as '数学平均分'
    from t_students group by class;
    

作业

create table student(
	id int,
	name varchar(20),
	chinese float,
	english float,
	math float
) character set utf8;

# 请添加2列信息,出生日期,籍贯。
alter table student add birthday date;
alter table student add birthPlace varchar(30);

# 请修改语文成绩的数据类型为int型.
alter table student modify chinese int;

# 请在里面插入10名学生数据。(名字请以汉字输入)
insert into student values (1, '张三', 90, 68, 98, '1993-09-12', '对角巷');
insert into student values (2, '李四', 80, 78, 97, '1993-05-19', '女巫路'),(3, '王五', 100, 98, 95, '1992-12-21', '麻瓜世界'),(4, '张伟', 60, 77, 95, '1991-05-01', '女巫路'),
(5, '赵六', 90, 78, 75, '1991-05-01', '女巫路'),(6, '李娜', 90, 78, 88, '1993-10-31', '查理街'),(7, '李伟', 60, 70, 89, '1993-04-12', '科洛尼亚街'),
(8, '王刚', 86, 75, 95, '1985-12-24', '幽灵世界'),(9, '张飞', 60, 68, 75, '1995-11-29', '查理街'),(10, '赵波', 90, 75, 89, '1994-06-09', '女巫路');

#假设10名同学中有同姓的,如王,请找出姓王同学的信息.
select * from student where name like '张%';

#请找出各科不及格学生的信息。分数输入有问题,假设70分算不及格吧
select group_concat(id), group_concat(name), chinese from student where chinese < 70 group by chinese;
select group_concat(id), group_concat(name), english from student where english < 70 group by english;
select group_concat(id), group_concat(name), math from student where math < 70 group by math;

# 请找出有任何一科不及格学生的名称
select name from student where chinese < 70 or english < 70 or math < 70;

# 请找出两科成绩在90分以上的学生名称。
select name from student where (chinese>90 and english>90) or (chinese>90 and math>90) or (english>90 and math>90);

# 请找出没有一科挂科的学生名称。
select name from student where chinese>70 and english>70 and math>70;
create table stu(
	id int(8),
	name varchar(20),
	gender enum('male', 'female'),
	age int,
	dept varchar(50)
)character set utf8;

insert into stu values (201801,'张飞', 'male', 20, '计算机系'),(201810,'李逵', 'male', 21, '信息系'),(201802,'张伟', 'female', 20, '计算机系'),
(201804,'王刚', 'female', 18, '数学系'),(201805,'李鬼', 'male', 19, '物理系'),(201803,'赵四', 'male', 21, '数学系'),(201806,'王磊', 'female', 28, '信息系'),
(201809,'王小波', 'male', 18, '物理系'),(201807,'陈静', 'female', 20, '数学系'),(201808,'赵飞', 'male', 18, '数学系');
# 查询全体学生的学号与姓名。
select id, name from stu;

# 查询全体学生的姓名、学号。
select name, id from stu;

# 查询全体学生的详细记录。
select * from stu;

# 查询全体学生的姓名、出生年份和所有系,使用列别名改变查询结果的列标题
select name as stu_name, age as birth_years, dept as department from stu;

# 查询所有年龄在20岁以下的学生姓名及其年龄。
select name, age from stu where age < 20;

# 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。
select name, dept, age from stu where age between 20 and 23;

# 查询信息系、数学系和计算机系学生的姓名和性别。
select name, gender from stu where dept in('计算机系', '信息系', '数学系');

#查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
select name, gender from stu where dept not in('计算机系', '信息系', '数学系');

# 查询学号为200518的学生的详细情况。
insert into stu values (200518, '孙膑', 'female', 23, '物理系');
insert into stu values (200510, '刘帮', 'male', 22, '数学系');
insert into stu values (200513, '刘六', 'male', 17, '计算机系');
select * from stu where id=200518;

# 查询所有姓刘学生的姓名、学号和性别。
select name, id, gender from stu where name like '刘%';

# 查询姓“李”且全名为两个汉字的学生的姓名。
select name from stu where name like '李_';

#查询名字中第2个字为“立"字的学生的姓名和学号。
insert into stu values (200509, '张国立', 'male', 25, '物理系');
insert into stu values (200507, '刘立波', 'male', 20, '信息系');
insert into stu values (200502, '王立', 'female', 17, '信息系');
select name,id from stu where name like '_立%';

#查询所有不姓刘的学生姓名。
select name from stu where name not like '刘%';

# 查询学号在201801~201809之间的学生姓名。
select name from stu where id between 201801 and 201809;

# 查询不同院系学生的人数。
select dept, count(*) from stu group by dept;

# 查询计算机系年龄在20岁以下的学生姓名。
select name from stu where dept='计算机系' and age < 20;


create table city(
	id int,
	name varchar(50),
	nation varchar(50),
	population int
)character set utf8;

insert into city values (1, 'qinghai', 'China', 101), (2, 'luoyang', 'China', 200), (3, 'Los Angelas', 'USA', 120), (4, 'qingdao', 'China', 150),
(5, 'Paris', 'France', 20), (6, 'wuhan', 'China', 230), (7, 'washinton', 'USA', 90), (8, 'Boston', 'USA', 80), (9, 'Sydney', 'Austrilia', 30),
(10, 'beijing', 'China', 500), (11, 'shanghai', 'China', 550), (12, 'New York', 'USA', 100), (13, 'London', 'Britian', 50), (14, 'San Francisco', 'USA', 150),
(15, 'hangzhou', 'China', 300);

# 查询所有城市名及人口信息
select name, population from city;

# 查询city表中,所有中国的城市信息
select * from city where nation = 'China';

# 查询人口数小于100人城市信息
select * from city where population < 100;

# 查询中国,人口数超过500w的所有城市信息
select * from city where nation = 'china' and population > 500;

# 6. 查询人口数为100w-200w(包括两头)城市信息
select * from city where population between 100 and 200;

# 查询中国或美国,人口数大于500w的城市
select * from city where nation in('China','USA') and population>500;

# 查询城市名为qing开头的城市信息
select * from city where name like 'qing%';

# 统计city表的行数
select count(*) from city;

#统计各国城市的个数
select nation, count(*) from city group by nation;

# .统计每个国家的总人口数
select nation, sum(population) from city group by nation;

# 统计每个国家的城市个数,并且只显示超过5个城市的国家
insert into city values (16, 'Malibu', 'USA', 400);
select nation, count(*) as num from city group by nation having num > 5;

# 统计每个国家的城市个数,并且只显示超过5个城市的国家并按照从大到小排序
select nation, count(*) as num from city group by nation having num > 5 order by num desc;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值