数据库三
表的操作
#例子
CREATE TABLE z1(
id INT(5),
name CHAR(5),
number INT(5)
)
1.添加约束键
ADD PRIMARY KEY( )//主键
ADD UNIQUE KEY( )//唯一键
ALTER TABLE z1
ADD PRIMARY KEY(id);
ALTER TABLE z1
ADD UNIQUE KEY(number);
2.删除约束键
DROP PRIMARY KEY //不需要加参数,因为主键必须是唯一的
DROP KEY()
ALTER TABLE z1
DROP PRIMARY KEY;
ALTER TABLE z1
DROP KEY number;#直接删除该字段的key也可以
索引和视图
这是DBA的主要工作,对数据库的优化工作,这里仅作为了解
索引:
#加索引
ALTER TABLE z1
ADD KEY(name);
视图:
视图的作用类似于表,可以理解为查询结果保存到一个表里,或者当成一个链接。
视图不是真正的表,它虚表,没有数据
只是封装一个查询语句
可以理解为链接,快捷方式
CREATE VIEW view_name AS
SELECT * FROM students WHERE age>19;
别名
就是将一个字段改成其他名字
SELECT number AS 学号,name AS 姓名
FROM student;
效果:
↓
↓
子查询(查询结果为表)
SELECT * FROM (SELECT * FROM students WHERE age=19) AS tb WHERE age > 17;
筛选条件
比较运算符
INSERT INTO students VALUES('201804011',NULL,NULL,NULL);
INSERT INTO students VALUE('201804012',NULL,NULL,NULL);#加入两个空的行
SELECT * FROM students
WHERE name IS NOT NULL;
SELECT * FROM students
WHERE name IS NULL;
SELECT * FROM students
WHERE name<>NULL;
逻辑运算符
SELECT * FROM students
WHERE age>19 AND age<22;
SELECT * FROM students
WHERE age>18 OR age<22;
SELECT * FROM students
WHERE age BETWEEN 19 AND 22; #和第一个效果一样
SELECT * FROM students
WHERE age IN(19,20,22);#这里括号里面不是范围,是指age的元素,也就是当age是19,20,22的时候才会返回
#模糊查找
INSERT INTO students VALUES('201804111','周一',NULL,NULL);
INSERT INTO students VALUES('201804112','周一一',NULL,NULL);
INSERT INTO students VALUES('201804113','周扒皮',NULL,NULL);#先插入三条信息
SELECT * FROM students
WHERE name LIKE '周%';
排序与去重
1.排序
问题一: 如果希望查询的结果依据某列排序该怎么做 ?
问题二: 是否支持正序与反序排列 ?
问题三: 如果只查询部分列,能否去重 ?
SELECT columns
FROM tb_name
ORDER BY ord_col_1 [asc/desc]; // 正序: asc (默认) 倒序 : desc
SELECT * FROM students
ORDER BY age; #升序
SELECT * FROM students
ORDER BY name DESC; #倒序 但是字符的顺序默认为编码顺序,不是字母顺序
2.去重
SELECT DISTINCT name FROM students;#把重复的去掉,随机留一个
聚合与分组
问题一: 仅从文字上看,你认为聚合是什么意思 ?
#统计个数
SELECT COUNT(name) FROM students;#注意NULL不记录在结果中
SELECT MAX(age) FROM students;#最大值
SELECT MAX(name) FROM students;#最小值
1.分组查询
SELECT group_column, aggregations
FROM tb_name
**GROUP** **BY** group_column;
在分组的情况下,只应该出现分组列和聚合列**
其他的列没有意义 !
SELECT student_number FROM grades
GROUP BY student_number;#把重复的分在一起,最后显示的结果就没有重复的
↓
↓
2.聚合筛选
SELECT group_column, aggregations
FROM tb_name
GROUP group_column
**HAVING** conditions;
SELECT student_number FROM grades #此处student——number不能改成*
GROUP BY student_number
HAVING student_number>201804004;#将student——number分组后筛选出大于某值的情况
#这里HAVING后面必须是 SELECT后面的字段,所以第一行不能改成*
注意!!!
限制与分页
(分页就是显示行数)
问题一: 如果一次性不需要那么多数据,该如何做 ?
问题二: 能否从指定位置开始取 ?
问题三: 分页是如何做的 ?
1.限制结果个数
SELECT columns FROM tb_name
**LIMIT** count;
SELECT columns FROM tb_name
**LIMIT** start, count;
SELECT * FROM students
LIMIT 2; # 只显示头两行,不管多少数据
SELECT * FROM students
LIMIT 3,4; #从第三个开始显示,往后显示四条数据,不显示第三条数据
2.分页(就是类似于将一部小说分成好几页)
SELECT columns
FROM tb_name
**LIMIT** (n-1)*m, m
举个例子:
n为1 m为10 则显示从0到10行数据
n为2 m为10 则显示从11到20行数据
…以此类推