码迷,mamicode.com
首页 > 数据库 > 详细

MySQL笔记(2)

时间:2017-08-28 00:41:52      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:zmq2   asd   zll   style   pat   hbm   clj   tcap   ane   

SQL 的约束

约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。、

1 约束分类

约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。

在MySQL中,通常有这几种约束:

约束类型:主键默认值唯一外键非空
关键字: PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY NOT NULL

 

删除库语句为:
1 DROP DATABASE <数据库名>

2主键

主键 (PRIMARY KEY)是用于约束表中的一行,作为这一行的唯一标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要。主键不能有重复且不能为空。

1 Id int(10)primary key
2 constraint <主键名> primary key (主键)  eg constraint <app_pk> primary key (name)
3 constraint <主键名> primary key (主键,主键) eg constraint <app_pk> primary key (id,name)     
4 复合主键。主键不仅可以是表中的一列,也可以由表中的两列或多列来共同标识

3 默认值约束

默认值约束 (DEFAULT) 规定,当有 DEFAULT 约束的列,插入数据为空时,将使用默认值。

1 people_num int(10) default 10,      people_num有DEFAULT约束,默认值为10

DEFAULT 约束只会在使用 INSERT 语句时体现出来,INSERT语句中,如果被 DEFAULT 约束的位置没有值,那么这个位置将会被 DEFAULT 的值填充,如语句:

1 # 正常插入数据
2 INSERT INTO department(dpt_name,people_num) VALUES(dpt1,11);
3 
4 #插入新的数据,people_num 为空,使用默认值
5 INSERT INTO department(dpt_name) VALUES(dpt2);

4 唯一约束

唯一约束 (UNIQUE) 比较简单,它规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。

1 unique (phone),   unique约束,phone的值唯一

当 INSERT 语句新插入的数据和已有数据重复的时候,如果有 UNIQUE约束,则 INSERT 失败,比如:

1 INSERT INTO people VALUES(01,110110);
2 INSERT INTO people VALUES(02,110110,);

技术分享

5 外键约束

外键 (FOREIGN KEY) 既能确保数据完整性,也能表现表之间的关系。

一个表可以有多个外键,每个外键必须 REFERENCES (参考) 另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。

技术分享

技术分享

在 INSERT 时,如果被外键约束的值没有在参考列中有对应,则INSERT 失败:

1 INSERT INTO abc VALUES(01110111);

可见之后将 110111 改为110110,则插入成功:

技术分享

6 非空约束

非空约束 (NOT NULL),听名字就能理解,被非空约束的列,在插入值时必须非空。

1 age int(10),                              没有非空约束
2 phone int(12) not NULL,           有非空约束

在MySQL中违反非空约束,不会报错,只会有警告,比如以下语句:

#INSERT 成功 age 为空,因为没有非空约束,表中显示 NULL
INSERT INTO pp(id ,phone) VALUES(01,110); 

#警告 phone 被非空约束,值为空,表中显示0
INSERT INTO pp(id ,age) VALUES(02,110);

结果如图,出现警告,但还是插入数据成功,(5.5.50版本)5.6 版本以上的 MySQL 会报错,禁止插入不符合非空约束的数据:

技术分享

此时 pp表的内容为:

技术分享

SELECT语句详解

在数据库操作语句中,使用最频繁,也被认为最重要的是 SELECT 查询语句。前面用到了 SELECT * FROM table_name; 这条语句用于查看一张表中的所有内容。

而 SELECT 与各种限制条件关键词搭配使用,具有各种丰富的功能,这次实验就进行详细介绍。

1 基本的SELECT语句

SELECT 语句的基本格式为:

1 SELECT 要查询的列名 FROM 表名字 WHERE 限制条件;

如果要查询表的所有内容,则把 要查询的列名 用一个星号 * 号表示,代表要查询表中所有的列。

有时只需要查看某个表的指定的列,比如要查看people 表的 name 和 age:

1 SELECT name,age FROM people;

2 数学符号条件

SELECT 语句常常会有 WHERE 限制条件,用于达到更加精确的查询。WHERE限制条件可以有数学符号 (=,<,>,>=,<=) ,刚才我们查询了 name 和 age,现在稍作修改:

1 SELECT name,age FROM people WHERE age>25;

筛选出 age 大于 25 的结果。

或者查找一个名字为 Mary 的人的 name,age 和 phone:

1 SELECT name,age,phone FROM people WHERE name=Mary;

3 “AND”与“OR”

从这两个单词就能够理解它们的作用。WHERE 后面可以有不止一条限制,而根据条件之间的逻辑关系,可以用 OR(或) AND(且) 连接:

1 #筛选出 age 小于 25,或 age 大于 30
2 SELECT name,age FROM people WHERE age<25 OR age>30;
1 #筛选出 age 大于 25,且 age 小于 30
2 SELECT name,age FROM people WHERE age>25 AND age<30;

而刚才的限制条件 age>25 AND age<30 ,如果需要包含25和30这两个数字的话,可以替换为 age BETWEEN 25 AND 30

4 IN 和 NOT IN

关键词INNOT IN的作用和它们的名字一样明显,用于筛选“在”“不在”某个范围内的结果,比如说我们要查询在dpt3dpt4的人:

1 SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt IN (dpt3,dpt4);

NOT IN的效果则是,如下面这条命令,查询出了不在dpt1也不在dpt3的人:

1 SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt NOT IN (dpt1,dpt3);

5 通配符

关键字 LIKE 在SQL语句中和通配符一起使用,通配符代表未知字符。SQL中的通配符是 _% 。其中 _ 代表一个未指定字符,% 代表不定个未指定字符。

比如,要只记得电话号码前四位数为1101,而后两位忘记了,则可以用两个 _ 通配符代替:

1 SELECT name,age,phone FROM employee WHERE phone LIKE 1101__;

另一种情况,比如只记名字的首字母,又不知道名字长度,则用 % 通配符代替不定个字符:

1 SELECT name,age,phone FROM employee WHERE name LIKE J%;

这样就查找出了首字母为 J 的人。

6 对结果排序

有时可能需要对结果按某一列来排序,这就要用到 ORDER BY 排序关键词。默认情况下,ORDER BY的结果是升序排列,而使用关键词ASCDESC可指定升序降序排序。

比如,我们按salary降序排列,SQL语句为:

1 SELECT name,age,salary,phone FROM employee ORDER BY salary DESC;

7 SQL 内置函数和计算

SQL 允许对表中的数据进行计算。对此,SQL 有 5 个内置函数,这些函数都对 SELECT 的结果做操作:

函数名:COUNTSUMAVGMAXMIN
作用: 计数 求和 求平均值 最大值 最小值

其中 COUNT 函数可用于任何数据类型(因为它只是计数),而 SUM 、AVG 函数都只能对数字类数据类型做计算,MAX 和 MIN 可用于数值、字符串或是日期时间数据类型。

具体举例,比如计算出salary的最大、最小值,用这样的一条语句:

1 SELECT MAX(salary) AS max_salary,MIN(salary) FROM employee;

使用AS关键词可以给值重命名

8 子查询

上面讨论的 SELECT 语句都仅涉及一个表中的数据,然而有时必须处理多个表才能获得所需的信息。例如:想要知道名为 "Tom" 的员工所在部门做了几个工程。员工信息储存在 employee 表中,但工程信息储存在project 表中。

对于这样的情况,我们可以用子查询:

1 SELECT of_dpt,COUNT(proj_name) AS count_project FROM project
2 WHERE of_dpt IN
3 (SELECT in_dpt FROM employee WHERE name=Tom);

子查询还可以扩展到3层、4层或更多层。

9 连接查询

在处理多个表时,子查询只有在结果来自一个表时才有用。但如果需要显示两个表或多个表中的数据,这时就必须使用连接 (join) 操作。

连接的基本思想是把两个或多个表当作一个新的表来操作,如下:

1 SELECT id,name,people_num
2 FROM employee,department
3 WHERE employee.in_dpt = department.dpt_name
4 ORDER BY id;

另一个连接语句格式是使用 JOIN ON 语法,刚才的语句等同于:

1 SELECT id,name,people_num
2 FROM employee JOIN department
3 ON employee.in_dpt = department.dpt_name
4 ORDER BY id;

结果也与刚才的语句相同。

MySQL笔记(2)

标签:zmq2   asd   zll   style   pat   hbm   clj   tcap   ane   

原文地址:http://www.cnblogs.com/ljmzzyk/p/7440211.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!