SQL数据查询及常见约束

 1. 查询指定列以及查询所有在上一篇已经写过,不再赘述。
 2. 查询经过计算的值
 -  格式:select 子句的的目标列表达式(可以是属性列也可以是表达式) from 表名
 -  select * from student where entertime>'2017-05-01';
 3. 选择表中的若干元组:
 - DISTINCT消除重复的行:
 - SELECT DISTINCT Sclass from student;
 - 查询满足条件的元组
 - 比较大小:=,>,<,>=,<=,!=,<>(不等于),!>,!<,not;
 - 确定范围:BETWEEN AND,NOT BETWEEN AND;
 - ---查找年龄在18-20之间的学生:select * from student where Sage BETWEEN 18 AND 20;
 - 确定集合:IN,NOT IN;
 - 字符匹配:LIKE,NOT LIKE;(这里会使用通配符%或 _,其中%是指任意长度的字符串,而 _ 代表任意单个字符,如果目标字符串中含有通配符例如:“xing _test”,则需要使用ESCAPE '<换码字符>',在SQL语句中要写成 "LIKE xing \_test ESCAPE '\'; " )
 ---- 例如查找学号倒数第三位是5的学生:select * from student where Snumber like '%5__';
 - 空值:IS NULL,IS NOT NULL;
 - 多重条件(逻辑运算):AND,OR,NOT;
 - ORDER BY子句默认值是升序ASC;      降序DESC;
 4. 聚集函数:
聚集函数只能用于SELECT子句和GROUP BY 中的HAVING子句;
 - COUNT(*)              统计元组个数
 - COUNT([DISTINCT | ALL] <列名>)  统计一列中值的个数
 - 为方便,以下括号中用...代替[DISTINCT | ALL] <列名>
 - SUM(...)       计算一列值的总和
 - AVG(...)        计算一列值的平均数
 - MAX(...)      求一列值中的最大值
 - MIN(...)       求一列值中的最小值
 - 如果DISTINCT则计算的时候要取消指定列中的重复值,否则的话不取消重复值.
 - select COUNT(*) from student;
 - select SUM(Sage) from student;
 -  select AVG(Sage) from student;
 -  select MIN(Sage) from student;
 - select MAX(Sage) from student;
 5. GROUP BY 子句
 - 将查询结果按照一列或者多列的值分组,值相等的为一组;
 - 例如:查询学生表中,不同的班级分别有多少人。表中有学生所属班级Sclass字段,按照GROUP BY子句查询后,同一个班的为一组,有多少个班级就会出现多少条查询结果。
 - select Sclass,COUNT(*) from student group by Sclass;
 - 结果为:| Sclass | COUNT(*) |
        +--------+----------+
        |      1 |        4 |
        |      2 |        1 |
        |      3 |        1 |
        +--------+----------+
 - 如果需要查询人数最多的班级情况呢?
 - 只需要对GROUP BY查询出的结果进行排序并限制查询的数据为一条即可。如果需要最大值,则进行降序排序;如果需要最小值,则升序;
 - select Sclass,COUNT(*) as sumNum  from student group by Sclass ORDER BY sumNum desc limit 1;结果如下:

+——–+——–+
| Sclass | sumNum |
+——–+——–+
| 1 | 4 |
+——–+——–+

 6. 嵌套查询
 - SQL语言中一个 SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。
 - 查出和名为num1在同一个班级的学生姓名:
 - select Sname from student where Sclass in(select Sclass from student where Sname="num1");

+——–+
| Sname |
+——–+
| num1 |
| byu7 |
| nids |
| dhasjk |
+——–+
7. 带有谓词的子查询
- >ANY 大于子查询结果中的某个值
- >ALL 大于子查询结果中的所有值
- 以此类推各种符号下的情况
- EXISTS谓词,其查询不返回任何数据,只产生逻辑真 true或者逻辑假值 false(存在true ,不存在 false),NOT EXISTS(查询为空时返回 true ,反之返回 false)。
8. 集合查询:
- UNION 并操作
- 查询一班和二班的学生:select * from student where Sclass=1 UNION select * from student where Sclass =2;
+—–+——–+——+——+————+————+——-+——–+
| Sid | Sname | Ssex | Sage | Snumber | entertime | Sdept | Sclass |
+—–+——–+——+——+————+————+——-+——–+
| 1 | num1 | 男 | 19 | 2014150001 | 2017-09-14 | CS | 1 |
| 2 | byu7 | 男 | 19 | 2014150011 | 2017-02-14 | CS | 1 |
| 3 | nids | 男 | 17 | 2014150561 | 2017-07-14 | CS | 1 |
| 6 | dhasjk | ds | 19 | 2014150011 | 2017-04-20 | CS | 1 |
| 4 | ew | 男 | 19 | 2014150361 | 2016-06-23 | CS | 2 |
+—–+——–+——+——+————+————+——-+——–+
- INTERSECT交操作:(MySQL中不支持,用and替换)
- 查询一班中年龄小于18岁的人:SELECT * FROM student WHERE Sclass=1 and Sage<18;
+—–+——-+——+——+————+————+——-+——–+
| Sid | Sname | Ssex | Sage | Snumber | entertime | Sdept | Sclass |
+—–+——-+——+——+————+————+——-+——–+
| 3 | nids | 男 | 17 | 2014150561 | 2017-07-14 | CS | 1 |
+—–+——-+——+——+————+————+——-+——–+
- EXCEPT差操作:(MySQL中不支持)
- 查询19岁不是一班的学生:mysql> select * from student where Sage=19 and Sclass<>’1’;
+—–+——-+——+——+————+————+——-+——–+
| Sid | Sname | Ssex | Sage | Snumber | entertime | Sdept | Sclass |
+—–+——-+——+——+————+————+——-+——–+
| 4 | ew | 男 | 19 | 2014150361 | 2016-06-23 | CS | 2 |
+—–+——-+——+——+————+————+——-+——–+
9. 基于派生表的查询:
—–子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成临时派生表成为主查询的查询对象。
—– 查询所有所有学号倒数第三位是5的学生了姓名: select distinct Sname from student ,(select Snumber from student where Snumber like ‘%5__’) as newTable where student.Snumber=newTable.Snumber;
+——-+
| Sname |
+——-+
| nids |
| dsa |
+——-+
其中newTable是给查询结果取的别名;
10.属性的约束条件
- 列值非空:NOT NULL;
- 列值唯一:UNIQUE;
- 检查列值是否满足一个条件表达式:CHECK短语;MySQL好像不能用,可以用enmu来代替:mysql> create table testcheck(
-> id int not null primary key,
-> sex enum(‘男’,’女’),
-> name char );
Query OK, 0 rows affected (0.32 sec)

mysql> desc testcheck;
+——-+—————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+—————–+——+—–+———+——-+
| id | int(11) | NO | PRI | NULL | |
| sex | enum(‘男’,’女’) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
+——-+—————–+——+—–+———+——-+
3 rows in set (0.01 sec)

mysql> insert into testcheck value(1,’dsad’,”f”);
ERROR 1265 (01000): Data truncated for column ‘sex’ at row 1
以上错误显示,对性别的限制起到了作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值