select t1.PURCHASE_YEAR,t2.HARDWARE_CATEGORY_NAME,t2.PROFESSION_NAME,sum(t3.NUMBER_VALUE) as NUMBER_VALUE,sum(t3.STORAGE) as STORAGE,t3.UPDATE_DATE from (select PURCHASE_YEAR from BVIEW_HARDWARE_ANUALCOUNT group by PURCHASE_YEAR) t1 cross join (select HARDWARE_CATEGORY_NAME,PROFESSION_NAME from BVIEW_HARDWARE_ANUALCOUNT group by HARDWARE_CATEGORY_NAME,PROFESSION_NAME) t2 inner join BVIEW_HARDWARE_ANUALCOUNT t3 on t1.PURCHASE_YEAR>=t3.PURCHASE_YEAR and t2.HARDWARE_CATEGORY_NAME=t3.HARDWARE_CATEGORY_NAME and t2.PROFESSION_NAME=t3.PROFESSION_NAME group by t1.PURCHASE_YEAR,t2.HARDWARE_CATEGORY_NAME,t2.PROFESSION_NAME,t3.UPDATE_DATE order by t1.PURCHASE_YEAR
pref_nam population
德岛 100
香川 200
爱嫒 150
高知 200
福冈 300
佐贺 100
长崎 200
东京 400
群马 50
select
case pref_nam
when '德岛' then '四国'
when '香川' then '四国'
when '爱嫒' then '四国'
when '高知' then '四国'
when '福冈' then '九州'
when '佐贺' then '九州'
when '长崎' then '九州'
else '其他' end as district,sum(population) from poptbl
group by
case pref_nam
when '德岛' then '四国'
when '香川' then '四国'
when '爱嫒' then '四国'
when '高知' then '四国'
when '福冈' then '九州'
when '佐贺' then '九州'
when '长崎' then '九州'
else '其他' end;
select
case pref_nam
when '德岛' then '四国'
when '香川' then '四国'
when '爱嫒' then '四国'
when '高知' then '四国'
when '福冈' then '九州'
when '佐贺' then '九州'
when '长崎' then '九州'
else '其他' end as district,sum(population) from poptbl
group by district;
设置数据库编码
CREATE DATABASE dbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
- 设置数据表编码
CREATE TABLE 'author' (
'authorid' char(20) NOT NULL,
'name' char(20) NOT NULL,
'age' char(20) NOT NULL,
'country' char(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
- mysql中两种数据库引擎
ENGINE=MyISAM
ENGINE=InnoDB
insert into 表名(字段名1,字段名2)values(值a1,值b1), (值a2,值b2),
select * from poptbl2;
+-----------+------+------------+
| pref_name | sex | population |
+-----------+------+------------+
| 德岛 | 1 | 60 |
| 德岛 | 2 | 40 |
| 香川 | 1 | 100 |
| 香川 | 2 | 100 |
| 爱媛 | 1 | 50 |
| 爱媛 | 2 | 100 |
| 高知 | 1 | 100 |
| 高知 | 2 | 100 |
| 福冈 | 1 | 100 |
| 福冈 | 2 | 200 |
| 佐贺 | 1 | 20 |
| 佐贺 | 2 | 80 |
| 长崎 | 1 | 125 |
| 长崎 | 2 | 125 |
| 东京 | 1 | 250 |
| 东京 | 2 | 150 |
select pref_name ,sum(case when sex='1' then population else 0 end) as cnt_m,sum(case when sex='2' then population else 0 end) as cnt_f from poptbl2 group by pref_name;
东京 250 150
佐贺 20 80
德岛 60 40
爱媛 50 100
福冈 100 200
长崎 125 125
香川 100 100
高知 100 100
新手 用 WHERE 子句 进行 条件 分支, 高手 用 SELECT 子句 进行 条件 分支。
用check约束多个列的条件关系
constraint check_salary check(
case when sex='2' then case when salary <= 20000 then 1 else 0 end
else 1 end =1)
女性员工的工资必须20万元以下
在 命题 逻辑 中, 该 命题 是 叫作 蕴含 式( conditional) 的 逻辑 表达式, 记作 P → Q。
这里 需要 重点 理解 的 是 蕴含 式 和 逻辑 与( logical product) 的 区别。 逻辑 与 也是 一个 逻辑 表达式, 意思是“ P 且 Q”, 记作 P ∧ Q。 用 逻辑 与 改写 的 CHECK 约束 如下 所示。 CONSTRAINT check_ salary CHECK ( sex = '2' AND salary <= 200000 ) 当然, 这 两个 约束 的 程序 行为 不一样。 究竟 哪里 不一样 呢? 请 先 思考 一下, 再看 下面 的 答案 和 解释。 答案 如果 在 CHECK 约束 里 使用 逻辑 与, 该 公司 将不 能 雇佣 男性 员工。 而 如果 使用 蕴含 式, 男性 也可以 在这里 工作。 解释 要想 让 逻辑 与 P ∧ Q 为真, 需要 命题 P 和 命题 Q 均为 真, 或者 一个 为真 且 另一个 无法 判定 真假。 也就是说, 能在 这家 公司 工作 的 是“ 性 别为 女 且 工资 在 20 万 日元 以下” 的 员工, 以及 性别 或者 工资 无法 确定 的 员工( 如果 一个 条件 为 假, 那么 即使 另一个 条件 无法 确定 真假, 也不能 在这里 工作)。 而 要想 让 蕴含 式 P → Q 为真, 需要 命题 P 和 命题 Q 均为 真, 或者 P 为 假, 或者 P 无法 判定 真假。 也就是说 如果 不满足“ 是 女性” 这个 前提 条件, 则 无需 考虑 工资 约束。
update salaries
set salary=case when salary >=30000 then salary*0.9
case when salary >=25000 and salary < 28000 set salary*1.2
else salay end;
select CM.course_name,
case when exists
(select month from opencourses OC where course_id='200706' and OC.month=CM.course_id) then 'O' else 'X' end as 'june',
case when exists
(select month from opencourses OC where course_id='200707' and OC.month=CM.course_id) then 'O' else 'X' end as 'july',
case when exists
(select month from opencourses OC where course_id='200708' and OC.month=CM.course_id) then 'O' else 'X' end as 'march'
from coursemaster CM;
这样 的 查询 没有 进行 聚合, 因此 也不 需要 排序, 月份 增加 的 时候 仅 修改 SELECT 子句 就可以 了, 扩展性 比较 好。 无论 使用 IN 还是 EXISTS, 得到 的 结果是 一样 的, 但 从 性能 方面 来说, EXISTS 更好。 通过 EXISTS 进 行的 子 查询 能够 用到“ month, course_ id” 这样 的 主 键 索引, 因此 尤其是 当 表 OpenCourses 里 数据 比较 多的 时候 更有 优势。
接下来, 我们 按照 下面 的 条件 查询 这张 表里 的 数据。
获取 只 加入 了 一个 社团 的 学生 的 社团 ID。
获取 加入 了 多个 社团 的 学 生的 主 社团 ID。
--用于查找是同一家人但住址却不同的记录的SQL语句