主要是快速知道主要用法,以后用的时候直接查找即可
第一章:基本sql语法:
-
1 mysql数据字段:
blog:存储大量文本数据,需要很大的存储空间
char或者character:必须事先设定好,也是固定的长度。但是也不会多于256字符
VARCHAR:存储文本数据,最大长度可达255个字符,但是可变的
DEC:pf: DEC(6, 2) 之前的表示总位数,后者表示精度NULL:代表未定义,无法直接从表中选择NULL
select drinkinfo from table where address = NULL // 是错误的语句,没有东西可以等于NULL,NULL是未定义
正确的方式为:select drinkinfo from table where address IS NULL;比较1: VARCHAR比char节省空间,但是char查询效率高
比较2: DATETIME 更适合存储将来的时间,TIMESTAMP 更适合存储当前时间
注意:在insert into 数值是 DEC INT拒绝使用引号,其他的最好用单引号‘’; -
2 语句:
insert 语句:insert into mytable
values
('112', 'lcq', 'good','1');
这里可以省略列名和表名,但是数据值必须全部填入,并且顺序与 table顺序一致
转义
insert into gregs_list.doughnut_list
values('112', ''hello');
select 语句:
select * from .. where amount1 < '1'; amount1 为INT type is ok
where amount2 = '1.5'; amount2 is DEC type is ok
因为:RDBMS 内部不会因为‘’ 就把他们视为文本,本身还是容错的like 语句:
SELECT first_name from table where address like '%CA';
% 表示任意数量的位置字符的代替
SELECT first_name from table where address like 'CA'; ''表示一个未知字符的替身SELECT first_name from table where amount between 30 and 60; between and 表示的是 <= 和 >=
3 关键字:IN 和 NOT IN
NOT can also work with BETWEEN or LIKE;
pf:
SELECT first_name from table where NOT amount between 30 and 60;
SELECT first_name from table where NOT address like '%CA';4 delete key word:
DELETE FROM TABLE; // 删除整个表
DELETE FORM TABLE WHERE ID = 1; // where 可以是任何合理的条件
<> :表示不等于5 update:
// 必须要加where子句,否则表中的 每行和每列都会被修改
update table set first_column = '1', set secomd_column = '2' where ...
// 只需要一次update 就可以更新所有的列值自增1,同时支持加减乘除;除此之外,还有UPPER(), LOWER() 字符的大小写转换
update drinkinfo
set cost = cost + 1
where drink_name = 'Blue Moon'
OR
drink_name = 'Oh my Gosh';
第二章:数据库表的设计
1 原子性
规则一:具有原子性数据的列中不会有多个类型相同的值;
规则二:具有原子性数据的表中不会有多个存储同类数据的列;-
规范化表的优点:
1 表中不会有重复的数据,减少存储空间
2 可以减少查询时间
3 即使一开始表比较小,但是以后还是会增长,因此规范化重要show create table gregs_list.doughnut_list;
// 增加主键
alter table gregs_list.doughnut_list
add column id INT not NULL AUTO_INCREMENT first,
add primary key (id); -
修改表的语句:
1 change
2 modify
3 add
4 drop
用法:
alter table table_name
drop column column_a;select 特殊用法:right(), left() 选出文本列的部分内容
select right (location, 2) from mytable;
学会利用强大的sql字符串函数// 类似 case break
update movie_table
set category =
case
....
end: order by 关键词:
order by title:以标题为关键字进行排序
// 先以第一个关键字排序,再以第二个关键字排序,这里还可以扩展到多列排序
select title, category, purchased
from movie_table
order by category ASC, purchased DESC;
- function
select sum(score)
from aodfeed.goodidea
where goodidea.is_delete = 0;
select src, sum(score)
from aodfeed.goodidea
group by src
order by sum(score);
select src, max(score)
from aodfeed.goodidea
group by src;
// count 返回目标列中的行数,如果数据为null,则不参与计算
select count(img1) from goodidea;
// 多余group by 结合
select count(img1)
from goodidea
group by src;
// distinct
select distinct firstindustry
from goodidea
order by firstindustry;
select count(distinct firstindustry)
from goodidea;
// 0 开始, 从下标为19的记录开始,取4条记录
select distinct goodidea.firstindustry
from goodidea
order by firstindustry
limit 19,4;
// 多张表的数据库设计
1 可能需要把不符合原子性的列移入新的表
2 外键是表中的某一列,他引用到另外一个表的主键。外键值不需要唯一,通常也没有唯一性
3 当声明外键以后,如果有关联,那么在违反约束的时候会提醒我们破坏了外键的约束
4 外键不一定是父表的主键,但是必须有唯一性
数据表一对一(使用的很少):
父表中只有一行与子表中的某行关联
数据表一对多:可以进行主外键拆分
数据表多对多 pf:多个女生对应的多双鞋子
这里一般可以用户junction-table 来连接两个一对多表的关系;
注意:分表,去除表中重复的数据对表的查询和管理都有帮助
由两列以上组成的键称为组合键,组合主键
第一范式:
-
标准第一范式原则:
-
不符合第一范式
-
修正后符合第一范式:
第二范式:
1 先符合1NF
2 没有部分函数依赖性
3 如果你的表有人工主键,且没有组合主键,则符合2NF第三范式:
1 符合2NF
2 没有传递函数依赖性
连接与多张表的操作
从一个表中查询并插入另一个表的语句
select into profession (profession)
create profession from my_contants
group by profession
order by profession
select profession mc_prof
from my_contacts mc
group by mc_prof
order by mc_prof;
-
内连接:
select somecolumns
from table1
inner join
table2
on somecondition;
- 不等连接:
select boys.boy, toys.toy
from boys
inner join
toys
on boys.toy_id <> toys_toy_id
order by boys.boy
-
自然连接:自然连接只有在连接的列在两张表中的名称都相同时才有有用。