数据库 MySQL 之 数据操作

一、MySQL数据类型介绍

MySQL支持多种类型,大致可以分为四类:数值、字符串类型、日期/时间和其他类型。

①二进制类型

  • bit[(M)] 
    二进制位(101001),m表示二进制位的长度(1-64),默认m=1

②整数类型:存储年龄,等级,id,各种号码等

  • tinyint[(m)] [unsigned] [zerofill] 
    小整数,数据类型用于保存一些范围的整数数值范围: 
    有符号:-128 ~ 127. 
    无符号:255 
    特别的: MySQL中无布尔值,使用tinyint(1)构造。

  • int[(m)][unsigned][zerofill] 
    整数,数据类型用于保存一些范围的整数数值范围: 
    有符号: -2147483648 ~ 2147483647 
    无符号:4294967295

  • bigint[(m)][unsigned][zerofill] 
    大整数,数据类型用于保存一些范围的整数数值范围: 
    有符号:-9223372036854775808 ~ 9223372036854775807 
    无符号:18446744073709551615

  • 注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,所以我们使用默认的就可以了,有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的

③小数型:存储薪资、身高、体重、体质参数等

  • decimal[(m[,d])] [unsigned] [zerofill] 
    准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。 
    特别的:对于精确数值计算时需要用此类型 
    decaimal能够存储精确值的原因在于其内部按照字符串存储。

  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 
    单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。 
    有符号:(-3.402823466E+38 to -1.175494351E-38),0,(1.175494351E-38 to 3.402823466E+38) 
    无符号:0,(1.175 494 351 E-38,3.402 823 466 E+38) 
    数值越大,越不准确

  • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 
    双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。 
    有符号:(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0, 
    (2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 
    无符号:0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 
    数值越大,越不准确

④字符型

  • char (m) 
    char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。 
    PS: 即使数据小于m长度,也会占用m长度,但是在查询时,查出的结果会自动删除尾部的空格 
    特点:定长,简单粗暴,浪费空间,存取速度快

  • varchar(m)

    • varchar数据类型用于变长的字符串,可以包含最多达65535个字符 
      (理论上可以,但是实际上在超出21845长度后,mysql会自动帮您转换数据类型为文本类型)
    • 其中m代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中
    • PS: varchar类型存储数据的真实内容,例如:如果’ab ‘,尾部的空格也会被存起来
    • 强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数 
      (1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用) 
      如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255) 
      如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
    • 特点:变长、精准、节省空间、存取速度慢
    • sql优化:创建表时,定长的类型往前放,变长的往后放,比如性别、地址或描述信息
    • PS:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以
  • text 
    text数据类型用于保存变长的大字符串,可以最多到65535 (2**16 − 1)个字符。

⑤日期/时间类型:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等

  • DATE(日期值) 
    YYYY-MM-DD(1000-01-01/9999-12-31)

  • TIME(时间值或持续时间) 
    HH:MM:SS(’-838:59:59’/’838:59:59’)

  • YEAR(年份值) 
    YYYY(1901/2155)

  • DATETIME(混合日期和时间值)

  • TIMESTAMP(时间戳) 
    YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)

⑥枚举类型(了解)

  • enum 
    An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)

⑦集合类型(了解)

  • set 
    A SET column can have a maximum of 64 distinct members. 
    示例: 
    CREATE TABLE myset (col SET('a', 'b', 'c', 'd')); 
    INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');

二、数据操作之插入(INSERT)

1、语法一: 按字段进行插入

1
insert into 表(字段1,字段2 ...) values (值1,值2 ...);

例如:

1
insert into student(id,name,age,sex,salary) values(1,'小猪',18,'男',2500);

2、语法二:按字段顺序插入  

1
insert into 表 values (值1,值2 ...);

例如:

1
insert into student(id,name,age,sex,salary) values(1,'小猪',18,'男',2500) ,(2,'小猪2',28,'男',2500);

3、语法三: 插入多条记录

1
insert into 表 values (值1,值2 ...) ,(值1,值2 ...) ,(值1,值2 ...);

例如:  

1
insert into student values(1,'小猪',18,'男',2500);

ps:如果插入的数据个数和位置正好与表的字段个数和位置匹配,则可以省略表名后面的字段定义

4、语法四:插入查询结果

1
insert into 表(字段1,字段2 ...) select 字段1,字段2 ... from 表;

例如:

1
insert into student(id,name,age) select id,name,age from tb ;

ps:从tb表中查询数据并插入到 student表中

三、数据操作之更新(update)  

1、语法一: 更新整表数据   

1
update 表 set 字段1= '值1', 字段2='值2' ... ;

例如:  

1
update student set name = '学生1' ;

ps: student表中所有的name字段的值全部被更新为 ‘学生1’

2、语法二:更新符合条件字段3的数据

1
update 表 set 字段1= '值1', 字段2='值2' ... where 字段3 = 值3;

例如:

1
update student set name= '学生1' ,age =13 where id = 2;

ps: 更新student表中name和age字段的值,并且只更新id = 2的一条记录

四、数据操作之删除(delete)  

1、语法一:整表数据删除

1
delete from 表 ;

例如:  

1
delete from student;

ps:删除 student 表中所有的数据,注意:如果有自增主键,主键记录的值不会被删除.

2、语法二:删除符合where后条件的数据   

1
delete from 表 where 字段1=值1;

例如:

1
delete from student where id=1;

ps:只删除id 为1的数据.

3、语法三:清空表内容

例如:  

1
truncate student;

ps:清空表,注意:如果有自增主键,主键记录的值会被删除而重头开始记录

五、数据操作之查询(select)  

1、单表查询

  •  简单查询   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
语法:
select [distinct]*(所有)|字段名,...字段名 from 表名;
 
查询所有字段信息
select from table;
 
查询指定字段信息
select id,name,age,sex,salary from person;
 
别名查询,使用的as关键字,as可以省略的
select name,age as'年龄',salary '工资' from person;
 
直接对列进行运算,查询出所有人工资,并每人增加100块
select name, salary+100 from person;
 
剔除重复查询
select distinct age from person;
  • 条件查询:使用WHERE关键字对简单查询的结果集进行过滤 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
语法:
    select [distinct]*(所有)|字段名,...字段名 from 表名 [where 条件过滤]
 
比较运算符:>、<、>=、<=、=、!=
    select from person where age = 23;
    select from person where age != 23;
 
null关键字:is null、not null
    select from person where age is null;
    select from person where age is not null;
 
逻辑运算符:and、or(用于多个条件连接)
    select from person where age = 23 and salary =29000;
    select from person where age = 23 or salary =29000;
  • 区间查询
1
2
3
4
5
语法:
    between 数值1 and 数值2(包含数值1和数值2)
 
between...and...区间查询
    select from person where salary between 4000 and 8000;
  • 集合查询
1
2
3
4
5
6
7
8
9
语法
   使用关键字 in 或 not in 来过滤集合
 
in 集合查询
    select from person where age in(23,32,18);
    等价于: select from person where  age =23 or age = 32 or age =18;
 
not in 集合查询
    select from person where age not in(23,32,18);
  • 模糊查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
语法:
  使用关键字like 或 not like 来进行模糊查询,% 指代任意多个字符、_ 指代单一字符
 
like 关键字的 % 用法
   select from person where name like '张%';
   select from person where name like '%张';
   select from person where name like '%张%';
 
like 关键字的 _ 用法
   select from person where name like '____';
   select from person where name like '_l%';
 
not like 关键字的 % 用法
   select from student where name not like 'a%'
  • 排序查询 
1
2
3
4
5
6
7
8
9
10
11
语法
   select 字段|* from 表名 [where 条件过滤] [order by 字段[ASC][DESC]]
   默认为升序排序asc;降序为desc
 
order by 排序查询
   select from person order by salary asc;
   select from person order by salary desc;
 
强制中文排序
   select from person order by convert(name using gbk);
   ps:UTF8 默认校对集是 utf8_general_ci , 它不是按照中文来的。你需要强制让MySQL按中文来排序
  • 聚合函数
1
2
3
4
5
6
7
8
9
10
11
12
13
概念
   对列进行操作,返回的结果是一个单一的值,除了 COUNT 以外,都会忽略空值
   count:统计指定列不为NULL的记录行数
   sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0
   max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算
   min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算
   avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0
 
语法
   select 聚合函数(字段) from 表名;
 
使用max()、min()、avg()聚合函数
   select max(age),min(age),avg(age) from person;
  • 分组查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
概念:
   将一些具有相同特征的数据 进行归类.比如:性别,部门,岗位等等
 
语法:
   select 被分组的字段 from 表名 group by 分组字段 [having 条件字段]
   ps: 分组查询可以与聚合函数组合使用
 
使用 GROUP BY 关键字进行分组查询
   select avg(salary),dept from person GROUP BY dept;
 
GROUP_CONCAT(expr):按照分组,将expr字符串按逗号分隔,组合起来
   select avg(salary),dept,GROUP_CONCAT(name) from person GROUP BY dept;
 
where 与 having区别:
   ·执行优先级从高到低:where group by > having
   ·Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
   ·Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
  • 分页查询
1
2
3
4
5
6
7
8
9
10
11
作用:
  限制查询数据条数,提高查询效率
 
语法:
   limit (起始条数),(查询多少条数)
 
查询前5条数据:
   select from person limit 5;
 
查询第5条到第10条数据:
   select from person limit 5,5;
  • 正则表达式 

MySQL中使用 REGEXP 操作符来进行正则表达式匹配。

模式 描述
^ 匹配输入字符串的开始位置。 
$ 匹配输入字符串的结束位置。
. 匹配任何字符(包括回车和新行)。
[...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ^  匹配 name 名称 以 "e" 开头的数据
select from person where name REGEXP '^e';
  
# $  匹配 name 名称 以 "n" 结尾的数据
select from person where name REGEXP 'n$';
  
# . 匹配 name 名称 第二位后包含"x"的人员 "."表示任意字符
select from person where name REGEXP '.x';
  
# [abci] 匹配 name 名称中含有指定集合内容的人员
select from person where name REGEXP '[abci]';
  
# [^alex] 匹配 不符合集合中条件的内容 , ^表示取反
select from person where name REGEXP '[^alex]';
#注意1:^只有在[]内才是取反的意思,在别的地方都是表示开始处匹配
#注意2 : 简单理解 name  REGEXP '[^alex]' 等价于 name != 'alex'
  
# 'a|x' 匹配 条件中的任意值
select from person where name REGEXP 'a|x';  
  
#查询以w开头以i结尾的数据
select from person where name regexp '^w.*i$';
#注意:^w 表示w开头, .*表示中间可以有任意多个字符, i$表示以 i结尾

正则详情参考 :http://www.cnblogs.com/wangfengming/articles/8067037.html  

2、多表查询  

  • 多表联合查询
1
2
3
4
5
6
7
语法:
   select  字段1,字段2... from 表1,表2... [where 条件]
   注意: 如果不加条件直接进行查询,则会出现以下效果,这种结果我们称之为笛卡尔乘积
   笛卡尔乘积公式 : A表中数据条数   *  B表中数据条数  = 笛卡尔乘积
 
person表与dept表联合查询:
   select from person,dept 
  • 多表连接查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
语法:
   SELECT 字段列表 FROM 表1  INNER|LEFT|RIGHT JOIN  表2 ON 表1.字段 = 表2.字段;
 
内连接查询 (只显示符合条件的数据)
   select from person inner join dept on person.did =dept.did;
   效果:内连接查询与多表联合查询的效果是一样的
 
左外连接查询 (左边表中的数据优先全部显示)
   select from person left join dept on person.did = dept.did;
   效果:人员表中的数据全部都显示,而部门表中的数据符合条件的才会显示,不符合条件的会以 null 进行填充
 
右外连接查询 (右边表中的数据优先全部显示)
   select from person right join dept on person.did = dept.did;
   效果:与左外连接相反
 
全连接查询(显示左右表中全部数据)
   全连接查询:是在内连接的基础上增加 左右两边没有显示的数据
  注意: mysql并不支持全连接 full JOIN 关键字
  注意: 但是mysql 提供了 UNION 关键字.使用 UNION 可以间接实现 full JOIN 功能
   SELECT * FROM person LEFT JOIN dept ON person.did = dept.did
   UNION
   SELECT * FROM person RIGHT JOIN dept ON person.did = dept.did;
  • 复杂条件多表查询    
1
对于复杂条件的多表查询,可以分块进行查询最后再整合在一起
  • 子语句查询 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
概念:
   子查询(嵌套查询): 查多次, 多个select
   注意: 第一次的查询结果可以作为第二次的查询的条件或者表名使用
   子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字,还可以包含比较运算符:= 、 !=、> 、<等
 
作为表名使用
   select from (select from person) as 表名;
   ps:大家需要注意的是: 一条语句中可以有多个这样的子查询,在执行时,最里层括号(sql语句) 具有优先执行权
   注意: as 后面的表名称不能加引号('')
 
关键字:
   ·ANY关键字
       假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么,
       select ...from ... where a > any(...);
       等价于
       select ...from ... where a > result1 or a > result2 or a > result3;
 
   ·ALL关键字
       ALL关键字与any关键字类似,只不过上面的or改成and。即:
       select ...from ... where a > all(...);
       等价于
       select ...from ... where a > result1 and a > result2 and a > result3;
 
   ·SOME关键字
       some关键字和any关键字是一样的功能。所以:
       select ...from ... where a > some(...);
       等价于
       select ...from ... where a > result1 or a > result2 or a > result3;
 
   ·EXISTS 关键字
       ·exist 与 not exist 语法
           SELECT ... FROM table WHERE  EXISTS (subquery)
           该语法可以理解为:主查询(外部查询)会根据子查询验证结果(TRUE或FALSE)来决定主查询是否得以执行,NOT EXISTS刚好与之相反
  • 其他方式查询  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
临时表查询
   需求:查询高于本部门平均工资的人员
   思路:1.先查询部门人员的平均工资
           SELECT dept_id,AVG(salary)as sal from person GROUP BY dept_id;
 
         2.再用人员的工资与部门的平均工资进行比较
           SELECT * FROM person as p1,
               (SELECT dept_id,AVG(salary)as '平均工资' from person GROUP BY dept_id) as p2
           where p1.dept_id = p2.dept_id AND p1.salary >p2.`平均工资`;
 
         ps:我们可以把上一次的查询结果当前做一张表来使用。因为p2表不是真是存在的,所以:我们称之为临时表  
         临时表:不局限于自身表,任何的查询结果集都可以认为是一个临时表
 
判断查询
   ·语法
       IF(条件表达式,"结果为true",'结果为false');
   ·语法一:
       SELECT
           CASE WHEN STATE = '1' THEN '成功'
                WHEN STATE = '2' THEN '失败'
                ELSE '其他' END
       FROM 表;
 
   ·语法二:
       SELECT CASE age
                  WHEN 23 THEN '23岁'
                  WHEN 27 THEN '27岁'
                  WHEN 30 THEN '30岁'
               ELSE '其他岁' END
       FROM person;
  • SQL逻辑查询语句执行顺序(重点★)

参考:http://www.cnblogs.com/wangfengming/articles/7880312.html

补充:

1、约束

  • 外键约束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
约束:
    约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性
 
外键(foreign key)
    就是表与表之间的某种约定的关系,由于这种关系的存在,能够让表与表之间的数据,更加的完整,关连性更强。
 
外键的定义方法
    ·创建表的同时定义外键约束
        CREATE TABLE IF NOT EXISTS dept (
            did int not null auto_increment PRIMARY KEY,
            dname VARCHAR(50) not null COMMENT '部门名称'
        )ENGINE=INNODB DEFAULT charset utf8;
 
        CREATE TABLE IF NOT EXISTS person(
            id int not null auto_increment PRIMARY KEY,
            name VARCHAR(50) not null,
            age TINYINT(4) null DEFAULT 0,
            sex enum('男','女','人妖') NOT NULL DEFAULT '人妖',
            salary decimal(10,2) NULL DEFAULT '250.00',
            hire_date date NOT NULL,
            dept_id int(11) DEFAULT NULL,
           CONSTRAINT fk_did FOREIGN KEY(dept_id) REFERENCES dept(did) -- 添加外键约束
        )ENGINE = INNODB DEFAULT charset utf8;
 
    ·已经创建表后追加外键约束
        ·添加外键约束
            ALTER table person add constraint fk_did FOREIGN key(dept_id) REFERENCES dept(did);
        ·删除外键约束
            ALTER TABLE person drop FOREIGN key fk_did;
 
    ·定义外键的条件:
        ·外键对应的字段数据类型保持一致,且被关联的字段(即references指定的另外一个表的字段),必须保证唯一
        ·所有tables的存储引擎必须是InnoDB类型.
        ·外键的约束4种类型:
            1、RESTRICT:同no action, 都是立即检查外键约束
            2、NO ACTION:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 
            3、CASCADE:在父表上update/delete记录时,同步update/delete掉子表的匹配记录
            4、SET NULL:在父表上update/delete记录时,将子表上匹配记录的列设为null(要注意子表的外键列不能为not null
        ·建议:
            1、如果需要外键约束,最好创建表同时创建外键约束
            2、如果需要设置级联关系,删除时最好设置为 SET NULL
  • 其他约束类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
非空约束
   ·关键字: NOT NULL ,表示 不可空. 用来约束表中的字段列
   ·create table t1(
      id int(10) not null primary key,
      name varchar(100) null
    );   
       
主键约束
   ·用于约束表中的一行,作为这一行的标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要。
   ·create table t2(
       id int(10) not null primary key
    );
    注意: 主键这一行的数据不能重复且不能为空。
 
   ·特殊的主键——复合主键。主键不仅可以是表中的一列,也可以由表中的两列或多列来共同标识
   ·create table t3(
       id int(10) not null,
       name varchar(100) ,
       primary key(id,name)
   );
 
唯一约束
   ·关键字: UNIQUE, 它规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。
 
   ·create table t4(
       id int(10) not null,
       name varchar(255) ,
       unique id_name(id,name)
    );
   添加唯一约束
   alter table t4 add unique id_name(id,name);
   删除唯一约束
   alter table t4 drop index id_name;
 
   ·注意: 当INSERT语句新插入的数据和已有数据重复的时候,如果有UNIQUE约束,则INSERT失败
 
默认值约束
   ·关键字: DEFAULT
 
   ·create table t5(
       id int(10) not null primary key,
       name varchar(255) default '张三'  
   );
   插入数据
   INSERT into t5(id) VALUES(1),(2);
 
   ·注意: INSERT语句执行时,如果被DEFAULT约束的位置没有值,那么这个位置将会被DEFAULT的值填充

 2、表与表之间的关系 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
表关系分类
  总体可以分为三类: 一对一 、一对多 、多对多
 
如何区分表与表之间是什么关系
   ·多对一 /一对多:站在左表的角度去看右表
       如果左表中的一条记录,对应右表中多条记录.那么他们的关系则为一对多关系
       约束关系为:左表普通字段, 对应右表foreign key 字段.
       注意:如果左表与右表的情况反之。则关系为多对一关系。约束关系为:左表foreign key字段, 对应右表普通字段。
 
   ·一对一:站在左表的角度去看右表
       如果左表中的一条记录对应右表中的一条记录,则关系为一对一关系。
       约束关系为:左表foreign key字段上 添加唯一(unique)约束, 对应右表关联字段.
       或者:右表foreign key字段上添加唯一(unique)约束, 对应右表关联字段.
 
   ·多对多:站在左表和右表同时去看
       如果左表中的一条记录对应右表中的多条记录,并且右表中的一条记录同时也对应左表的多条记录,则为多对多关系。
       这种关系需要定义一个这两张表的[关系表]来专门存放二者的关系
 
建立表关系
   ·一对多关系
       思路:’建两个表,一’方不动,’多’方添加一个外键字段
 
   ·一对一关系
       思路: 一对一的表关系实际上是变异了的一对多关系,通过在从表的外键字段上添加唯一约束(unique)来实现一对一表关系。
 
   ·多对多关系
       思路:这种方式可以按照类似一对多方式建表,但冗余信息太多,好的方式是实体和关系分离并单独建表,
       实体表为学生表和课程表,关系表为选修表,其中关系表采用联合主键的方式(由学生表主键和课程表主键组成)建表。
 
数据库设计三范式
   1、第一范式(确保每列保持原子性)
   2、第二范式(确保表中的每列都和主键相关)
   3、第三范式(确保每列都和主键列直接相关,而不是间接相关)
   总结:在实际工作中,为了方便查询,简化SQL语句,通常是查询快捷最大化,所以很多场景是反三范式的

  

  

  

最新文章

  1. NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介
  2. linux shell 之 crontab(定时任务)详解
  3. Angularjs学习---angularjs环境搭建,ubuntu 12.04下安装nodejs、npm和karma
  4. springMvc文件下载
  5. asp.net @reqister指令
  6. UVa 10137 &amp; ZOJ 1874 The Trip
  7. 【ALB学习笔记】基于.NET环境的高频RFID卡读写设备的基本操作案例
  8. 2017noip普及组赛前注意事项总结
  9. spring cloud熔断监控Hystrix Dashboard和Turbine
  10. dtls_srtp学习笔记
  11. Windows上使用Thunderbird与GPG发送和解密公钥加密的电子邮件
  12. Microsoft Edge浏览器下载文件乱码修复方法
  13. SignalR 实时推送消息
  14. Navicat Premium for Mac完美破解
  15. Survey项目总结
  16. 卡在checking installable status
  17. win10系统进入BIOS
  18. 后台管理Models
  19. 【一个小功能】从js判断ie版本,浅谈navigator对象的appName属性
  20. jQuery get selected text from SELECT (or DROPDOWN) list box

热门文章

  1. 转载pll工作模式解析
  2. 【POJ 3179】 Corral the Cows
  3. Jmeter ----关于上传图片接口
  4. 对象的克隆,Dozer的使用
  5. Python学习书籍推荐 中英对照
  6. gen_server的一些心得
  7. entering power save mode无法开机解决办法
  8. JCE无限制权限策略文件
  9. 海外开发者推荐:10个顶级2D游戏资源站
  10. ASP.NET页面传值加号变空格解决办法