表
一行:一条记录
一列:一个字段
编号 | 姓名 | 年龄 |
---|---|---|
01 | 张三 | 20 |
02 | 李四 | 22 |
03 | 王五 | 21 |
一张表相当于java的一个类
public class Student{
一个字段相当于一个属性String 编号;String 姓名;int 年龄:
}一条记录相当于创建一个对象
Person p=new Person("01","张三",20)
先来个总结
1.DDL:操作数据库中的对象,数据库,表,列
2,DML:操作数据库表中数据,对数据进行增删改
3.DQL:操作数据库表中数据,对数据进行查询
两个约束
1.主键约束.PRIMARY KEY,确保是唯一的,且不能为空
2.自动增长约束:auto_increment,被这个约束的列,值可以不用管,每次自动+1,这个可以用在编号的字段(列)中
删除表内所有数据
delete from 表名,删除表中所有的数据,自动增长约束不会重置,如果删之前是2,删除后再添加就从3开始
truncate table 表名,删除表中所有的数据,自动增长约束自动重置,原理先删除这个表,再重建表
乱码问题
dos命令是gbk的编码…set names gbk
1.DDL数据库
主要用这个 增:创建数据库
CREATE DATABASE 数据库名;
CREATE DATABASE 数据库名 charset 编码;
//如果不加编码,默认就是安装时设置的编码
删:删除数据库
DROP DATABASE 数据库名;
改:切换正在使用的数据库
USE 数据库名;
查:
查询正在使用的数据库
SELECT DATABASE();
查询所有的数据库
SHOW DATABASES;
查询某一个数据的详细信息
SHOW CREATE DATABASE nihao;
2.DDL数据库表
增:创建一个数据库表
CREATE TABLE Student(
#创建一个学生数据库表
#标准格式:字段 类型 约束,()用逗号分隔
sid INT PRIMARY KEY,
sname VARCHAR(10),
sage INT
)
删:删除一个数据表
DROP TABLE 数据库表名;
改:修改表的名字
RENAME TABLE 老的 TO 新的;
查:
查看一个表
DESC 数据库表名;
查看一个数据库下所有的表
SHOW TABLES;
3.DDL操作表中的列
增:增加一个列
alter table 数据库表名 add 列名 类型(长度) [约束];
删:删除一个列
alter table 数据库表名 drop 列名
查:查看表的数据
DESC 数据库表名;
改:可以修改列名,类型,约束
修改列名
alter table 数据库表名 change 老的列名 新的列名 类型(长度) [约束];
修改类型,约束
alter table 数据库表名 modify 列名 新的类型(长度) [新的约束];
DML数据库操作语言,操作表里面的数据
增:增加一条记录
如果要增加的数据所有字段都有,那么(列名1,列名2…)可以省略
insert into 表名 (列名1,列名2…) values (‘值1’,‘值2’…);
删:删除一条记录
删除所有记录:delete from 表名;
删除其中一条记录:delete from 表名 where sid=3;(删除了sid=3的那条记录)
where后面跟上字段名(列名),例子where=sid…where=name…where=age…
改:修改表中的记录
修改整个字段(列)的值:update 表名 set 字段名 = 值;
↓↓↓修改一条记录中的多个字段(列)↓↓↓↓
修改其中一个字段(列)的值:update 表名 set 字段名(列名),字段名(列名) = 值 where sid=3(把sid=3那条记录的字段名(列名)的值改掉);
DQL查询数据库中的数据
基本格式
select * from 表名;查询表中所有的数据
select 列名1,列名2 from 表名;查询表中所有的数据
select distinct 列名1 from 表名;查询表中所有的数据
distinct=去重
带有条件的查询
小练习
#创建一个数据库
CREATE DATABASE product;
#创建一个表
CREATE TABLE shangpin(sid INT AUTO_INCREMENT PRIMARY KEY ,sname VARCHAR(20),sprice INT,fenlei VARCHAR(100));
#网表中添加数据
INSERT INTO shangpin (sname,sprice,fenlei) VALUES ('小米电视机','999','电视');
INSERT INTO shangpin(sname,sprice,fenlei) VALUES ('小米冰箱','999','冰箱');
INSERT INTO shangpin(sname,sprice,fenlei) VALUES('小米手机','1299','手机');
INSERT INTO shangpin (sname,sprice,fenlei) VALUES('美的空调','2299','空调');
INSERT INTO shangpin(sname,sprice,fenlei) VALUES('小米手机','1299','手机');
INSERT INTO shangpin(sname,sprice,fenlei) VALUES ('小米冰箱','1999','冰箱');
INSERT INTO shangpin(sname,sprice) VALUES ('格力冰箱','1999');
#修改sid编号是6的价格,修改为1599
UPDATE shangpin SET sprice=1599 WHERE sid=6;
#查询表中所有商品
SELECT *FROM shangpin;
----
#查询表名称和价格的两列
SELECT sname,sprice FROM shangpin;
#去掉重复的值
SELECT DISTINCT sname,sprice FROM shangpin; #所有商品价格-100
SELECT sprice-100 FROM shangpin;
#上面的操作字段(列)的名称被自动改成了sprice-100,怎么改过来?
SELECT sprice-100 AS 促销价 FROM shangpin;
SELECT sprice-100 促销价 FROM shangpin;#AS不加也可以
但是这个操作并不影响原始的字段(列)的名称
#查询名称为小米手机的信息
SELECT *FROM shangpin WHERE sname='小米手机';
#查询价格等于1999的商品信息
SELECT * FROM shangpin WHERE sprice='1999';
#查询价格不等于1999的商品信息
SELECT *FROM shangpin WHERE sprice<>'1999';
#查询价格大于2000的商品信息
SELECT * FROM shangpin WHERE sprice >'2000';
#查询价格大于1000,小于2000的商品信息
SELECT * FROM shangpin WHERE sprice BETWEEN '1000' AND '2000';
SELECT * FROM shangpin WHERE sprice >= 200 AND sprice <=1000;
#查询价格999或者1999的商品信息
SELECT *FROM shangpin WHERE sprice=999 OR sprice=1999;
SELECT * FROM shangpin WHERE sprice IN (999,1999);
#查询名称中带有"电"的商品信息
SELECT *FROM shangpin WHERE sname LIKE '%电%';
#查询名称中以"美"开头的商品信息
SELECT *FROM shangpin WHERE sname LIKE '美%';
#查询名称中第3个字为"冰"的商品信息(前面加2个_)
SELECT *FROM shangpin WHERE sname LIKE '__冰%';
#查询没有分类的商品信息
SELECT *FROM shangpin WHERE fenlei IS NULL;
#查询有分类的商品信息
SELECT *FROM shangpin WHERE fenlei IS NOT NULL;
#查询所有价格大于1000的冰箱或者价格小于1000的电视机
SELECT *FROM shangpin WHERE sprice>'1000' AND fenlei='冰箱' OR sprice <'1000' AND fenlei ='电视' ;
排序查询
SELECT 字段(列)名1,字段(列)名2… FROM 表名 ORDER BY 字段(列)名 ASC(升序)或DESC(降序);
默认是ASC升序
#查询表中所有商品,以价格进行降序,并以sid进行降序
如果同时有2个排序,前面不一样就只比较前面大小,如果前面一样,才会比较后面大小.
SELECT sid,sname,sprice FROM shangpin ORDER BY sprice DESC, sid DESC;
#先去重,再降序
SELECT DISTINCT sprice FROM shangpin ORDER BY sprice DESC;
聚合查询(where后面不能加聚合函数,可以用having)
求一列的个数:SELECT COUNT(*) FROM 表名;
注意,空值(null)不加
求某一字段(列)的总数:SELECT COUNT(字段(列)名) FROM 表名;
求最大值:SELECT MAX(列名) FROM 表名;
求最小值:SELECT MIN(列名) FROM 表名;
求平均值:SELECT AVG(列名) FROM 表名;
求和:SELECT SUM(列名) FROM 表名;
也可以放在一起写:
SELECT SUM(列名), MAX(列名), MIN(列名), AVG(列名) FROM 表名;
分组查询
#查询fenlei列分组后的价格总和
#顺序:1.先group by(null也算一类) 2.分别求每一个组的和
SELECT SUM(sprice) FROM shangpin GROUP BY fenlei;
分组查询小练习(分组查询不用where,用having)
#统计所有商品的个数
SELECT COUNT(*) FROM shangpin;
#统计各分类商品的个数
SELECT COUNT(*) FROM shangpin GROUP BY fenlei;
#统计各分类商品的个数,只显示大于1的,这里不用where,分组查询用having
SELECT COUNT(*) FROM shangpin GROUP BY fenlei HAVING COUNT(*)>1;
#上面这个改的好看一点
SELECT COUNT(*)个数 FROM shangpin GROUP BY fenlei HAVING 个数>1;
分页查询
SELECT * FROM 表名 LIMIT 起始下标,要找的个数;
查询公式:假设每一页要查询n条记录
第X页=limit (X-1) * n,n