关于mysql数据库的一些使用心得

创建一个博客应用 定义了五个表 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.


















猜你喜欢

转载自blog.csdn.net/weixin_38736140/article/details/79531926