发表于: 2018-09-09 23:24:53

1 429


今天完成的事情

1.重新学习了下sql的查询

1.1简单的查询

先创两张表,一张是学生基本信息表,一张是学生成绩表


1.1.1插入数据



最终的结果是这样的:

1.1.2常用操作

#去除单列重复结果

select distinct 列名 from 表名

#去除多列重复结果

delect distinct 列名1,列名2,...列名n from 表名;

#限制查询结果条数

limit 开始行,限制条数 (开始行是从0开始的,开始行不写默认为0)

#对查询结果进行排序

order by 列名 asc|desc (asc是升序,desc是降序,默认是升序的)

#按照多个列的值进行排序

order by 列名1 asc|desc,列名2 asc|desc;

order by和limit可以结合使用,并且order要放在前面

----------------------------------------------------------

############################过滤数据###################################

#简单搜索条件

where 后面加条件,条件操作符号又如下几种

等于 =

不等 !=

小于 <

不大于 <=

大于 >

不小于 >=

处于某个范围 between (例如:a处于b和c之间,a between b and c)

不处于某个范围 not between (例如a不处于b和c之间,a not between b and c)

#多值匹配

包含

where 某列 in (值1,值2);

不包含

where 某列 not in (值1,值2);

#NULL值检查

a is NULL a值为NULL;

a is not NULL a值不为NULL;

ps:这里判断是否为NULL不能用'='来判断

#多个搜索条件

条件与:

条件a and 条件b

条件或:

条件a or 条件b

当and和or同时使用时,注意and的优先级比or高,可以结合()来写查询逻辑

#通配符

模糊查询:

like: a like b (a匹配b)

not like:a not like b (a不匹配b)

模糊查询需要用到通配符,常用通配符如下:

% 表示任意一个字符串

_ 表示任意一个字符

\_ 转意通配符,将_转意成普通的字符串

--------------------------------------------------------------------

#########################表达式和函数##############################

#文本处理函数

left('abc123',3)    abc

right('abc123',3)    123

length('abc')    3

lower('ABC')    abc

upper('abc')    ABC

ltrim(' abc')   abc   将左边的空格去掉返回字符串

rtrim('abc ')    abc 将右边的空格去掉返回字符串

substring('abc123',2,3) bc1 返回指定的字符串从指定位置截取指定长度的子串

concat('abc','123','xyz') abc123xyz 将给定的各个字符串参数拼接成一个新的字符串

#日期和时间处理函数

now() 当前日期和时间

curdate() 返回当前日期

date('2018-02-28 09:24:10') 将给定的时间值得日期提取出来

date_add('时间','时间间隔') 给日期添加指定的时间间隔 

date_sub('时间’,'时间间隔') 给日期减少指定的时间间隔

datediff('time1','time2') 返回两个日期之间的天数

date_format('time','%m-%d-%Y) 将指定的时间转换成特定格式

#数学处理函数

abs(-1) 1 返回绝对值

pi() 3.141593 返回圆周率

cos() 余弦值

exp(1) 返回e的指定次方

mod(5,2) 1 取余数

rand() 返回一个随机数

sin() 正弦值

sqrt(9) 3 返回一个数的平方根

tan() 返回正切值

#聚集函数

count(column1) 返回一共有几列,忽略null的列,count(*)不会忽略null的列

max() 返回某列的最大值

min() 返回某列的最小值

sum() 返回某一列值之和

avg() 返回某一列得平均值

#分组

group by 列名

eg:select subject,avg(score) from student_info group by subject;

ps:非分组列不能出现在查询语句中

带有where字句的分组

select subject,avg(score) from student_score where score >=60 group by subject;

having max(score) > 98 过滤分组后的数据

分组注意的地方:

如果分组列中含有NULL,那么NULL也会作为一个独立的分组存在

如果查询语句中存在where字句之后,order by子句必须出现在where字句之后

非分组列不能单独出现在检索列表中(可以被放到聚集函数中)。

GROUP BY子句后也可以跟随表达式(但不能是聚集函数)。

查询子句的顺序要严格按下面顺序执行:

SELECT [DISTINCT] 查询列表

[FROM 表名]

[WHERE 布尔表达式]

[GROUP BY 分组列表 [HAVING 分组过滤条件] ]

[ORDER BY 排序列表]

[LIMIT 开始行, 限制条数]

-------------------------------------------------------------------

####################################标量子查询#######################

A查询语句作为B查询语句的条件,A查询语句为子查询

#in和not in子查询

子查询的查询结果有多个,要用in子查询,not in子查询用法也一样

select * from student_info where number in (select number from student_info where major in ='计算机学'

#exits和not exists

exists(select ...)当子查询有结果时表达式为真

not exists(select ...)当子查询没有结果时表达式为真

#相关子查询

select number,name,id_number,major from student_info where exists (select * from student_score where student_score.number = student_info.number)

#对同一个表的子查询

查询一个表中有哪些列大于平均值,下面这样写是错误的:

select * from student_score where subject = '母猪的产后护理' and score > avg(score);

聚合函数avg(score)不能用在where后面,应该用子查询:

select * from student_score where subject = '母猪的产后护理' and score >(select avg(score) from student_score where subject = '母猪的产后护理');

--------------------------------------------------------------------

##################################连接查询#############################

先简单建两个表:

表1:create table t1 (m1 int,n1 char(1));

插入数据:INSERT INTO t1 VALUES(1, 'a'), (2, 'b'), (3, 'c');

表2:create table t2 (m2 int, n2 char(1));

插入数据:INSERT INTO t2 VALUES(2, 'b'), (3, 'c'), (4, 'd');

当执行select * from t1,t2;返回9个值笛尔卡积

#内连接 inner join

select * from t1 inner join t2 where t1.m1 = t2.m2;

外连接:即使某条记录在另一个表中没有任意一条记录与它相匹配,它也能被加入结果集中的连接查询被称为外连接

#左外连接

select 查询列表 from 表1 left join 表2 on 连接条件

保留表1的值,即使没有匹配,而表2的值只有匹配的才能输出

#右外连接

与左外连接的概念相似

外连接的注意事项:

1.外连接不能用where作为查询连接,要用on

2.有普通搜索条件优先级别更高

-----------------------------------------------------------

############################组合查询#########################

多个查询语句可以用union合并起来

union all 多张表查询,重复也列出来,union默认把重复的行合并

#对组合查询进行排序

select m1,n1 from t1 union select m2, n2 from t2 order by m1 desc

注意不能单个用order by

合并查询注意事项:

1.被合并的各个查询的对象个数必须相同

select m1 from t1 union select m2,n2 from t2;这样会报错

2.查询的结果集中显示的列名将以第一个查询中的列名为准

3.各个查询语句中的查询列表的类型兼容就可以(也就是说不必完全相同)。


【参考资料】http://mp.weixin.qq.com/mp/homepage?__biz=MzIxNTQ3NDMzMw==&hid=1&sn=30e3ee8b9f6b3bb3b15ee8981b78903a&scene=18#wechat_redirect

明天计划的事情

1.上面的格式只是简单地做了个记录,官网这里的编辑器太垃圾了,明天或许会整理下上面的内容发到简书上面去。

2.继续学一下权限管理这一块。

遇到的问题

暂无

收获

如上


返回列表 返回列表
评论

    分享到