SQL数据库草根进阶篇
1. 如果我们在WHERE条件语句中,需要获取日期,数字甚至文本的两个值之间的数据,那么我们就要使用BETWEEN关键字了
SELECT 列 FROM 表名 WHERE 条件列 BETWEEN 值1 AND 值2 ;
样将查询出条件列中值在值1与值2之间的所有数据的指定列的值。
如果需要的是值1与值2以外的,我们可以在BETWEEN前加上NOT:
SELECT 列 FROM 表名 WHERE 条件列 NOT BETWEEN 值1 AND 值2 ;
TIPS:这里大家要注意一点的就是between...and...中的边际值,在不同的数据库环境中有不同的处理。
MySQL在BETWEEN...AND中包含边界值,而NOT语句中不包含。
LIKE THIS:
+-----+--------+------+------------+------------+--------------
| id | name | sex | birth | department | address
+-----+--------+------+------------+------------+--------------
| 901 | 张老大 | 男 | 1985-07-22 | 计算机 | 北京市海淀区
| 902 | 李二狗 | 男 | 1986-01-11 | 中文系 | 北京市昌平区
| 903 | 张三 | 女 | 1990-02-27 | 中文系 | 湖南省永州市
| 904 | 李四 | 男 | 1990-11-09 | 英语系 | 辽宁省阜新市
| 905 | 王五 | 女 | 1991-01-19 | 英语系 | 福建省厦门市
| 906 | 王六 | 男 | 1988-06-23 | 计算机 | 湖南省衡阳市
+-----+--------+------+------------+------------+--------------
6 rows in set (0.00 sec)
mysql> SELECT * FROM student WHERE id BETWEEN 903 AND 905;
+-----+------+------+------------+------------+--------------+
| id | name | sex | birth | department | address |
+-----+------+------+------------+------------+--------------+
| 903 | 张三 | 女 | 1990-02-27 | 中文系 | 湖南省永州市 |
| 904 | 李四 | 男 | 1990-11-09 | 英语系 | 辽宁省阜新市 |
| 905 | 王五 | 女 | 1991-01-19 | 英语系 | 福建省厦门市 |
+-----+------+------+------------+------------+--------------+
2. Alias(别名)
所谓别名,就是为我们指定的表或列设定一个方便阅读的名字。
使用格式:表名 AS 表的别名,列名 AS 列的别名。
SELECT 表1的别名.列1 AS 列1的别名, 表2的别名.列3 AS 列3的别名 FROM 表1 AS 表1的别名, 表2 AS 表2的别名 ;
LIKE THIS:
+----+--------+------+
| id | name | time |
+----+--------+------+
| 1 | 小海狗 | 98 |
| 2 | 小企鹅 | 80 |
+----+--------+------+
2 rows in set (0.03 sec)
mysql> SELECT id as i,name as a FROM lala;
+---+--------+
| i | a |
+---+--------+
| 1 | 小海狗 |
| 2 | 小企鹅 |
+---+--------+
3. 同时查询多个表
有时候我们需要查询的值可能存在同一个表中,而我们只能有一个结果集,那么我们就可以同时查询多个表。
SELECT 表1.列1,表2.列1 FROM 表1,表2... ;
不过单纯使用这种方法查询,会有一点小麻烦,后面我们将设置更多的条件,用来排除这些麻烦。
4.
数据库将维护很多张表,而表与表之间又有这一定联系,这个时候我们将会在获取数据时,同时访问多张表,并将数据返回到一个结果集上,那么这个时候,我们可以使用两个表中相关联的字段的值,进行筛选返回的数据,
SELECT * FROM 表1,表2 WHERE 表1.id = 表2.id ;
INNER JOIN
格式:
SELECT * FROM 表1 [INNER] JOIN 表2 ON 表1.id = 表2.id ;
如果表中有至少一个匹配,则返回行。
1.左右表都匹配就返回。
mysql> SELECT * FROM lala INNER JOIN score ON lala.time=score.grade;
+----+--------+------+------+--------+-------+
| id | name | time | id | cource | grade |
+----+--------+------+------+--------+-------+
| 1 | 小海狗 | 98 | 901 | 计算机 | 98 |
| 2 | 小企鹅 | 80 | 901 | 英语 | 80 |
+----+--------+------+------+--------+-------+
RIGHT JOIN
格式:
SELECT * FROM 左表 RIGHT JOIN 右表 ON 左表.id = 右表.id ;
即使左表中没有匹配,也从右表返回所有的行。
1.右表所有行的数据都要返回,不管是否匹配。
2.右表中无法再左表匹配的数据,左表用NULL填充。
LEFT JOIN
格式:
SELECT * FROM 左表 LEFT JOIN 右表 ON 左表.id = 右表.id ;
即使右表中没有匹配,也从左表返回所有的行。
1.左表所有数据都要返回到结果集中。
2.如果右表无法匹配的左表的数据,右表用NULL进行配对。
5.
UNION关键字
UNION关键字,联合,用于合并两个或多个SELECT语句的结果集。
格式:
(SELECT 列 FROM 表)
UNION [ALL]
(SELECT 列 FROM 表)
要求:1.两次查询的列数必须一样,类型相似。
2.union会自动去掉重复行,不想去掉就在UNION后面加上ALL。
3.如果句子中没有order by,limit,可以不使用(),order by一定要和limit一起使用,否则无意义。
就这样 差不多
6.
SQL约束
约束用于限制介入表的数据的类型。
我们可以在建表时设定约束,或者使用ALTER TABLE语句修改。
我们将主要了解一下几种约束:
NOT NULL UNIQUE
PRIMARY KEY FOREIGN KEY
CHECK DEFAULT
NOT NULL
NOT NULL约束该字段不能接受NULL值,也就是说如果不向此字段加入数据值,就无法插入新的数据。
例:
CREATE TABLE 表名 (字段名 字段类型 NOT NULL) ;
UNIQUE约束
UNIQUE约束,用来标识这个字段的数据的唯一性。说白了就是防止重复。
例: CREATE TABLE Persons (
id int(10) NOT NULL,
name varchar(50)
UNIQUE (id)
);
这里的例子是UNIQUE在建表语句中的使用。
追加UNIQUE约束
UNIQUE约束还能使用ALTER TABLE语句加入表中,一个表中可以有多个UNIQUE指定的列:
ALTER TABLE 表名 ADD UNIQUE(列) ;
向已存在的表中添加唯一约束时,需要注意这一列中是否已经有重复值,如果已经有重复值,将无法添加唯一约束。
不解释
PRIMARY KEY
主键,用于约束唯一标识数据库表中的每条记录。
要求:
1.主键必须包含唯一的值。
2.主键不能包含NULL值。
3.每个表只能有一个主键。
PRIMARY KEY 主键的创建:
CREATE TABLE Person (
id int NOT NULL,
name VARCHAR(20),
PRIMARY KEY (id)
)
追加PRIMARY KEY约束
PRIMARY KEYE约束还能使用ALTER TABLE语句加入表中:
ALTER TABLE 表名 ADD PRIMARY KEY(列) ;
删除主键约束:
ALTER TABLE 表名 DROP PRIMARY KEY ;
LIKE THIS :
ALTER TABLE lala ADD PRIMATY KEY (id);
lala | CREATE TABLE `lala` (
`id` int(10) NOT NULL default '0',
`name` varchar(30) default NULL,
`time` int(10) default NULL,
PRIMARY KEY (`id`),
KEY `time` (`time`),
CONSTRAINT `lala_ibfk_1` FOREIGN KEY (`time`) REFERENCES `score` (`grade`)
FOREIGN KEY约束
外键约束,用来指向另一个表中的PRIMARY KEY。
外键用来预防破坏表之间连接的动作。也可以防止非法数据的插入因为外键必须是他指向的那个表的值之一。
例子:
CREATE TABLE 表名(字段1 字段类型,字段2 字段类型,FOREIGN KEY(字段2) REFERENCES 表2(表2的字段))
追加FOREIGN约束
FOREIGN约束还能使用ALTER TABLE语句加入表中,一个表中可以有多个FOREIGN指定的列:
ALTER TABLE 表名 ADD FOREIGN KEY(列) REFERENCES 表2(表2的列) ;
删除FOREIGN约束,需要外键约束(CONSTRAINT)
ALTER TABLE 表名 DROP FOREIGN KEY 外键约束 ;
LIKE THIS:
ALTER TABLE lala ADD FOREIGN KEY (id) REFERENCES score(grade);
下位lala表格的FOREIGN约束属性
CONSTRAINT `lala_ibfk_1` FOREIGN KEY (`time`) REFERENCES `score` (`grade`)
7.
CHECK关键字
CHECK关键字
设定列的值的范围。
添加的方法:
CREATE TABLE 表名 (字段名 字段类型,...,CHECK (字段名0>=值)) ;
追加的方法:
单列:ALTER TABLE 表名 ADD CHECK(列>=值);
多列:ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK(列>=值 AND 列<=值) ;
删除约束的方法:
ALTER TABLE 表名 DROP CHECK 约束名 ;
LIKE THIS:
mysql> ALTER TABLE lala ADD CHECK(time<+100);
Query OK, 2 rows affected (0.33 sec)
Records: 2 Duplicates: 0 Warnings: 0
DEFAULT关键字
DEFAULT关键字
设定的默认值。
1.我们MySQL会给这些列自动加一个默认值为NULL的默认值。
2.我们如果追加默认值会覆盖掉前面设定的默认值。
3.如果删除默认值,他是不会自动回到default NULL。而是没有了默认值,没有默认值那么我们插入数据的时候就一定需要插入这一列的数据,这个数据也可以是NULL。
添加的方法:
CREATE TABLE 表名 (字段名 字段类型 DEFAULT 默认值,字段名 字段类型...)
追加的方法:
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值 ;
删除约束的方法:
ALTER TABLE 表名 ALTER 列名 DROP DEFAULT ;
不想解释
8 .
VIEW视图
约束用于限制介入表的数据的类型。
1.暴露部分数据给外部。
2.视图主要用于读取数据,因为插入数据要受到原来的表的限定。
3.视图实质上并不是一张表,尽管看起来一模一样,但是数据实质上市存在原来的表中的。
4.简化我们某些较为复杂的业务逻辑。
创建视图:
CREATE VIEW 视图名 AS SELECT STATEMENT(查询语句) ;
修改视图:(和我们创建的语句是一样)
CREATE VIEW 视图名 AS SELECT STATEMENT(查询语句) ;
删除视图:
DROP VIEW 视图名 ;
LIKE THIS:
mysql> CREATE VIEW nana AS SELECT id,name,time FROM lala;
Query OK, 0 rows affected (0.09 sec)
mysql> SELECT * FROM nana;
+----+--------+------+
| id | name | time |
+----+--------+------+
| 1 | 小海狗 | 98 |
| 2 | 小企鹅 | 80 |
+----+--------+------+