SQL语言 单表查询[第一篇]

情韵
2021-04-19 / 0 评论 / 25 阅读 / 正在检测是否收录...

来梳理一下最近学的SQL语言的单表查询

首先,我们先建立一张表

create table stu(
    cno varchar(6) ,
    cname varchar(10) ,
    age int,
    mno int,
);

然后给表图传入数据:

insert into stu values
('311901','pink',12,3),
('311902','blue',11,2),
('311903','reds',19,1),
('311904','time',18,4),
('311903','reds',19,1);

表图如下:

cnocnameagemno
311901pink123
311902blue112
311903reds191
311904time184
311903reds191

1.查询全部学生的全部信息

select * from stu;

其中 * 代表表中所有的信息

全部信息

2.查询全部学生的学号cno 和 cname

select cno,cname from stu;

biao1.png

3.查询全部学生的姓名和出生年份

select cname,age from stu;

biao2.png

我们发现这样查询只能查询到年纪,却查不到出生年份,我们可以换一种写法:

select cname,2021-age from stu;

biao3.png

这样虽然能看到年份了,不过这时列明变成了(无列名)

我们可以通过 as 把列明加上

select cname,2021-age as year from stu;

biao4.png

4.查询全部学生学号通过 distinct 去重

select distinct cno from  stu;

biao5.png

5.查询姓名是'reds'的学生的全部信息

select * from stu where cname = 'reds';

biao6.png

利用 where = 'reds' 条件查询

6.查询课号是1且学生年龄大于18的学生学号 like或者=

select cno from stu where mno = 1 and age > 18;

biao7.png

这里还是通过where条件筛选, 其中 mno = 1 也可以写成 mno like 1

另外在SQL中,一些比较符号和我们数学运用的都差不多的,比如:

!=  不等于
<> 这个也是不等于
其余的都差不多吧
如果like后面的字符串,不含有通配符(%,_ 用于模糊查询) 那么=等价于like

7. 查询年龄在18-19的学生姓名 两种写法

第一种写法:

select cname from stu where age >= 18 and age <= 19;

第二种写法:

select cname from stu where age between 18 and 19;

结合两种表,估计你们能看得出 between ... and ... 代表什么意思吧。。

one.png

8.查询学生专业号是 1 ,4 的学生信息 (利用in)

如果不用in写法:

select * from stu where mno = 1 or mno = 4;
或者写成
select * from stu where mno != 2 or mno != 3;

利用in写法:

select * from stu where mno in(1,4);

in.png

如果查询不是1,4的in写法就为 not in(1,4):

select * from stu where mno not in(1,4);

**9.查询姓名中姓 p 的人 (尴尬,原来想着英文名字省事,不过一样也可以查询 )

select * from stu where cname like 'p%';

p.png

这里的%代表p后面一堆字符串,可以是一个字符串,也可以是一堆字符串,甚至可以代表 无字符串

上面我们有说过,_特使一种通配符,不过_只能代表一个字符。而且还不能省略。

10.查询学号为NULL的学生信息

插入一条为NULL的数据

insert into stu values('311909','lele',10,null);

two.png

接下查询mno为null的值:

select * from stu where mno is null;

这里是不能用=的,应该用is。

不想知道为什么的,可以记下来就可以退出了,想知道为什么的请看下面部分:

那这是为什么呢?要清楚为什么,就需要了解 SQL 中的三值逻辑了。

--------TURE, FALSE , UNKNOWN---------
在SQL中逻辑表达式的可能值包括TRUE、FALSE和UNKNOWN,它们被称之为三值逻辑。

在其它的编程语言中,逻辑表达式只有两种,要么是true,要么就是false。

而在 SQL 中却存在第三个逻辑表达式UnKnown,这个是 SQL 中特有的。

从字面意思上我们可以解理该值的意思是:什么都不知道,即什么都不是。

一般情况下我们将任何值(包括NULL本身)与NULL做比较的时候,都会返回UnKnown。包括 null = null, null <> null 都会返回false!
而在查询表达式中(比如where与having中),UnKnown会视为false。所以我们就明白了为什么 select * from tablename where fieldname=null 查不到正确的结果的原因了。


但并不是在所有场情下UnKnown都会视为false来处理, 在check约束中,UnKnown就会视为true来处理 。这就是为什么我们设置某个字段的值必须大于等于0的情况下,我们还可以往该字段中插入Null值,那是因为在check约束中null>=0的逻辑结果UnKnown会被当作true来处理。

**需要注意的是,在分组子句与排序子句中,sql视null是相等的
即:
1, GROUP BY会把所有NULL值分到一组。
2,ORDER BY会把所有NULL值排列在一起。**

2

评论 (0)

取消