各数据类型及字节长度一览表
(1,'张琪',19,'男',9386,'2003-04-02'),
(2,'向山脊',20,'女',8181,'2006-08-09'),
(3,'李元一',39,'男',1586,'2008-03-12'),
(4,'赵元蝶',56,'女',2186,'2002-09-26'),
(5,'秦志涛',85,'男',8386,'2023-06-02'),
(6,'张成俊',10,'男',1386,'2006-09-02'),
(7,'张铭',5,'女',6386,'2002-05-02'),
(8,'曹爽',16,'女',9386,'2008-01-02'),
(10,'徐一凡',17,'男',9386,'2006-04-15'),
(11,'朱浪',42,'女',386,'2003-04-36'),
(12,'吴亦凡',32,'女',386,'2026-04-01'),
(13,'李易峰',22,'女',1386,'2066-02-22'),
(14,'王俊凯',19,'男',1386,'2022-01-12'),
(15,'周杰伦',19,'男',4386,'2033-03-26');show databases;(查询所有数据库)
create database 数据库名;(创建数据库)
use 数据库名(使用数据库)
drop database 数据库名(删除数据库)
select database(); (查看现在使用的什么数据库)建表语法
create table 表名(列 数据类型); (创建表)
show tables; (查看表)
desc 表名; (查看表结构)
alter table 原表名 rename to 新表名; (修改表的名字)
alter table 表名 add 列名 数据类型; (添加表的列)
alter table 表名 modify 需要修改的表类型列名 数据类型 (修改表 列的数据类型)
alter table 表名 change 列名 新列名 新类型; (修改列名的名字与类型)
alter table 表名 drop 列名; (删除列名)
drop table 表名; (删除表)表数据的增删改
insert into 表名(列名1,列名2) values (值1,值2); (单个添加数据)
insert into 表名 values (值1,值2); (给全部列表添加数据)
insert into 表名(列名1,列名2)values (值1,值2),(值1,值2); (批量添加数据)
insert into 表名 values(值1,值2),(值1,值2); (也是批量添加表数据)update 表名 set 列名1=值1,列名2=值2 where 条件判断; (修改表数据)
{如update 表名 set NianLing=18,name='张三' where id=1;
修改了 年龄等于18,姓名等于张三 条件就是1号用户(id)}
delete from 表名 where 条件判断 (删除表数据)查表语法
select * from 表名; (查询表的全部数据)
select 列名1,列名2 from 表名; (查询指定字段表数据)
select distinct 列名1,列名2 from 表名; (去除重复查询)
select 列名1 运算符+-*\ 列名2 from 表名; (查询指定列 可进行ifnull判断是否为空)
select 列名1 ifnull(列名,0)+10 from 表名; (ifnull判断是否为空)
select 列名1 ifnull(列名,0)+10 as 新列名 from 表名; (列名修改)条件查询
select 列名列表 from 表名 where 条件; (条件查询)
(select * from 表名 where 列名>20;) (查询 年龄大于20的)
(select * from 表名 where 列名>20 and 列名<30;) (查询年龄大于20小于30的)
(select * from 表名 where 列名=22 or 列名=32; ) ( 也可以使用in(22,32) (查询年龄22和32的)
(select * from 表名 where 列名 like '男';) (查询性别为男的)
(select * from 表名 where 列名 like '张%';) (查询名字为张的人 (%代表所有字符)(_表示单个字符))
表聚合查询
//将一列数据作为一个整体 进行纵向的计算 像什么求和-平均值-求最大值
//conunt列名 统计数量
//max 最大值 min 最小值 sum 求和 avg 平均值
select 函数名(列名) from 表名 where(条件);
select count(*) from zq; (查看表中记录的总条数)
select max(nn) from zq; (最大年龄)
select min(nn) from zq; (最小年龄)
select sum(nn) from zq; (计算总年龄)
select avg(nn) from zq; (计算平均年龄)排序查询
select 列名列表 from 表名 where(条件) order by 列名 排序方式,列名 排序方式..;
//asc 升序 desc 降序
select * from zqq order by nn; (年龄升序)
select * from zqq where name like '张_' order by nn; (张姓年龄升序)(记得加条件)
select * from zqq where name like '__' order by nn desc; (对年龄降序 条件是name=两个字符)
select * from zqq order by xb,nn desc; (按照性别相同排序,年龄降序)分组查询
select 列名列表 from 表名 where group by 分组列名
having [分组后条件过滤] (可选)
order by [排序方式] (可选)
select xb,sum(age) from zq group by xb; (查询男女性别的 年龄总和)
select xb,sum(age) from zq where age<40 group by xb; (查询男女性别 年龄小于40岁的总和)
select xb,sum(age) getage from zq where age<40 group by xb having getage < 100; (查询男女性别 年龄小于40岁的总和 再次查询年龄小于100总和的性别)
select xb,sum(age) getage from zq where age<40 group by xb having getage < 125 order by getage desc;
(此行是查询男女性别 年龄小于40岁的总和 再次查询年龄小于100总和的性别 以降序的方式输出)
!!!!!!重点!!!!!!!!
分组查询:不太适合男女查询,可用于商品 品牌之间的 品牌-总金额-库存等查询
db1;
分组查询练习
-- 创建数据表 与数据准备
id INT, -- 商品编号
NAME VARCHAR(20), -- 商品名称
price DOUBLE, -- 商品价格
brand VARCHAR(10), -- 商品品牌
stock INT, -- 商品库存
insert_time DATE -- 添加时间
(1,'华为手机',3999,'华为',23,'2088-03-10'),
(2,'小米手机',2999,'小米',30,'2088-05-15'),
(3,'苹果手机',5999,'苹果',18,'2088-08-20'),
(4,'华为电脑',6999,'华为',14,'2088-06-16'),
(5,'小米电脑',4999,'小米',26,'2088-07-08'),
(6,'苹果电脑',8999,'苹果',15,'2088-10-25'),
(7,'联想电脑',7999,'联想',NULL,'2088-11-11');
group by 分组列名
having [分组后条件过滤] (可选)
order by [排序方式] (可选)
题目1:按照品牌分组,获取每组商品的总金额
| brand | sum(price) |
+--------+------------+
| 华为 | 10998 |
| 小米 | 7998 |
| 联想 | 7999 |
| 苹果 | 14998 |
+--------+------------+
实现代码: select brand,sum(price) from pp group by brand;
题目2:对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额
+--------+------------+
| brand | sum(price) |
+--------+------------+
| 华为 | 6999 |
| 小米 | 4999 |
| 联想 | 7999 |
| 苹果 | 14998 |
+--------+------------+
实现代码:select brand,sum(price) from pp where price>4000 group by brand;
题目3:对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的
+--------+-------+
| brand | gg |
+--------+-------+
| 联想 | 7999 |
| 苹果 | 14998 |
+--------+-------+
实现代码: select brand,sum(price) gg from pp where price>4000 group by brand having gg > 7000;
题目4:对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的,并按照总金额的降序排列
+--------+-------+
| brand | gg |
+--------+-------+
| 苹果 | 14998 |
| 联想 | 7999 |
+--------+-------+
实现代码:select brand,sum(price) gg from pp where price>4000 group by brand having gg > 7000 order by gg desc;
分页查询
select 列名列表 from 表名
where 条件
group by 分组列名
having 分组的过滤条件
order by 排序列名 排序方式
limit 当前页数 每页显示的条数
当前页数有个公式:当前页数=(当前页数-1) * 每页显示的条数
select * from pingpai limit 0,3; (显示第一页数据)
(从0开始也就是从第一页开始显示3条数据)可以依次类推 (1,3) (2,3) (3,3)约束
约束是什么
//约束=限制(数据能不能重复) 保证数据的正确性,有效性,完整性
primary key [主键约束]
primary key auto_increment [主键自增]
uni1ue [唯一约束]
not null [非空约束]
foreign key [外键约束]
foreign key on update cascade [外键级联更新]
主键约束
//主键约束默认包含非空和唯一两个功能
//一张表只能有一个主键
//主键一般用于表中的唯一标识
//这样建表后id就是唯一的 不同的
create table 表名(
列名 数据类型 primary key,
);
//删除主键约束
alter table 表名 drop primary key;
//建表后单独添加主键约束
alter table 表名 mooify 列名 数据类型 primary key;
主键自增约束
create table 表名(
列名 数据类型 primary key auto_increment,
)
//写了自增约束后会自动输入id 1 2 3 依次类推
//删除主键自增约束
alter table 表名 modify 列名 数据类型;
alter table 表名 modify 列名 数据类型 auto_increment;
主键唯一约束
create table 表名(
列名 数据类型 unique,
)
//删除唯一约束
alter table 表名 drop index 列名;
//建表后单独添加唯一主键
alter table 表名 modify 列名 数据类型 unique;
主键非空约束
create table 表名(
列名 数据类型 not null,
)
//删除非空约束
alter table 表名 modify 列名 数据类型;
//建表后删除非空约束
alter table 表名 modify 列名 数据类型 not null;主键外键约束
create table 表名(
列名 数据类型 约束;
constraint 外键名 foreign kry(本表外键名) references 主表名 (主表主键列名)
)
//删除外键约束
alter table 表名 drop foreign key 外键名;
//建表后单独添加外键约束
alter table 表名 add
constrint 外键名 foreign key (本表外键列名) references 主表名 (主键列名)
主键外键联级约束
//由于不推荐使用 容易造成数据损失 了解就行
//添加级联更新
alter table 表名 add
constrint 外键名 foreign key (本表外键列名) references 主表名 (主键列名)
on update cascade on delete cascade; //添加级联更新 级联删除
mysql多表查询
//多表概念
//大致意思就是,多张数据表,而表与表之间是可以有一定关系的,这种关联关系通过外键约束实现
//分类: 一对一 一对多 多对多 一对一表
//适用场景:人与身份证,一个身份证只对应一个人
######创建一个身份证信息表
create table sfz(
-> id int primary key auto_increment, //设置主键id 主键自增
-> name varchar(20)
-> );
INSERT INTO fr VALUES (NULL,'秦之涛'),(NULL,'张琪')
create table card(
id int primary key auto_increment, //设置主键id 主键自增
number varchar(20) unique not null, //设置主键唯一约束 和非空约束
pid int unique,
constraint st_fk foreign key (pid) references sfz(id)
);
INSERT INTO caro VALUES (NULL,'3432',1),(NULL,'4422',2),(NULL,'4213',3)
//constraint 外键列名 foreign key(本表外键名) references 主表名 (连接主表列名)
//设置表连接 pid关联sfz的id 设置唯一约束,
//添加数据后就是实现外键链接
一对多表
//用户和订单:一个用户可以有多个订单,
//商品分类和商品,一个分类下可以有多个商品
uid int,
constraint 外键列名 freign key(本表外键列名) references 主表名(主表列名)
CREATE TABLE pp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO pp VALUES (NULL,'联想'),(NULL,'惠普'),(NULL,'外星人')
CREATE TABLE sp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
ssid INT,
CONSTRAINT sp_aa FOREIGN KEY(ssid) REFERENCES pp(id)
);
INSERT INTO sp VALUES (NULL,'拯救者',1),(NULL,'小新',1),(NULL,'惠普2号',2),(NULL,'惠普3号',2),(NULL,'外星人2号',3),(NULL,'外星人3号',3)多对多表
//学生和课程关系,一个学生可以选择多个课程,一个课程也可以被多个学生选择
//需要借助第三张表的中间表,中间表至少包含两个列,这两个列作为中间表的外键,分别关联两张表的主键
sid int //用于和student表中的id进行外键关联 (添加学生的外键约束)
cid int //用于和coures表中的id进行外键关联 (添加课程外键约束)
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO student VALUES(NULL,'张琪'),(NULL,'向同学'),(NULL,'赵同学'),(NULL,'曹爽')
CREATE TABLE ture(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO ture VALUES(NULL,'李老师'),(NULL,'法老师'),(NULL,'赵老师'),(NULL,'元老师')
CREATE TABLE zj(
id INT PRIMARY KEY AUTO_INCREMENT,
ppid INT,
ddid INT,
CONSTRAINT ssd_fk FOREIGN KEY(ppid) REFERENCES student(id),
CONSTRAINT sst_lk FOREIGN KEY(ddid) REFERENCES ture(id)
INSERT INTO zj VALUES (NULL,1,1),(NULL,1,2),(NULL,2,1),(NULL,2,2),(NULL,3,1),(NULL,3,2),(NULL,4,1),(NULL,4,2);多表查询
-- 创建db6数据库
CREATE DATABASE db6;
-- 使用db6数据库
USE db6;
-- 创建user表
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT, -- 用户id
NAME VARCHAR(20), -- 用户姓名
age INT -- 用户年龄
);
-- 添加数据
INSERT INTO USER VALUES (1,'张三',23);
INSERT INTO USER VALUES (2,'李四',24);
INSERT INTO USER VALUES (3,'王五',25);
INSERT INTO USER VALUES (4,'赵六',26);
-- 订单表
CREATE TABLE orderlist(
id INT PRIMARY KEY AUTO_INCREMENT, -- 订单id
number VARCHAR(30), -- 订单编号
uid INT, -- 外键字段
CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
);
-- 添加数据
INSERT INTO orderlist VALUES (1,'hm001',1);
INSERT INTO orderlist VALUES (2,'hm002',1);
INSERT INTO orderlist VALUES (3,'hm003',2);
INSERT INTO orderlist VALUES (4,'hm004',2);
INSERT INTO orderlist VALUES (5,'hm005',3);
INSERT INTO orderlist VALUES (6,'hm006',3);
INSERT INTO orderlist VALUES (7,'hm007',NULL);
-- 商品分类表
CREATE TABLE category(
id INT PRIMARY KEY AUTO_INCREMENT, -- 商品分类id
NAME VARCHAR(10) -- 商品分类名称
);
-- 添加数据
INSERT INTO category VALUES (1,'手机数码');
INSERT INTO category VALUES (2,'电脑办公');
INSERT INTO category VALUES (3,'烟酒茶糖');
INSERT INTO category VALUES (4,'鞋靴箱包');
-- 商品表
CREATE TABLE product(
id INT PRIMARY KEY AUTO_INCREMENT, -- 商品id
NAME VARCHAR(30), -- 商品名称
cid INT, -- 外键字段
CONSTRAINT cp_fk1 FOREIGN KEY (cid) REFERENCES category(id)
);
-- 添加数据
INSERT INTO product VALUES (1,'华为手机',1);
INSERT INTO product VALUES (2,'小米手机',1);
INSERT INTO product VALUES (3,'联想电脑',2);
INSERT INTO product VALUES (4,'苹果电脑',2);
INSERT INTO product VALUES (5,'中华香烟',3);
INSERT INTO product VALUES (6,'玉溪香烟',3);
INSERT INTO product VALUES (7,'计生用品',NULL);
-- 中间表
CREATE TABLE us_pro(
upid INT PRIMARY KEY AUTO_INCREMENT, -- 中间表id
uid INT, -- 外键字段。需要和用户表的主键产生关联
pid INT, -- 外键字段。需要和商品表的主键产生关联
CONSTRAINT up_fk1 FOREIGN KEY (uid) REFERENCES USER(id),
CONSTRAINT up_fk2 FOREIGN KEY (pid) REFERENCES product(id)
);
-- 添加数据
INSERT INTO us_pro VALUES (NULL,1,1);
INSERT INTO us_pro VALUES (NULL,1,2);
INSERT INTO us_pro VALUES (NULL,1,3);
INSERT INTO us_pro VALUES (NULL,1,4);
INSERT INTO us_pro VALUES (NULL,1,5);
INSERT INTO us_pro VALUES (NULL,1,6);
INSERT INTO us_pro VALUES (NULL,1,7);
INSERT INTO us_pro VALUES (NULL,2,1);
INSERT INTO us_pro VALUES (NULL,2,2);
INSERT INTO us_pro VALUES (NULL,2,3);
INSERT INTO us_pro VALUES (NULL,2,4);
INSERT INTO us_pro VALUES (NULL,2,5);
INSERT INTO us_pro VALUES (NULL,2,6);
INSERT INTO us_pro VALUES (NULL,2,7);
INSERT INTO us_pro VALUES (NULL,3,1);
INSERT INTO us_pro VALUES (NULL,3,2);
INSERT INTO us_pro VALUES (NULL,3,3);
INSERT INTO us_pro VALUES (NULL,3,4);
INSERT INTO us_pro VALUES (NULL,3,5);
INSERT INTO us_pro VALUES (NULL,3,6);
INSERT INTO us_pro VALUES (NULL,3,7);
INSERT INTO us_pro VALUES (NULL,4,1);
INSERT INTO us_pro VALUES (NULL,4,2);
INSERT INTO us_pro VALUES (NULL,4,3);
INSERT INTO us_pro VALUES (NULL,4,4);
INSERT INTO us_pro VALUES (NULL,4,5);
INSERT INTO us_pro VALUES (NULL,4,6);
INSERT INTO us_pro VALUES (NULL,4,7);内连接查询
//查询有交集的数据也就是有外键的数据
select 列名 from 表名 inner join 表名2 on 关联条件
select * from 表1 inner join 表2 on orderlist.uid=user.id (关联条件表2的uid=表1的id)
(查询到订单号,订单名称,订单归属于用户id,用户姓名,用户年龄)
select * from 表1 起别名 innsr join 表2 起别名 on o.uid=u.id (起别名方法)
//查询用户姓名 年龄 订单编号
select
u.name ----用户姓名
u.age -----用户年龄
o.number ------用户订单编号
from
user u
inner join
orderlist o
on
o.uid=u.id
//还有隐式内连接查询
select
u.name ----用户姓名
u.age -----用户年龄
o.number ------用户订单编号
form
user u,
orderlist o
where
o.uid=u.id外连接查询
查询全部数据,也可以查询没有交际的数据
记住一个就差不多了
select 列名 from 表名1 left outer join 表名2 on 条件; (左外连接)
select
u.*,
o.number
from
user u
left outer join
orderlist o
on
o.uid=u.id;
select 列名 from 表名1 right outer join 表名2 on 条件 (右外连接)
select
o.*,
u.name
from
user u
right outer join
orderlist o
on
o.uid=u.id;
子查询
查询语句中嵌套了查询语句,我们就将嵌套称为子查询
查询结果 单行单列
select 列名 from 表名 where 列名=(select 列名 from 表名) where 条件
select max(age) from user;
select name,age from user where age=(select max(age) from user);
查询结果 多行单列
select 列名 from 表名 where 列名 in (select 列名 from 表名 where 条件);
select * from orderlist where uid in (1,2);
select * from user where name name in ('张三','李四');
select * from orderlist where uid in (elect * from user where name name in ('张三','李四'));
多行多列
select 列名 from 表名 别名 (select 列名 from 表名 where 条件)别名 where 条件
select * from orderlist where id<4;
select
u.name,
o.number
from
user u,
(select * from orderlist where id<4) o
where
o.uid=u.id
自关联查询
在同一张表中数据有关联性,我们可以把这张表当成多个表查询
-- 创建员工表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
mgr INT,
salary DOUBLE
);
-- 添加数据
INSERT INTO employee VALUES
(1001,'孙悟空',1005,9000.00),
(1002,'猪八戒',1005,8000.00),
(1003,'沙和尚',1005,8500.00),
(1004,'小白龙',1005,7900.00),
(1005,'唐僧',NULL,15000.00),
(1006,'武松',1009,7600.00),
(1007,'李逵',1009,7400.00),
(1008,'林冲',1009,8100.00),
(1009,'宋江',NULL,16000.00);
-- 查询所有员工的姓名及其直接上级的姓名,没有上级的员工也需要查询
/*
分析:
员工姓名 employee表 直接上级姓名 employee表
条件:employee.mgr = employee.id
查询左表的全部数据,和左右两张表交集部分数据,使用左外连接
*/
SELECT
t1.name, -- 员工姓名
t1.mgr, -- 上级编号
t2.id, -- 员工编号
t2.name -- 员工姓名
FROM
employee t1 -- 员工表
LEFT OUTER JOIN
employee t2 -- 员工表
ON
t1.mgr = t2.id;多表练习
查询用户编号,姓名,年龄,订单编号。
查询所有用户,用户的编号,姓名。年龄,订单编号
查询所有的订单,用户的编号,姓名,年龄。订单编号
查询用户年龄大于23岁的信息,显示用户的编号,姓名,年龄,订单编号
查询张三和李四的用户信息,显示用户的编号,姓名年龄,订单编号
查询商品分类的编号,分类名称,分类下的商品名称
查询所有的商品分类,商品分类的编号,分类名称,分类下的商品名称
查询所有的商品信息,商品分类的编号,分类名称,分类下的商品名称
查询所有用户和所有商品的商品,显示用户的编号和姓名,年龄,商品名称
查询张三和李四这两个用户可以看到的商品。显示用户的编号,年龄,姓名,商品名称modify(修改列类型) change(修改列名与类型)
update表名set (修改表数据) delete (删除表数据)
distinct (去重复查询) and(及) or (含有) like (如)
count(总条数) ava(平均)
order by (默认升序 desc(降序))
group by (分组查询) having (分组后的条件查询)
limit (分页查询)
primary key(主键约束)auto_increment (主键自增)unliue(唯一约束)
constraint (取名字) foreign key (外键约束) references (连接主表)
内连查询 inner join
内连查询隐式 where
左外连接 left outer join 右连接 right outer join