您的位置:首页 > 数据库 > MySQL

MySql基础4

2016-12-28 23:56 405 查看
CREATE TABLE cms_type(
id SMALLINT UNSIGNED KEY AUTO_INCREMENT,
tname VARCHAR(30) NOT NULL UNIQUE
);

--给cms_type表 添加数据
INSERT cms_type(tname)
VALUE
('国内'),
('国际'),
('体育'),
('娱乐');

-- cms_article 新闻表表结构
CREATE TABLE cms_article(
id SMALLINT UNSIGNED KEY AUTO_INCREMENT,
title VARCHAR(80) NOT NULL,
contents TEXT NOT NULL,
tid  SMALLINT UNSIGNED NOT NULL,
aid  SMALLINT UNSIGNED NOT NULL,
addtime TIMESTAMP NOT NULL DEFAULT current_timestamp
);
-- 新闻分类  1.国内 2 国际  3 体育 4 娱乐
--给cms_article表 添加数据
INSERT cms_article(title,contents,tid,aid)
VALUE
('首相“恩怨”:卡梅伦和特雷莎曾就“脱欧”不合','首相“恩怨”:卡梅伦和特雷莎曾就“脱欧”不合',2,1),
('华裔女子枪战悍匪获网友点赞 在美华裔安全引担忧','华裔女子枪战悍匪获网友点赞 在美华裔安全引担忧',2,1),
('习近平:努力建设一支强大的现代化火箭军','习近平:努力建设一支强大的现代化火箭军',1,1),
('人民日报评论:失去奋斗,房产再多我们也将无家可归','人民日报评论:失去奋斗,房产再多我们也将无家可归',1,1),
('奥运会女排','奥运会女排金牌',3,2),
('篮球','篮球',3,2),
('小沈阳','小沈阳',4,2),
('快乐大本营','快乐大本营',4,2);

-- 多表联合查询  cms_admin   cms_type  cms_article
-- 字段 :新闻编号  新闻标题  分类名称  管理员名称  新闻发布时间
SELECT ar.id,ar.title,t.tname,
ad.aname,ar.addtime FROM cms_article AS ar
INNER JOIN cms_admin AS ad
ON ar.aid = ad.id
INNER JOIN cms_type AS t
ON ar.tid = t.id;
-------------------------------------------------------------------------------
-- 用 左外链接联合查询 LEFT JOIN
-- 左表 : cms_prov  右表:cms_user
--以左表为主,把cms_prov全部罗列出来
-- 字段  :  name  pname
SELECT u.name,p.pname
FROM cms_prov AS p
LEFT JOIN cms_user AS u
ON u.address = p.id;

-- 用 右外链接联合查询 RIGHT JOIN
-- 左表 : cms_user 右表:cms_prov
--以左表为主,把cms_prov全部罗列出来
-- 字段  :  name  pname
SELECT u.name,p.pname
FROM cms_user AS u
RIGHT JOIN cms_prov AS p
ON u.address = p.id;
-------------------------------------------------------------------------------
--子查询使用
--    (1)WHERE
--        a.IN
-- 查询 地址名称是 广州的记录
-- 1. cms_prov   广州名称对应的编号
SELECT id FROM cms_prov
WHERE pname = '广州';
-- 2.cms_user 地址名称是 广州的记录
SELECT * FROM cms_user
WHERE address IN(SELECT id FROM cms_prov
WHERE pname = '广州');
-- 查询 地址名称是 上海,广州的记录
SELECT * FROM cms_user
WHERE address IN(SELECT id FROM cms_prov
WHERE pname='上海' OR pname='广州');
-- (1)WHERE
--  b.比较运算符

-- 查询 age 中大于平均年龄的 记录
-- 1.查询平均年龄
SELECT AVG(age) FROM cms_user;
-- 2.查询 age 中大于平均年龄的 记录
SELECT * FROM cms_user
WHERE age>(SELECT AVG(age) FROM cms_user);

-- 查询 age 中大于(18,19)的 记录,>all大于最大值,大于19
SELECT * FROM cms_user
WHERE age>ALL(SELECT age FROM cms_user
WHERE age IN(18,19));

-- =SOME/ANY 等同于 IN
-- 查询 age 中等于(18,19)的 记录
SELECT * FROM cms_user
WHERE age=SOME(SELECT age FROM cms_user
WHERE age IN(18,19));

-- FROM:FROM 后除了跟表还可以跟子查询产生的新表
SELECT * FROM (SELECT name,age
FROM cms_user) AS new;
-------------------------------------------------------------------------------
-- 表约束
--  设置两个字段同时为主键
--  aa  bb

--CREATE TABLE test(
--  aa INT PRIMARY KEY,
--  bb INT PRIMARY KEY
-- );  错误的 产生两个主键

--  设置两个字段同时为主键
CREATE TABLE test(
aa INT,
bb INT,
PRIMARY KEY(aa,bb)--aa,bb是不能加引号的
);
--  再加  (1,1) 主键重复 :主键中两个值同时相同才叫重复
--两个主键一对相同才叫重复
INSERT test(aa,bb)
VALUE
(1,1),
(1,2),
(2,1);
-------------------------------------------------------------------------------
-- 创建 父表 person
-- id pname
CREATE TABLE person(
id SMALLINT UNSIGNED KEY AUTO_INCREMENT,
pname VARCHAR(30) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;--两个表都要写这句话
INSERT person(pname)
VALUE
('a'),
('b'),
('c'),
('d');
-- 创建 子表 (外键表)son
-- id  sname pid
CREATE TABLE son(
id SMALLINT UNSIGNED KEY AUTO_INCREMENT,
sname VARCHAR(30) NOT NULL,
pid SMALLINT UNSIGNED NOT NULL,
FOREIGN KEY(pid) REFERENCES person(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;--两个表都要写这句话
--  先有参考表记录,后有外键表(子表)记录
-- 外键列只能添加  person 中编号  1 2 3 4
-- 能不能 添加  ('tina',6);
INSERT son(sname,pid)
VALUE
('tom',1),
('rose',2),
('alice',4);
INSERT son(sname,pid)
VALUE
('toam',6);

-- 先删外键表(子表)记录,后删参考表(父表)记录
-- 父表不能删除 子表中使用的值记录
DELETE FROM person WHERE id=1;
-------------------------------------------------------------------------------
-- 逻辑外键 原理:父表和子表是一个表
-- 创建无限极菜单分类表 category
-- 字段  id(父表id) name菜单名称    pid(外键列)
-- 当前菜单的 id 是下一级菜单的 pid
-- 当前菜单的pid  上一级菜单的id
CREATE TABLE category(
id SMALLINT UNSIGNED KEY AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
pid SMALLINT UNSIGNED NOT NULL
);`
INSERT category(name,pid)
VALUE
1('家用电器',0),
2('手机,数码',0),
3('电脑,办公',0),
4('电视',1),
5('空调',1),
6('洗衣机',1),
7('厨卫大电',1),
8('合资品牌',4),
9('国产品牌',4),
10('壁挂式空调',5),
11('柜式空调',5),
12('滚筒洗衣机',6),
13('洗烘一体衣机',6),
('TCL',9),
('乐视',9);

-- 查询  当前菜单名称 ,父级菜单信息的所有记录

SELECT s.name,p.name
FROM category AS s
INNER JOIN (SELECT * FROM category) AS p
ON s.pid=p.id;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql