MySQL高级SQL语句

4 篇文章 0 订阅

1.按关键字排序

1.使用ORDER BY语句来实现排序

2.排序可针对一个或多个字段

3.ASC:升序,默认排序方式

4.DESC:降序

6.ORDER BY的语法结构

select column1,column2... from 库名 order by column1,column2,... asc|desc;

mysql> create database tanwenlong;
mysql> create table chengji(xuehao char(10) not null,nianling int(3) not null,xingming char(36) not null,chengji varchar(3) not null);
mysql> insert into chengji values(201001,17,'zhangsan',60),(201002,18,'lisi',70),(201003,19,'wangwu',80),(201004,18,'zhaoliu',88),(201005,17,'lilei',55);

默认升序
mysql> select chengji from chengji order by chengji;
降序
mysql> select chengji from chengji order by chengji desc;
加入条件的排序
mysql> select xingming,chengji from chengji where chengji>=60 order by chengji desc;
多条件的排序
mysql> select * from chengji order by nianling desc,chengji desc;

2.对结果进行分组

1.使用GROUP BY语句来实现分组

2.通常结合聚会函数一起使用

3.可以按一个或多个字段对结果进行分组

4.GROUP BY的语法结构

select column_name,aggregate_function(column_name) from table_name where column_name operator value GROUP BY column_name;

mysql> select count(xingming),chengji from chengji where chengji>=60 group by nianling;
+-----------------+---------+
| count(xingming) | chengji |
+-----------------+---------+
|               1 | 60      |
|               2 | 70      |
|               1 | 80      |
+-----------------+---------+
3 rows in set (0.01 sec)

mysql> select count(xingming),chengji from chengji where chengji>=50 group by nianling order by count(xingming) desc;
+-----------------+---------+
| count(xingming) | chengji |
+-----------------+---------+
|               2 | 70      |
|               2 | 60      |
|               1 | 80      |
+-----------------+---------+
3 rows in set (0.00 sec)

3.限制结果条目LIMIT

1.只返回SELECT查询结果的第一行或前几行

2.使用LIMIT语句限制条目

3.LIMIT语法结构

select column1,column2,... from table_name [offset,] number;

mysql> select * from chengji;
+--------+----------+----------+---------+
| xuehao | nianling | xingming | chengji |
+--------+----------+----------+---------+
| 201001 |       17 | zhangsan | 60      |
| 201002 |       18 | lisi     | 70      |
| 201003 |       19 | wangwu   | 80      |
| 201004 |       18 | zhaoliu  | 88      |
| 201005 |       17 | lilei    | 55      |
| 201006 |       18 | lili     | 90      |
+--------+----------+----------+---------+
6 rows in set (0.00 sec)

前三个
mysql> select * from chengji limit 3;
+--------+----------+----------+---------+
| xuehao | nianling | xingming | chengji |
+--------+----------+----------+---------+
| 201001 |       17 | zhangsan | 60      |
| 201002 |       18 | lisi     | 70      |
| 201003 |       19 | wangwu   | 80      |
+--------+----------+----------+---------+
3 rows in set (0.00 sec)

第一个数字:位置偏移量是从零开始,第二个数字:返回记录行的最大数目
第三到第五
mysql> select * from chengji limit 2,3;
+--------+----------+----------+---------+
| xuehao | nianling | xingming | chengji |
+--------+----------+----------+---------+
| 201003 |       19 | wangwu   | 80      |
| 201004 |       18 | zhaoliu  | 88      |
| 201005 |       17 | lilei    | 55      |
+--------+----------+----------+---------+
3 rows in set (0.00 sec)

4.设置别名

1.使用AS语句设置别名,关键字AS可省略

2.设置别名时,保证不能与库中其他表或字段名称冲突

3.别名的语法结构

select column_name AS alias_name from table_name;
select column_name(s) from table_name AS alias_name;

as 可以省略,表也可以设置别名,结果和上述一样
mysql> select xuehao 学号,nianling 年龄,xingming 姓名,chengji 成绩 from chengji;
mysql> select cj.xuehao 学号,cj.nianling 年龄,cj.xingming 姓名,cj.chengji 成绩 from chengji as cj;

as的用法
mysql> select p.xuehao,p.xingming from chengji as p limit 2;
+--------+----------+
| xuehao | xingming |
+--------+----------+
| 201001 | zhangsan |
| 201002 | lisi     |
+--------+----------+
2 rows in set (0.00 sec)

as作为连接语句,复制用法
mysql> create table abc as select * from chengji;
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from abc;
+--------+----------+----------+---------+
| xuehao | nianling | xingming | chengji |
+--------+----------+----------+---------+
| 201001 |       17 | zhangsan | 60      |
| 201002 |       18 | lisi     | 70      |
| 201003 |       19 | wangwu   | 80      |
| 201004 |       18 | zhaoliu  | 88      |
| 201005 |       17 | lilei    | 55      |
| 201006 |       18 | lili     | 90      |
+--------+----------+----------+---------+
6 rows in set (0.00 sec)

5.通配符

1.用于替换字符串中的部分字符

2.通常配合LIKE一起使用,并协同WHERE完成查询

3.常用通配符

​ %表示零个,一个或多个

​ _表示单个字符

mysql> select xingming,chengji from chengji where xingming like '%n';
+----------+---------+
| xingming | chengji |
+----------+---------+
| zhangsan | 60      |
+----------+---------+
1 row in set (0.00 sec)

mysql> select * from chengji where xingming like 'z%';
mysql> select * from chengji where xingming like 'zhang_an';
mysql> select * from chengji where xingming like 'l_s_';

两者结合
mysql> select * from chengji where xingming like '%sa_';

6.子查询

1.也称作内查询或者嵌套查询

2.先于主查询被执行,其结果将作为外层主查询的条件

3.在增删改查中都可以使用子查询

4.支持多层嵌套

5.IN语句是用来判断某个值是否在给定的结果集中

用法:

mysql> select xuehao as 学号,xingming as 姓名,chengji as 成绩 from chengji where chengji in (select chengji from chengji where chengji>=60);
+--------+----------+--------+
| 学号   | 姓名     | 成绩   |
+--------+----------+--------+
| 201001 | zhangsan | 60     |
| 201002 | lisi     | 70     |
| 201003 | wangwu   | 80     |
| 201004 | zhaoliu  | 88     |
| 201006 | lili     | 90     |
+--------+----------+--------+
5 rows in set (0.00 sec)
降序:
mysql> select xuehao as 学号,xingming as 姓名,chengji as 成绩 from chengji where chengji in (select chengji from chengji where chengji>=60 ) order by chengji desc;

mysql> create table source as select * from chengji;
mysql> delete from source;
mysql> select * from source;
Empty set (0.00 sec)

mysql> insert into source select * from chengji where chengji in (select chengji from chengji where chengji>=80);
mysql> select * from source;
+--------+----------+----------+---------+
| xuehao | nianling | xingming | chengji |
+--------+----------+----------+---------+
| 201003 |       19 | wangwu   | 80      |
| 201004 |       18 | zhaoliu  | 88      |
| 201006 |       18 | lili     | 90      |
+--------+----------+----------+---------+
3 rows in set (0.00 sec)

修改:
mysql> alter table source add column num int(3);	#添加一列num
mysql> desc source;			#查表的结构
mysql> update source set num=101 where chengji in (select chengji from chengji where chengji >=80);
mysql> select * from source;
+--------+----------+----------+---------+------+
| xuehao | nianling | xingming | chengji | num  |
+--------+----------+----------+---------+------+
| 201003 |       19 | wangwu   |      80 |  101 |
| 201004 |       18 | zhaoliu  |      88 |  101 |
| 201006 |       18 | lili     |      90 |  101 |
+--------+----------+----------+---------+------+
3 rows in set (0.00 sec)

mysql> select * from (select * from chengji where chengji>=75)as a;
mysql> select * from (select * from chengji where chengji>=75)a;
mysql> select * from (select * from chengji where chengji>=75)a order by chengji desc;
mysql> delete from chengji where chengji in(select chengji from (select * from chengji where chengji >=75)a);
mysql> select * from chengji;
+--------+----------+----------+---------+
| xuehao | nianling | xingming | chengji |
+--------+----------+----------+---------+
| 201001 |       17 | zhangsan |      60 |
| 201002 |       18 | lisi     |      70 |
| 201005 |       17 | tianqi   |      55 |
+--------+----------+----------+---------+
3 rows in set (0.00 sec)

mysql> insert into source values(201008,18,'zhangsan',89,102);
后面条件为真则执行前面的
mysql> select count(num) from source where exists(select num from source where xingming='zhangsan');

7.NULL值

  • 表示缺失的值
  • 与数字0或者空白(spaces)是不同的
  • 使用IS NULL或IS NOT NULL进行判断

NULL值和空值的区别

  • 空值长度为0,不占空间;NULL值的长度为NULL,占用空间
  • IS NULL无法判断空值
  • 空值使用"=“或者”<>"来处理
  • COUNT () 计算时,NULL会忽略,空值会加入计算

8.正则表达式

1.根据指定的匹配模式匹配记录中符合要求的特殊字符

2.使用REGEXP关键字指定匹配模式

常用匹配模式

字符说明
^匹配开始字符
$匹配结束字符
.匹配任意单个字符
*匹配任意个前面的字符
+匹配前面字符至少1次
p1|p2匹配p1或p2
[…]匹配字符集中括号内的任何字符
[^…]匹配不在括号内的任何字符
{n}匹配前面的字符串n次
{n,m}匹配前面的字符串至少n次,至多m次
mysql> select * from chengji where xingming regexp '^z';		以什么开头
mysql> select * from chengji where xingming regexp 'i$';		以什么结尾
mysql> select * from chengji  where xingming regexp 'zha';		
mysql> select * from chengji where xingming regexp 'zha.gsan';	匹配单个字符
mysql> select * from chengji where xingming regexp '^[z|l]';	以z或l开头
mysql> select * from chengji where xingming regexp '^[^z|l]';	不以z或l开头
mysql> select * from chengji where xingming regexp 'e{3,5}';
mysql> select * from chengji where xingming regexp 'ee*';
mysql> select * from chengji where xingming regexp '^[d-f]';

9.算术运算符

MySQL支持的算术运算符

+加法
-减法
*乘法
/除法
%取余数
mysql> select 2+3,3-1,4*5,5/4,7%3;
+-----+-----+-----+--------+------+
| 2+3 | 3-1 | 4*5 | 5/4    | 7%3  |
+-----+-----+-----+--------+------+
|   5 |   2 |  20 | 1.2500 |    1 |
+-----+-----+-----+--------+------+
1 row in set (0.01 sec)

mysql> create table suanshu as select 2+3,3-1,4*5,5/4,7%3;
mysql> desc suanshu;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| 2+3   | int(3)       | NO   |     | 0       |       |
| 3-1   | int(3)       | NO   |     | 0       |       |
| 4*5   | int(3)       | NO   |     | 0       |       |
| 5/4   | decimal(5,4) | YES  |     | NULL    |       |
| 7%3   | int(1)       | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

10.逻辑运算符

1.又称为布尔运算符

2.用来判断表达式的真假

3.常用的逻辑运算符

运算符说明
NOT或!逻辑非
AND或&&逻辑与
OR或||逻辑或
XOR逻辑异或

10.1.逻辑非

mysql> select not 2,!3,not 0,!(4-4);
+-------+----+-------+--------+
| not 2 | !3 | not 0 | !(4-4) |
+-------+----+-------+--------+
|     0 |  0 |     1 |      1 |
+-------+----+-------+--------+
1 row in set (0.00 sec)

10.2.逻辑或

mysql> select 2 and 3,4 && 0,0 && NULL,1 and NULL;
+---------+--------+-----------+------------+
| 2 and 3 | 4 && 0 | 0 && NULL | 1 and NULL |
+---------+--------+-----------+------------+
|       1 |      0 |         0 |       NULL |
+---------+--------+-----------+------------+
1 row in set (0.00 sec)

11.位运算符

1.对二进制进行计算的运算符

2.常用的位运算符

运算符说明
&按位与
|按位或
~按位取反
^按位异或
<<按位左移
>>按位右移
mysql> select 4&5,4|5,4&~3,3^4,2<<2,2>>1;
+-----+-----+------+-----+------+------+
| 4&5 | 4|5 | 4&~3 | 3^4 | 2<<2 | 2>>1 |
+-----+-----+------+-----+------+------+
|   4 |   5 |    4 |   7 |    8 |    1 |
+-----+-----+------+-----+------+------+
1 row in set (0.00 sec)

12.MySQL数据库函数

MySQL数据库函数
常用的函数分类

常用的数学函数

abs(x) 返回x的绝对值
rand() 返回0到1的随机数
mod(x,y)返回x除以y以后的余数
power(x,y)返回x的y次方
round(x)返回离x最近的整数
round(x,y)保留x的y位小数四舍五入的值
sqrt(x)返回x的平方根
truncate(x,y) 返回数字x截断为y位小数的值
ceil(x)返回大于或等于x的最小整数
floor(x)返回小于等于x的最大整数
greatest(x1,x2…)返回集合中最大的值
least(x1,x2…)返回集合中最小的值

常用的聚合函数

avg()返回指定列的平均值
count()返回指定列中非NULL值的个数
min()返回指定列的最小值
max()返回指定列的最大值
sum()返回指定列的所有值之和

常用的字符串函数

length(x)返回字符串x的长度
trim()返回去除指定格式的值
concat(x,y)将提供的参数x和y拼接成一个字符串
upper(x)将字符串x的所有字母变成大写字母
lower(x)将字符串x的所有字母变成小写字母
left(x,y)返回字符串x 的前y个字符
right(x,y)返回字符串x的后y个字符
repeat(x,y)将字符串x重复y次
space(x)返回x个空格
replace(x,y,z)将字符串z替代字符串x中的y字符串
strcmp(x,y)比较x和y,返回的值可以为-1,0,1
substring(x,y,z)获取从字符串x中的第y个位置开始长度为z的字符串
reverse(x)将字符串x反转

常用的日期时间函数

curdate()返回当前时间的年月日
curtime()返回当前时间的时分秒
now()返回当前时间的日期和时间
month(x)返回日期x中的月份值
week(x)返回日期x是年度第几个星期
hour(x)返回x中的小时值
minute(x)返回x中的分钟值
second(x)返回s中的秒钟值
dayofweek(x)返回x是星期几,1是星期日,2是星期一
dayofmonth(x)计算日期x是本月的第几天
dayofyear(x)计算日期x是本年的第几天

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值