1

这是我的表:

class
-------
classId
course   //example: CMSC101
semester //example: Spring 2013
profId

professor
---------
profId
lname
fname

我想找到所有姓史密斯的教授教授的所有课程。我基本上想这样做:

SELECT * FROM `professor` WHERE lname=`Smith`

然后,获取这些结果并将它们插入其中???

SELECT * FROM `class` WHERE profId=`???`

无论如何我可以只用一个查询来做到这一点吗?

4

2 回答 2

1

这应该有效:

SELECT a.* FROM class a, professor b WHERE a.profId = b.profId AND b.lname = 'Smith';

干杯。

于 2013-04-07T01:25:30.043 回答
1

我强烈建议您使用 SQL JOINS。学习一次,终生使用。

SELECT c.*
FROM class AS c
INNER JOIN professor AS p
  ON (c.profId = p.profId)
WHERE p.lname LIKE 'Smith';

给你的一些读物:

SQL 加入
数据库规范化

[更新]
送给你的小礼物:

ER图

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

DROP SCHEMA IF EXISTS `school` ;
CREATE SCHEMA IF NOT EXISTS `school` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `school` ;

-- -----------------------------------------------------
-- Table `school`.`professor`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `school`.`professor` (
  `professorId` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `lname` VARCHAR(40) NOT NULL ,
  `fname` VARCHAR(40) NOT NULL ,
  PRIMARY KEY (`professorId`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `school`.`semester`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `school`.`semester` (
  `semesterId` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(8) NOT NULL ,
  PRIMARY KEY (`semesterId`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `school`.`course`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `school`.`course` (
  `courseId` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `code` VARCHAR(10) NOT NULL ,
  `name` VARCHAR(40) NOT NULL ,
  PRIMARY KEY (`courseId`) ,
  UNIQUE INDEX `code_UNIQUE` (`code` ASC) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `school`.`class`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `school`.`class` (
  `classId` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `courseId` TINYINT UNSIGNED NOT NULL ,
  `semesterId` TINYINT UNSIGNED NOT NULL ,
  `profId` INT UNSIGNED NOT NULL ,
  PRIMARY KEY (`classId`) ,
  INDEX `fk_class_professor_idx` (`profId` ASC) ,
  INDEX `fk_class_semester1_idx` (`semesterId` ASC) ,
  INDEX `fk_class_course1_idx` (`courseId` ASC) ,
  CONSTRAINT `fk_class_professor`
    FOREIGN KEY (`profId` )
    REFERENCES `school`.`professor` (`professorId` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_class_semester1`
    FOREIGN KEY (`semesterId` )
    REFERENCES `school`.`semester` (`semesterId` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_class_course1`
    FOREIGN KEY (`courseId` )
    REFERENCES `school`.`course` (`courseId` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

USE `school` ;

-- -----------------------------------------------------
-- Placeholder table for view `school`.`class_details`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `school`.`class_details` (`class_id` INT, `course_id` INT, `course_code` INT, `course_name` INT, `semester_id` INT, `semester_name` INT, `prof_id` INT, `prof_fname` INT, `prof_lname` INT);

-- -----------------------------------------------------
-- View `school`.`class_details`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `school`.`class_details`;
USE `school`;
CREATE  OR REPLACE VIEW `school`.`class_details` AS
SELECT
  w.classId    AS `class_id`,
  w.courseId   AS `course_id`,
  x.`code`     AS `course_code`,
  x.`name`     AS `course_name`,
  w.semesterId AS `semester_id`,
  y.`name`     AS `semester_name`,
  w.profId     AS `prof_id`,
  z.fname      AS `prof_fname`,
  z.lname      AS `prof_lname`
FROM class AS w
INNER JOIN course AS x
  ON (w.courseId = x.courseId)
INNER JOIN semester AS y
  ON (w.semesterId = y.semesterId)
INNER JOIN professor AS z
  ON (w.profId = z.professorId);

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

-- -----------------------------------------------------
-- Data for table `school`.`professor`
-- -----------------------------------------------------
START TRANSACTION;
USE `school`;
INSERT INTO `school`.`professor` (`professorId`, `lname`, `fname`) VALUES (1, 'Smith', 'Willard');
INSERT INTO `school`.`professor` (`professorId`, `lname`, `fname`) VALUES (2, 'Burton', 'Tim');

COMMIT;

-- -----------------------------------------------------
-- Data for table `school`.`semester`
-- -----------------------------------------------------
START TRANSACTION;
USE `school`;
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (1, '2011.1');
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (2, '2011.2');
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (3, '2012.1');
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (4, '2012.2');
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (5, '2013.1');
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (6, '2013.2');
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (7, '2014.1');
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (8, '2014.2');

COMMIT;

-- -----------------------------------------------------
-- Data for table `school`.`course`
-- -----------------------------------------------------
START TRANSACTION;
USE `school`;
INSERT INTO `school`.`course` (`courseId`, `code`, `name`) VALUES (1, 'CALC1', 'Calculus 1');
INSERT INTO `school`.`course` (`courseId`, `code`, `name`) VALUES (2, 'CALC2', 'Calculus 2');
INSERT INTO `school`.`course` (`courseId`, `code`, `name`) VALUES (3, 'PHYS1', 'Physics 1');
INSERT INTO `school`.`course` (`courseId`, `code`, `name`) VALUES (4, 'PHYS2', 'Physics 2');

COMMIT;

-- -----------------------------------------------------
-- Data for table `school`.`class`
-- -----------------------------------------------------
START TRANSACTION;
USE `school`;
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (1, 1, 3, 1);
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (2, 2, 3, 1);
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (3, 3, 3, 2);
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (4, 4, 3, 2);
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (5, 1, 4, 1);
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (6, 2, 4, 1);
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (7, 3, 4, 2);
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (8, 4, 4, 2);

COMMIT;

SELECT * FROM class_details;

SELECT * FROM class_details WHERE prof_lname LIKE 'Smith';
于 2013-04-07T03:55:01.570 回答