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;