常用的类型
1.数值 最常用是int
2.字符串 最常用是 varchar 如果是大文本 就用text
3.时间类型 datatime 可以是 HH:MM:SS 也可以是HH:mm :ss 这个是时间,还有时间戳格式 是timestamp 1970.1.1 到现在的毫秒值
字段属性
-
unsigned 声明该列不能为负数
-
zerofill 零填充 不足的为数用0来填充
-
自增 自动在上一条的基础上加一 用来设置唯一的住建
-
非空 null 和 notnull 假设设置为notnull 如果不赋值会报错, null 如果不填默认为null
数据库语句
修改
-
alter eg. alter table student rename as student1 修改表的名字 alter table 旧表名 rename as 新表名
-
alter eg,alter table student1 add age int (2); 往表里面增加字段 alter table 表名 add 字段名 约束 (长度)
-
alter eg,alter table student modify age varchar (11); 这个是修改某个字段的类型 修改约束 alter table 表名 modify 字段名 约束(长度)
-
alter eg,alter table student1 change age age1 int(11); 这个是修改某个字段的名字 alter table 表名 change 旧字段名 新字段名 约束(长度)
-
alter eg, alter table student1 drop age1; 删除表里面的字段 alter table 表名 drop 字段名
删除
删除表 drop table if exist 表名 尽量判断下是否存在
mysql 数据管理
-
添加 insert insert into 表名 (字段名,字段名)values (’值‘,值);字段名是可以省略的,但是后面的值必须是一一对应的(在我写添加的时候遇到一个问题,我们有设置主键自增,在添加的时候id是需要写的,如果设置了自增,就可以不用写)
-
修改 update update 表名 set
字段名
= ’值‘ where id = 1; 这里要注意,一定要带条件 where 要不然会所有的都修改为那个值
修改多个值 update 表名 set 字段名
= ’值‘ , 字段名
= ’值‘ where id = 1; 操作符 返回的是Boolean
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | ||
<> != | 不等于 | ||
> | |||
< | |||
>= | |||
<= | |||
between .... and | 在什么之间 | ||
and | |||
or |
update student
set name
= '谢谢谢'where name
='谢谢谢' and sex
= '1';
3.删除
delete 删除完,在新建数据库,自增是从上一个开始的 比如上一个是到4 那么这个数据库就是从5开始
truncate 是从1开始
4.查询(最重要)
select 比如我们在一个数据库里面的字段是studentno 我们在查找数据库的时候 可以重命名,但是不影响数据库中的字段名字
select ‘studentno’ as 学号from student as 这个是别名
concat 拼接(a,b)
去重 去掉重复的数据 select studentno
from result (这个result 表是成绩表,有学号,课程号,分数) 学生号是会重复的
select distinct studentno
from result
where
-
select studentno, studentresult from result where studentresult >=95 and studentresult<=100;
2.select studentno, studentresult from result where not studentresult =100;
-
select studentno, studentresult from result where studentresult between 95 and 100;
模糊查询
like % _
% 这个是不限定字数
select studentno from student where studentname like '李%'; 会查出来李后面有两个字和三个字的 % 建 % 查出来带有建字的
select studentno , studentname from student where studentname like '李_'; 会查出来 李后面有一个字的; 带两个__ 查出来后面有两个字的
连表查询
join on 是个固定语法 join on是连接查询 where 是等值查询
select s.studentno ,studentname,subjectno,studentresult from student as s left join result as r on s.studentno = r.studentno;
后面还可以加where
自联表
CREATE TABLE school
.category
( categoryid
INT(3) NOT NULL COMMENT 'id', pid
INT(3) NOT NULL COMMENT '父id 没有父则为1', categoryname
VARCHAR(10) NOT NULL COMMENT '种类名字', PRIMARY KEY (categoryid
) ) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;
INSERT INTO school
.category
(categoryid
, pid
, categoryname
) VALUES ('2', '1', '信息技术'); insert into school
.CATEGOrY
(categoryid
, pid
, categoryname
) values ('3', '1', '软件开发'); insert into school
.category
(categoryid
, PId
, categoryname
) values ('5', '1', '美术设计'); insert iNTO School
.category
(categoryid
, pid
, categorynamE
) VAlUES ('4', '3', '数据库'); insert into school
.category
(CATEgoryid
, pid
, categoryname
) values ('8', '2', '办公信息'); insert into school
.category
(categoryid
, pid
, CAtegoryname
) values ('6', '3', 'web开发'); inserT INTO SCHool
.category
(categoryid
, pid
, categoryname
) valueS ('7', '5', 'ps技术');
类似这样的表,其实应该是两张表,合成了一张,我们在取数据的时候,需要把这一张表拆分成两张边,其中 第二张表的categoryid
是另一张表的pid;
去查数据时
select a.categoryname,b.categoryname from category as a ,category as b where a.categoryid = b.pid; 几乎是这样的语法
升序降序 desc 是降序 asc 是升序
标准语句
select s.studentno,studentname,subjectname,studentresult from student s inner join result r on s.studentno = r.studentno inner join subject sub on sub.subjectno = r.subjectno where subjectname = '美术' order by studentresult desc;
limit 分页
select s.studentno,studentname,subjectname,studentresult from student s inner join result r on s.studentno = r.studentno inner join subject sub on sub.subjectno = r.subjectno where subjectname = '美术' order by studentresult desc limit 0,5;这个代表从第0条数据开始,一页展示5条数据
pageSize 是页面数据 n:当前页 (n-1)*pageSize就是起始值 页面总数/页面大小=页数
限制的顺序
1where group by having order by limit(分页)
子查询
在where 语句中嵌套一个语句
in 的用法:IN 操作符允许我们在 WHERE 子句中规定多个值。
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
聚合函数
1.count()
count(1) count(*) count(列名)自己百度区别
现在,我们希望查找每个客户的总金额(总订单)。
O_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
如果不加上group by
Customer | SUM(OrderPrice) |
---|---|
Bush | 5700 |
Carter | 5700 |
Bush | 5700 |
Bush | 5700 |
Adams | 5700 |
Carter | 5700 |
那么为什么不能使用上面这条 SELECT 语句呢?解释如下:上面的 SELECT 语句指定了两列(Customer 和 SUM(OrderPrice))。"SUM(OrderPrice)" 返回一个单独的值("OrderPrice" 列的总计),而 "Customer" 返回 6 个值(每个值对应 "Orders" 表中的每一行)。因此,我们得不到正确的结果。不过,您已经看到了,GROUP BY 语句解决了这个问题。
having 和 where 是一样的,只不过用的位置不同 where 不能用在聚合函数中,having可以
事务
ACID 原子性 持久性 隔离性 一致性
一个事务的过程
mysql 是默认开启事务自动提交的
set autocommit = 0;关闭
set autocommit=1; 开启(默认)
1.手动处理事务
set autocommit = 0
start transaction 标记一个事务开始的地方,从这个之后的sql都在一个事务中
insert xx
insert xx
commit (如果成功的话)
rollback (如果失败,回到原来的样子)
set autocommit = 1;开启自动提交
规范数据库设计
满足三大范式:
第一范式
1.原子性: 保证每一列都是不可再分的
第二范式
前提:满足第一范式
每张表只能描述一件事情
第三范式
前提:满足第一范式和第二范式
需要满足数据表中的每一列都和主键直接相关而不是间接相关
规范性和性能问题
阿里的规范:
关联查询的表不能超过三张
考虑商业化的需求和目标(成本,用户体验) 数据库的性能更加重要
在规范性能的问题时,需要适当的考虑下规范性
故意给每张表增加冗余字段(从多表查询变成单表查询0)
故意增加计算列(从大数据量变成小数据量 :索引)
JDBC
将数据库和idea联系起来
在maven 官网下载 jar包
点击file -> projectStruture->加好->jars and
Statement statement = connection.createStatement(); String sql = "insert into users (id,name,password,email,birthday) values (\"6\",\"li\",\"123456\",\"1045058412@qq.com\",\"1996-01-02\");"; int num = statement.executeUpdate(sql); if (num>0){ System.out.println("插入成功"); }
增删改 用的都是这样语句,只是sql的语句不一样
Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("select * from users"); while (resultSet.next()){ System.out.println("id=="+resultSet.getString("id")); }
以上是查询的
connection.commit(); connection.rollback();
操作数据库的
提交,回滚
idea 和数据库链接
idea中,右侧边栏的database