数据库相关操作
--登录
PATH=$PATH:/usr/local/mysql/bin
mysql -u帐号 -p密码
mysql -uroot -p123456
--远程登录
MySQL 连接本地数据库,用户名为“root”,密码“123”(注意:“-p”和“123” 之间不能有空格)
C:\>mysql -h localhost -u root -p123
MySQL 连接远程数据库(192.168.0.201),端口“3306”,用户名为“root”,密码“123”
C:\>mysql -h 192.168.0.201 -P 3306 -u root -p123
--创建数据库
create database 数据库名字
create database hb character set utf8;
--删除数据库
drop database 数据库名字;
drop database hb;
--修改数字库编码
alteer database 数据库名字 character set 编码
alter database hb character set gbk;
--查看数据库
show databases; 查看所有数据库列表
show create database 数据库名字; 查看数据库结构
show create database hb;
表结构的操作
--创建表
create table 表名(
列1,类型1,约束1,
列2,类型2,约束2,
列3,类型3,约束3
);
约束:
主键约束:primary key
维一约束:unique
非空约束:not null
外键约束:foreign key
自动增长:auto_increment
外键约束:
alter table product add foreign key(cno) references category(cid);
选择hb数据库: use hb;
create table stu(
sid int primary key auto_increment,
sname varchar(20),
sage int
);
create table category(
cid int primary key auto_increment,
time timestamp,
cname varchar(20)
);
create table product(
pid int primary key auto_increment,
name varchar(20),
price double ,
time timestamp,
pdesc varchar(100),
cno int,
foreign key(cno) references category(cid)
);
--删除表
drop table 表名;
drop table stu;
--修改表(add ,modify,change)
新增列
alter table 表名 add 列的名字 列的类型 列的约束
alter table stu add sex varchar(2);
修改列
alter table 表名 modify 列名 列的类型 列的约束;
alter table stu modify sex int;
修改列名
alter table 表名 change 旧列名 新列名 列的类型 列的约束;
alter table stu change sex ssex varchar(2);
删除列
alter table 表名 drop 列名
修改表的编码
alter table 表名 character set 编码
修改表名
rename table 旧表名 to 新表名
--查看表
查看所有表
show tables;
查看表创建语句
show create table 表名;
show create table stu;
查看结构
desc 表名
desc stu;
表的CRUD
--插入数据
insert into 表名(列1,列2) values(列1值,列2值);
insert into category(cname) values('手机');
insert into category(cname) values('箱包');
insert into category(cname) values('烟酒');
insert into category(cname) values('饼干');
insert into product values(null,'小米mix',1999,null,1);
insert into product values(null,'小米平板',1599,null,1);
insert into product values(null,'爱马仕皮箱',112,null,2);
insert into product values(null,'利群',15,null,3);
insert into product values(null,'中华',50,null,3);
insert into product values(null,'呵呵饼干',12,null,4);
--修改数据
update 表名 set 列名=值,列名=值;
--删除数据
delete from 表名 [where 条件]
truncate table 表名;先删除表,再重建表
--查询
能用格式
select [distinct] [*] [例1,例2] from 表名 where 条件 group by ..having 条件过滤 order by 排序
查询所有列
select * from product;
只查询price
select price from product;
//给price起个别名
select price as 商品价格 from product ;
//给product表起个别名
select p.price as 商品价格 from product as p;
聚合函数
求和:sum
select sum(price) from product;
求平均值:avg()
select avg(price) from product;
统计数量:count()
select count(*) from product;
求最大值:max()
求最小值:min();
当前使用的数据库: select database();
排序 order by
降序:desc
升序:asc
select * from product order by price desc;
select * from product order by price asc;
建表原则
1.一对一(班级和班长,国家和国旗)
方案一:合并成一张表,
方案二:转成一对多
2.一对多(商品和分类)
在多的一方添加一个外键,指向一的一方的主键
3.多对多 (老师和学生,学生和课程)
创建中间表,将多对多的关系拆成一对多的关系,中间表至少要有两个外键,分别指向原来的那两张表
网上商场实例
表一:用户表(用户id,用户名,密码。手机号)
表二:分类表(分类id,分类名称)
表三:商品表(商品id,商品名称,商品描述,商品价格,商品库存,外键分类id)
表四:订单表(订单编号,外键用户id,总价,地址)
表五:订单项(中间表)(订单编号,商品id,订单项总价,商品数量)
--用户表
create table user(
uid int primary key auto_increment,
username varchar(10) ,
password varchar(10) ,
phone varchar(20) ,
create_time timestamp
);
insert into user values(null,'huangbao','123456','13076948788',null);
--分类表
create table category(
cid int primary key auto_increment,
cname varchar(20),
create_time timestamp
);
insert into category values(null,'手机数码',null);
insert into category values(null,'鞋靴箱包',null);
insert into category values(null,'香烟酒水',null);
insert into category values(null,'酸奶饼干',null);
insert into category values(null,'馋嘴零食',null);
--商品表(商品id,商品名称,商品描述,商品价格,商品库存,外键分类id)
create table product(
pid int primary key auto_increment,
pname varchar(10),
pdesc varchar(30),
price double ,
create_time timestamp,
cno int ,
foreign key(cno) references category(cid)
);
insert into product values(null,'小米mix4',null,998,null,1);
insert into product values(null,'锤子',null,2888,null,1);
insert into product values(null,'阿迪王',null,99,null,2);
insert into product values(null,'老村长',null,88,null,3);
insert into product values(null,'劲酒',null,35,null,3);
insert into product values(null,'小熊饼干',null,1,null,4);
insert into product values(null,'卫龙辣条',null,1,null,5);
insert into product values(null,'旺旺大饼',null,1,null,5);
INSERT INTO product VALUES(NULL,'耐克帝',null,10,null,null);
--表四:订单表(订单编号,外键用户id,总价,地址)
create table orders(
oid int primary key auto_increment,
sum double,
address varchar(100),
uno int ,
create_time timestamp,
foreign key(uno) references user(uid)
);
insert into orders values(null,200,'广东省深圳市',1,null);
insert into orders values(null,250,'江西省南昌市',1,null);
--表五:订单项(中间表)(订单编号,商品id,订单项总价,商品数量)
create table orderitem(
ono int ,
pno int ,
subsum double,
ocount int,
foreign key(pno) references product(pid),
foreign key(ono) references orders(oid)
);
--给1号订单添加商品 200块钱的商品
insert into orderitem values(1,7,100,100);
insert into orderitem values(1,8,101,100);
--给2号订单添加商品 250块钱的商品 ()
insert into orderitem values(2,5,35,1);
insert into orderitem values(2,3,99,3);
查询专题
--交叉连接查询 笛卡尔积
笛卡尔积 ,查出来是两张表的乘积 ,查出来的结果没有意义
select * from product,category;
过滤才有意义
select * from product,category where cno=cid;
--内联接查询
隐式内连接
select * from product p ,category c where p.cno =c.cid;
显示内联接
select * from product p inner join category c on p.cno =c.cid;
隐式内连接:在查询出结果后where
显示内联接:准备好条件再去查询。效率要高。
--左外连接
会将左表的数据全部查出来。如果右表没有数据会用null代替
select * from product p left outer join category c on p.cno=c.cid;
--右外连接
会将右表的数据全部查出来。如果左表没有数据不会显示
select * from product p right outer join category c on p.cno=c.cid;
-- 查询分类名称为手机数码的所有商品
子查询
select * from product where cno =(select cid from category where cname='手机数码');
-- 查询出(商品名称,商品分类名称)信息
//左连接
select p.pname,c.cname from product p left outer join category c on p.cno =c.cid;
//子查询
select p.pname,(select c.cname from category c where p.cno=c.cid) as 商品分类 from product p;