目录
MySql
关系型库数据
mysql启动方法
SQL通用语法
查询表
创建表
Mysql数据类型
表操作-修改
MySQL图形化界面
DCL
函数
约束
JDBC
建立在关系模型基础上,由多张相互连接的二维表组成的数据库
特点:
- 使用表存储数据,格式统一,便于维护
- 使用SQL语言操作,标准统一,使用方便
2.客户端链接:
1.MYsql提供的的客户端命令行工具
使用这种方式,需要配置PATH环境变量
1.SQL语句可以单行或多行书写,以分号结尾。
2.SQL语句可以使用空格/缩进来增强语句的可读性。
3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
4.注释:
单行注释:--注释内容 或# 注释内容(MySQL特有)
多行注释:/*注释内容*/
1.DDL
查询所有数据库
show databases;
查询当前数据库
select database();
创建
create database [if not exists] 数据库名称 [default charset 字符集] [collate 排序规则]
删除
drop database[if exists]数据库名
使用
use 数据库名
1.查询当前数据库所有表:
show tables;
2.查询表结构:
desc 表名;
3.查询指定表的建表语句:
show create table 表名;
如果将一个char 类型定义为 char (10),那么即使只输入了一个字符,它在内存中仍然占用10个字符
varchar 会在使用的时候根据内容去计算存储的内容,输入多少字符它就会占用几个字符。
对于用户的用户名最好使用 varchar ;但是只需要使用一个字符就可以表示性别 ;
1.添加字段
alter table 表名 add 字段名 类型(长度) [comment 注释] [约束]
2.修改数据类型
alter table 表名 modify 字段名 新数据类型(长度);
3.修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];
4.删除字段:
alter table 表名 drop 字段名;
5.修改表名
alter table 表名 rename to 新表名;
6.删除表
drop table [if exists] 表名;
7.删除指定表,并重新创建表
truncate table 表名;
在删除表时,表中的全部数据也会被删除。
DML:用来对数据库中表的数据记录进行增删改操作。
1.添加数据
(1)给指定字段添加数据
insert into 表名(字段名1,字段名2,...) values(值1,值2,...);
(2)给全部字段添加数据
insert into 表名 values(值1,值2,...);
(3)批量添加数据
insert into 表名(字段名1,字段名2,...)values(值1,值2,...),(值1,值2,...),(值1,值2,...);
insert into 表名(值1,值2,...),(值1,值2,...),(值1,值2,...);
- 插入数据时,指定的字段顺序需要与值的顺序是一一对应的
- 字符串和日期型数据应该包含在引号中
- 插入的数据大小,应该在字段的规定范围中
2.修改数据
update 表名 set 字段1 = 值1 , 字段名2 = 值2,...[where 条件];
修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
3.删除数据
delete from [表名] [where 条件]
- delete语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据
- delete 语句不能删除某一个字段的值(可是使用update)
DQL:
DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。
查询关键字:SELECT
(1)基本查询
(1)查询多个字段:
select 字段1,字段2,字段3... from 表名;
select *from 表名;
(2)设置别名
select 字段1 [AS 别名1], 字段2[AS 别名2] ...from 表名;
去除重复记录
select distinct 字段列表 from 表名;
(2)条件查询
注意点:
select *from emp where age=18 or age = 20 or age =40;
select *from emp wherer age in(18.20.40)
select *from emp where name like '__';
select *from emp where idcard like '%X';
select *from emp where idcard like '_________________X';
(3)聚合函数:
select count(*) from emp;
//16
若要统计某个限定条件的个数,例如统计来自西安地区的员工的年龄之和
select sum(age) from emp where work_address = '西安';
(4)分组查询
where与having区别:
- 执行时机不同: where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同: where不能对聚合函数进行判断,而having可以。
注意点;
- 执行顺序: where >聚合函数>having 。
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
例如要根据性别分组,统计男性员工 和 女性员工的数量
select gender,count(*) from emp group by gender;
或者查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
select work_address,count(*) address_count from emp where age <45
group by work_address having address_count >=3;
(5)排序查询
排序方式;
例如对一个表中的成员按照年龄升序排序
select *from emp order by age asc;
select *from emp order by age ;
例如根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序:
select *from emp order by age asc,entrydate desc ;
(6)分页查询
注意事项:
- 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。
一些练习:
-- 1.查询年龄为20,21,22,23岁的员工信息。
select *from emp where gender = '女' and age in(20,21,22,23);
-- 2.查询性别为男,并且年龄在20-40岁(含)以内的姓名为三个字的员工。
select *from emp where gender = '男' and age between 20 and 40 and name like '___';
-- 3.统计员工表中,年龄小于60岁的,男性员工和女性员工的人数。
select gender , count(*) from emp where age <60 group by gender;
-- 4.查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序
select name ,age from emp where age <=35 order by age asc,entrydate desc ;
-- 5、查询性别为男,且年龄在20-40岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
select *from emp where (age between 20 and 40) and gender ='男'
order by age asc , entrydate asc limit 5;
(7)DQL执行顺序
DCL用来管理数据库用户、控制数据库的访问权限。
(1)DCL管理用户
- 创建用户可以在任何主机访问该数据库,主机名用%
- 创建用户可以在某个主机上访问该数据库,则需要指定主机名
(2)DCL-权限控制
- 多个权限之间,使用逗号分隔
- 授权时,数据库名和表名可以使用*进行通配,代表所有。
函数是指一段可以直接被另一段程序调用的程序或代码。
(1)字符串函数:
select concat('Hello,','Mysql');
-- Hello,Mysql
select lower('HELLO');
-- hello
select upper('hello');
-- HELLO
select lpad('01',5,'-');
-- ---01
select trim(' Hello MySQL ');
-- Hello MySQL
select substring('Hello MySql',1,5);
-- Hello
通过字符串 lpad 函数 ,可以实现对学生 学号前面的填充
例如设定学生的学号 id
执行以下语句后:
update student
set student_id = lpad(student_id,9,'20224010')
where Entrance_time = '2022-09-01';
(2)数值函数
select ceil(1.1);
-- 2
select floor(1.9);
-- 1
select mod(3,5);
-- 3
select rand();
-- 0.7219960677642339
-- 0.6061000177693553
-- 0.8645119162877202
select round(2.567,2);
-- 2.57
通过数据库的函数,生成一个六位数的随机验证码:
select lpad (round(rand()*1000000,0),6,'0');
-- 504260
-- 927762
-- 024998
(3)日期函数
select curdate();
-- 2023-04-10
select curtime();
-- 21:25:40
select now();
-- select now();
select YEAR(now());
-- 2023
select MONTH(now());
-- 4
select DAY(now());
-- 11
select date_add(now(),INTERVAL 70 YEAR);
-- 2093-04-10 21:26:29
select datediff('2022-12-01','2001-09-01');
-- 7761
(4)流程函数
select
name,
( case Entrance_time when '2022-09-01' then '大一' when '2021-09-01' then '大二' else '大三'end)
from student;
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确、有效性和完整性。
约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
1.约束演示
create table user(
id int primary key auto_increment comment '编号',
name varchar(10) not null unique comment'姓名',
age int check (age between 0 and 120) comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别'
)comment '用户表';
insert into user( name, age, status, gender)
values ('Tom',19,'1','男'),('Jack',20,'0','男');
为编号增加了一个 auto_increment 约束,就可以明显见到编号是不断在自增的
给姓名增加的约束 not null 和 unique 添加姓名时不能为空或者重复
(3)外键约束
外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
目前上述的两张表,在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。
外键约束的删除和更新可用于实现课表与老师或者老师和学生之间的联系
多表查询:
JDBC就是使用Java语言操作关系型数据库的一套API
JDBC本质:
- 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
JDBC好处:
- 各数据库厂商使用相同的接口,Java代码不
- 需要针对不同数据库分别开发
- 可随时替换底层数据库,访问数据库的Java代码基本不变
常用接口
DriveManager:用于管理JDBC驱动的服务类
Connection:代表数据库连接对象
ResultSet:结果集对象