2. 电影数据(SQL28~SQL38)

SQL28 查找描述信息中包括robot的电影对应的分类名称以及电影数目
查找描述信息(film.description)中包含robot的电影对应的分类名称(category.name)以及电影数目(count(film.film_id)),而且还需要该分类包含电影总数量(count(film_category.category_id))>=5部
思路: 这是一个按 category 分组统计的问题
"描述信息中包含robot" → 用LIKE操作符进行字符串模糊匹配
"该分类包含电影总数量>=5部" → 关联子查询 + COUNT
注意: 看到 "该分类包含电影总数量>=5部" 第一反应是用 HAVING,但注意之前已经筛选出了 "包含robot" 的记录,所以在此基础上要筛选 "该类型电影总数目(而非包含robot的电影数目)" 就只有另外用一个关联子查询 + COUNT 来获取

SELECT
    c.name,
    COUNT(f.film_id)
FROM film f
JOIN film_category fc USING(film_id)
JOIN category c USING(category_id)
WHERE f.description LIKE '%robot%'
    AND (
        SELECT COUNT(film_id) >= 5
        FROM film_category 
        WHERE category_id = fc.category_id
    ) 
    -- >= 5 也可以放在子查询的括号外,效果是一样的
GROUP BY c.name;

SQL29 使用join查询方式找出没有分类的电影id以及名称

SELECT 
    f.film_id,
    f.title
FROM film f
LEFT JOIN film_category fc USING(film_id)
WHERE fc.category_id IS NULL;

SQL30 使用子查询的方式找出属于Action分类的所有电影对应的title,description

SELECT f.title, f.description
FROM film f
WHERE film_id IN(
  SELECT film_id
  FROM film_category fc
  JOIN category c
  ON fc.category_id=c.category_id
  AND c.name='Action'
   )

SQL32 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分

SELECT CONCAT(last_name, ' ', first_name) Name
FROM employees

SQL33 创建一个actor表,包含如下列信息

DROP TABLE IF EXISTS actor;
CREATE TABLE actor(
  actor_id smallint(5) NOT NULL,
  first_name varchar(45) NOT NULL,
  last_name varchar(45) NOT NULL,
  last_update date NOT NULL,
   PRIMARY KEY(actor_id)
)

SQL34 批量插入数据

INSERT INTO actor
VALUES
    (1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'),
    (2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33');

SQL35 批量插入数据,如果数据已经存在,请忽略,不使用replace操作
注意:在插入语句的 INSERT INTO 中间加入 IGNORE 关键字可以实现 "如果数据已经存在,请忽略"。这是个新知识。

INSERT 【IGNORE】 INTO actor
VALUES(3,'ED','CHASE','2006-02-15 12:34:33');

SQL36 创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表
思路:考察的是插入数据的第二种方式 INSERT INTO + SELECT,经常用来将查询结果保存在一个表中。

DROP TABLE IF EXISTS actor_name;
CREATE TABLE actor_name(
    first_name VARCHAR(45) NOT NULL,
    last_name VARCHAR(45) NOT NULL
);

INSERT INTO actor_name
SELECT 
    first_name,
    last_name
FROM actor;

SQL37 对first_name创建唯一索引uniq_idx_firstname,对last_name创建普通索引idx_lastname
法1. 通过 CREATE INDEX 语句

CREATE UNIQUE INDEX uniq_idx_firstname ON actor(first_name);
CREATE INDEX idx_lastname ON actor(last_name);

法2. 通过 ALTER TABLE + ADD INDEX 语句

ALTER TABLE actor 
    ADD UNIQUE INDEX uniq_idx_firstname(first_name),
    ADD INDEX idx_lastname(last_name);

SQL38 针对actor表创建视图actor_name_view

DROP VIEW IF EXISTS actor_name_view;
CREATE VIEW actor_name_view AS  -- 这里的AS不能省略,就像构造CTE里的AS一样
    SELECT 
        first_name first_name_v,
        last_name last_name_v
    FROM actor;
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务