创建一个博客应用 定义了五个表 users,blogs, comments,tags,blog_tag
Blog应用
create database if not exists blogdb
default character set = utf8;
用户表users:
*ID user_id int primary key auto_increment
*用户名 user_name varchar(50) not null unique
*密码 user_password varchar(50) not null
手机 user_phone
邮箱 user_mail
*头像 user_avatar varchar(256) default null
性别 user_gender
年龄 user_age
昵称 user_nick
活跃用户 user_activate
*城市 user_city varchar(50) not null
*创建时间 user_createdat datetime default current_timestamp
*修改时间 user_updatedat datetime default current_timestamp on update current_timestamp
create table if not exists users(
user_id int auto_increment,
user_name varchar(50) not null,
user_password varchar(50) not null,
user_avatar varchar(256) default null,
user_city varchar(50) not null,
user_createdat datetime default current_timestamp,
user_updatedat datetime default current_timestamp on update current_timestamp,
primary key(user_id),
unique(user_name)
)default charset = utf8
博客表blogs:
ID blog_id int primar key auto_increment
题目 blog_title varchar(64) not null
内容 blog_content varchar(2048) not null
作者信息 blog_user_id int foreign key
创建时间 blog_createdat
修改时间 blog_updatedat
create table if not exists blogs(
blog_id int auto_increment,
blog_title varchar(64) not null,
blog_content varchar(2048) not null,
blog_user_id int,
blog_createdat datetime default current_timestamp,
blog_updatedat datetime default current_timestamp on update current_timestamp,
primary key(blog_id),
foreign key(blog_user_id) references users(user_id)
)default charset = utf8
评论表comments
ID comment_id int primary key auto_increment
评论内容 comment_content varchar(128) not null
博客ID comment_blog_id int foreign key
用户ID comment_user_id int foreign key
创建时间 comment_createdat
修改时间 comment_updatedat
create table if not exists comments(
comment_id int auto_increment,
comment_content varchar(128) not null,
comment_blog_id int,
comment_user_id int,
comment_createdat datetime default current_timestamp,
comment_updatedat datetime default current_timestamp on update current_timestamp,
primary key(comment_id),
foreign key(comment_user_id) references users(user_id),
foreign key(comment_blog_id) references blogs(blog_id)
)default charset = utf8
标签表tags
ID tag_id int primary key auto_increment
标签内容 tag_content varchar(50) not null
create table if not exists tags(
tag_id int auto_increment,
tag_content varchar(50) not null,
primary key(tag_id)
)default charset = utf8
博客标签关联表 blogs_tag
ID rel_id int primary key auto_increment
博客ID rel_blog_id int foreign key
标签ID rel_tag_id int foreign key
create table if not exists blog_tag(
rel_id int auto_increment,
rel_blog_id int,
rel_tag_id int,
primary key(rel_id),
foreign key(rel_tag_id) references tags(tag_id),
foreign key(rel_blog_id) references blogs(blog_id)
)default charset = utf8
1.向users表中插入数据
要求: 一次就插入一条数据
用户要来自于不同的城市(三个城市)
例如:beijing,shanghai,guangzhou
insert into users(user_name,user_password,user_city)
values("大旭旭","123","beijing")
2.从users中删除一条数据
略.
3.从users中更新一条数据
略.
4. 从users中查询所有用户的user_name,user_city,user_createdat
select user_name,user_city,user_createdat
from users
5.显示所有beijing和shanghai的用户(user_name,user_city,)
select user_name,user_city
from users
where user_city = "beijing" or user_city = "shanghai"
select user_name,user_city
from users
where user_city in("beijing","shanghai")
6.显示所有注册时间是2018-03-09 14:58:00至
2018-03-09 15:00:00的用户(user_name,user_city,user_createdat)
select user_name,user_city,user_createdat
from users
where user_createdat > "2018-03-09 14:58:00"
and user_createdat < "2018-03-09 15:00:00"
select user_name,user_city,user_createdat
from users
where user_createdat between "2018-03-09 14:58:00"
and "2018-03-09 15:00:00"
7. users中最晚注册时间(user_creadtat)
select max(user_createdat)
from users
8. users中每个城市最晚注册时间(user_city,user_createdat)
select user_city,max(user_createdat) late
from users
group by user_city
# 如果不加group by,则只会显示一行(最晚注册的用户及其所在城市)
9.users中最晚注册的用户(user_name,user_createdat)
select user_name ! ,user_createdat !
from users
where user_createdat = (select max(user_createdat)
from users)
在列名后加入字符串可以当做列名的别名,但是不可以是数字
10.users中每个城市最晚注册的用户(user_name,user_city,user_createdat)
MySQL多表联查
内连接 inner join在MySQL中用join也可代表inner join
外连接 左外联接left [outer] join
右外联接right [outer] join
create table t1(
customer_id varchar(10),
city varchar(10) not null,
primary key(customer_id)
)default charset = utf8
create table t2(
order_id int auto_increment,
cid varchar(10),
primary key(order_id)
)default charset = utf8
insert into t1 values('tedu','hz'),('jd','bj'),('tx','bj'),('bd','sh')
insert into t2(cid) values('tedu'),('jd'),('jd'),('tx'),(NULL)
t1和t2做无条件内连接,得到一个t1和t2所有可能的数据记录的组合
形成的表.大表又称为t1和t2的笛卡尔积
select * from t1 join t2
t1和t2表做有条件内连接,从t1和t2的笛卡尔积中
筛选出符合条件的那些数据记录组成一个数据表
select * from t1 join t2 on t1.customer_id = t2.cid
只有在经过有条件内连接后获得的数据表上,才能做
左外联接或右外连接.
左外联接或右外连接就是在有条件内连接表基础上,必须
将主表记录玩整显示的数据表
select * from t1 left join t2 on t1.customer_id = t2.cid
select * from t1 right join t2 on t1.customer_id = t2.cid
10.users中每个城市最晚注册的用户
(user_name,user_city,user_createdat)
select user_name,user_city,user_createdat,
t1.uc,t1.late
from users
join (select user_city uc,
max(user_createdat)late
from users
group by user_city)t1
on users.user_city = t1.uc and
users.user_createdat = t1.late
使用联结构成的表时需要给之命名,仅做展示的话不需命名
要求:
1 不是所有的用户都写博客
2 一个用户可以写多篇博客
3 不是所有的博客都有标签
4 一个博客可以有多个标签
5 不是所有博客都有评论
6 一个博客可以有多个评论
11.查询所有博客的作者信息
(blog_id,blog_title,user_name)
select blog_id,blog_title,user_name
from blogs
join users
on blog_user_id = user_id
select group_concat(blog_title),user_name
from blogs
join users
on blog_user_id = user_id
group by user_name
12.查询所有用户及其所写的blog
(user_id,user_name,blog_title)
select user_id,user_name,blog_title
from users
left join blogs
on user_id = blog_user_id
13.查询所有blog的标签信息
(blog_id,blog_title,tag_content)
step 1 从blogs_tag查出有标签的blog信息
select rel_blog_id,rel_tag_id
from blogs_tag
step 2 从tags表和step1查询得到的派生表查询具体
tag的内容
select tag_content,rel_blog_id
from tags
join (select rel_blog_id,rel_tag_id
from blogs_tag)t1
on tag_id = rel_tag_id
可选 step 2.5 让blog的标签内容在一行显示
select group_concat(tag_content),rel_blog_id
from tags
join (select rel_blog_id,rel_tag_id
from blogs_tag)t1
on tag_id = rel_tag_id
group by rel_blog_id
step3 从blogs表和step2 / step2.5查询得到的派生表
联合查询得到blog的标题
select blog_id,blog_title,tc
from blogs
left join (select group_concat(tag_content)tc,rel_blog_id
from tags
join (select rel_blog_id,rel_tag_id
from blogs_tag)t1
on tag_id = rel_tag_id
group by rel_blog_id)t2
on blog_id = rel_blog_id
14.查询所有blog的标签信息及其作者信息
select blog_id,blog_title,tc,user_name
from users
join (select blog_id,blog_title,tc
from blogs
left join (select group_concat(tag_content)tc,rel_blog_id
from tags
join (select rel_blog_id,rel_tag_id
from blogs_tag)t1
on tag_id = rel_tag_id
group by rel_blog_id)t2
on blog_id = rel_blog_id)t3
on user_id=blog_user_id
15.查询所有blog的标签信息及其作者信息和评论数量
step1.