瞧这里,没有比这更全的!mysql高阶语句介绍汇总!(查询、正则表达式、运算符、连接查询、函数、存储过程)

本文详细介绍了MySQL中的高级查询技巧,包括排序、区间判断、去重、分组、限制结果、别名、通配符、子查询、视图创建和数据修改。同时讲解了正则表达式和各种运算符的使用,如算术、比较、逻辑和位运算。此外,还涵盖了连接查询的内连接、左连接和右连接,以及日期时间函数和存储过程的概念、创建与调用。通过对这些内容的掌握,可以帮助开发者更高效地管理和操作数据库。
摘要由CSDN通过智能技术生成

一.常用查询类

1.按关键字排序

使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来,如果对查询的结果进行排序,可以使用 ORDER BY 语句来对语句实现排序,并最终将排序后的结果返回给用户。这个语句的排序不光可以针对某一个字段,也可以针对多个字段

ASC 是按照升序进行排序的,是默认的排序方式,即 ASC 可以省略。SELECT 语句中如果没有指定具体的排序方式,则默认按 ASC方式进行排序。
DESC 是按降序方式进 行排列。当然 ORDER BY 前面也可以使用 WHERE 子句对查询结果进一步过滤。

按分数排序,默认不指定是升序排列

mysql> select id,name,score from info order by score;
+------+-----------+-------+
| id   | name      | score |
+------+-----------+-------+
|    6 | hanmeimei | 10.00 |
|    7 | lilei     | 11.00 |
|    3 | lisi      | 60.00 |
|    1 | liuyi     | 80.00 |
|    2 | wangwu    | 90.00 |
|    5 | jiaoshou  | 98.00 |
|    4 | tianqi    | 99.00 |
+------+-----------+-------+
7 rows in set (0.00 sec)

分数按降序排列

mysql> select id,name,score from info order by score desc;
+------+-----------+-------+
| id   | name      | score |
+------+-----------+-------+
|    4 | tianqi    | 99.00 |
|    5 | jiaoshou  | 98.00 |
|    2 | wangwu    | 90.00 |
|    1 | liuyi     | 80.00 |
|    3 | lisi      | 60.00 |
|    7 | lilei     | 11.00 |
|    6 | hanmeimei | 10.00 |
+------+-----------+-------+
7 rows in set (0.00 sec)

drder by 结合 where使用,order by 结合where使用

mysql> select name,score from info where address='nanjing' order by score desc; 	#order by 结合where使用
+-----------+-------+
| name      | score |
+-----------+-------+
| lilei     | 11.00 |
| hanmeimei | 10.00 |
+-----------+-------+
2 rows in set (0.00 sec)

drder by 结合多字段,查询学生信息先按兴趣id降序排列,相同分数的,id也按降序排列

mysql> select id,name,hobbid from info order by hobbid desc,id desc;	
+------+-----------+--------+
| id   | name      | hobbid |
+------+-----------+--------+
|    7 | lilei     |      5 |
|    4 | tianqi    |      5 |
|    3 | lisi      |      4 |
|    6 | hanmeimei |      3 |
|    5 | jiaoshou  |      3 |
|    2 | wangwu    |      2 |
|    1 | liuyi     |      2 |
+------+-----------+--------+
7 rows in set (0.00 sec)

查询学生信息先按兴趣id降序排列,相同分数的,id按升序排列

mysql> select id,name,hobbid from info order by hobbid desc,id;						

+------+-----------+--------+
| id   | name      | hobbid |
+------+-----------+--------+
|    4 | tianqi    |      5 |
|    7 | lilei     |      5 |
|    3 | lisi      |      4 |
|    5 | jiaoshou  |      3 |
|    6 | hanmeimei |      3 |
|    1 | liuyi     |      2 |
|    2 | wangwu    |      2 |
+------+-----------+--------+
7 rows in set (0.01 sec)

说明:
ORDER BY 语句可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,ORDER BY 后面跟多个字段时,字段之间使用英文逗号隔开,优先级是按先后顺序而定,但order by 之后的第一个参数只有在出现相同值时,第二个字段才有意义。

2.区间判断及查询不重复记录

(1)AND/OR ——且/或

mysql>  select * from info where score >70 and score <=90;
+------+--------+-------+------------+--------+
| id   | name   | score | address    | hobbid |
+------+--------+-------+------------+--------+
|    1 | liuyi  | 80.00 | beijing    |      2 |
|    2 | wangwu | 90.00 | shengzheng |      2 |
+------+--------+-------+------------+--------+
2 rows in set (0.00 sec)

mysql> select * from info where score >70 or score <=90;
+------+-----------+-------+------------+--------+
| id   | name      | score | address    | hobbid |
+------+-----------+-------+------------+--------+
|    6 | hanmeimei | 10.00 | nanjing    |      3 |
|    5 | jiaoshou  | 98.00 | laowo      |      3 |
|    7 | lilei     | 11.00 | nanjing    |      5 |
|    3 | lisi      | 60.00 | shanghai   |      4 |
|    1 | liuyi     | 80.00 | beijing    |      2 |
|    4 | tianqi    | 99.00 | hangzhou   |      5 |
|    2 | wangwu    | 90.00 | shengzheng |      2 |
+------+-----------+-------+------------+--------+
7 rows in set (0.00 sec)

mysql> select * from info where score >70 or (score >75 and score <90);			#嵌套多个条件
+------+----------+-------+------------+--------+
| id   | name     | score | address    | hobbid |
+------+----------+-------+------------+--------+
|    5 | jiaoshou | 98.00 | laowo      |      3 |
|    1 | liuyi    | 80.00 | beijing    |      2 |
|    4 | tianqi   | 99.00 | hangzhou   |      5 |
|    2 | wangwu   | 90.00 | shengzheng |      2 |
+------+----------+-------+------------+--------+
4 rows in set (0.00 sec)

(2)distinct 查询不重复记录

语法:

select distinct 字段 from 表名﹔

mysql> select distinct hobbid from info;
+--------+
| hobbid |
+--------+
|      3 |
|      5 |
|      4 |
|      2 |
+--------+
4 rows in set (0.00 sec)

3.对结果进行分组

通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现 ,GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。

语法
SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator valueGROUP BY column_name;

按hobbid相同的分组,计算相同分数的学生个数(基于name个数进行计数)

mysql> select count(name),hobbid from info group by hobbid;
+-------------+--------+
| count(name) | hobbid |
+-------------+--------+
|           2 |      2 |
|           2 |      3 |
|           1 |      4 |
|           2 |      5 |
+-------------+--------+
4 rows in set (0.00 sec)

结合where语句,筛选分数大于等于80的分组,计算学生个数

mysql> select count(name),hobbid from info where score>=80 group by hobbid;
+-------------+--------+
| count(name) | hobbid |
+-------------+--------+
|           2 |      2 |
|           1 |      3 |
|           1 |      5 |
+-------------+--------+
3 rows in set (0.00 sec)

结合order by把计算出的学生个数按升序排列

mysql> select count(name),score,hobbid from info where score>=80 group by hobbid order by count(name) asc;
+-------------+-------+--------+
| count(name) | score | hobbid |
+-------------+-------+--------+
|           1 | 98.00 |      3 |
|           1 | 99.00 |      5 |
|           2 | 80.00 |      2 |
+-------------+-------+--------+
3 rows in set (0.00 sec)

4.限制结果条目limit

limit 限制输出的结果记录
在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录(行)。有时候仅 需要返回第一行或者前几行,这时候就需要用到 LIMIT 子句

语法
SELECT column1, column2, … FROM table_name LIMIT [offset,] number

LIMIT 的第一个参数是位置偏移量(可选参数),是设置 MySQL 从哪一行开始显示。 如果不设定第一个参数,将会从表中的第一条记录开始显示。需要注意的是,第一条记录的 位置偏移量是 0,第二条是 1,以此类推。第二个参数是设置返回记录行的最大数目。

查询所有信息显示前4行记录

mysql> select * from info limit 3;
+------+-----------+-------+---------+--------+
| id   | name      | score | address | hobbid |
+------+-----------+-------+---------+--------+
|    6 | hanmeimei | 10.00 | nanjing |      3 |
|    5 | jiaoshou  | 98.00 | laowo   |      3 |
|    7 | lilei     | 11.00 | nanjing |      5 |
+------+-----------+-------+---------+--------+
3 rows in set (0.00 sec)

从第4行开始,往后显示3行内容

mysql> select * from info limit 3,3;
+------+--------+-------+----------+--------+
| id   | name   | score | address  | hobbid |
+------+--------+-------+----------+--------+
|    3 | lisi   | 60.00 | shanghai |      4 |
|    1 | liuyi  | 80.00 | beijing  |      2 |
|    4 | tianqi | 99.00 | hangzhou |      5 |
+------+--------+-------+----------+--------+
3 rows in set (0.00 sec)

结合order by语句,按id的大小升序排列显示前三行

mysql> select id,name from info order by id limit 3;
+------+--------+
| id   | name   |
+------+--------+
|    1 | liuyi  |
|    2 | wangwu |
|    3 | lisi   |
+------+--------+
3 rows in set (0.00 sec)

输出最后三行

mysql> select id,name from info order by id desc limit 3;
+------+-----------+
| id   | name      |
+------+-----------+
|    7 | lilei     |
|    6 | hanmeimei |
|    5 | jiaoshou  |
+------+-----------+
3 rows in set (0.00 sec)

5.设置别名alise、as

在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者 多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性

语法
对于列的别名:SELECT column_name AS alias_name FROM table_name;
对于表的别名:SELECT column_name(s) FROM table_name AS alias_name;

在使用 AS 后,可以用 alias_name 代替 table_name,其中 AS 语句是可选的。AS 之后的别名,主要是为表内的列或者表提供临时的名称,在查询过程中使用,库内实际的表名 或字段名是不会被改变的

select name as 姓名,score as 成绩 from info;

mysql> select i.name as 姓名,i.score as 成绩 from info as i;
+-----------+--------+
| 姓名      | 成绩   |
+-----------+--------+
| hanmeimei |  10.00 |
| jiaoshou  |  98.00 |
| lilei     |  11.00 |
| lisi      |  60.00 |
| liuyi     |  80.00 |
| tianqi    |  99.00 |
| wangwu    |  90.00 |
+-----------+--------+
7 rows in set (0.00 sec)

查询info表的字段数量,以number显示

mysql> select count(*) as number from info;
+--------+
| number |
+--------+
|      7 |
+--------+
1 row in set (0.00 sec)

mysql> select count(*) number from info; 			#as可以省略
+--------+
| number |
+--------+
|      7 |
+--------+
1 row in set (0.00 sec)

如果表的长度比较长,可以使用 AS 给表设置别名,在查询的过程中直接使用别名
设置表info的别名为i

mysql> select i.name as 姓名,i.score as 成绩 from info as i;
+-----------+--------+
| 姓名      | 成绩   |
+-----------+--------+
| hanmeimei |  10.00 |
| jiaoshou  |  98.00 |
| lilei     |  11.00 |
| lisi      |  60.00 |
| liuyi     |  80.00 |
| tianqi    |  99.00 |
| wangwu    |  90.00 |
+-----------+--------+
7 rows in set (0.00 sec)

使用场景:
1.对复杂的表进行查询的时候,别名可以缩短查询语句的长度
2.多表相连查询的时候(通俗易懂、减短sql语句)

此外,AS 还可以作为连接语句的操作符。
创建t1表,将info表的查询记录全部插入t1表

mysql> create table t1 as select * from info;
Query OK, 7 rows affected (0.01 sec)
Records: 7  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------+-----------+-------+------------+--------+
| id   | name      | score | address    | hobbid |
+------+-----------+-------+------------+--------+
|    6 | hanmeimei | 10.00 | nanjing    |      3 |
|    5 | jiaoshou  | 98.00 | laowo      |      3 |
|    7 | lilei     | 11.00 | nanjing    |      5 |
|    3 | lisi      | 60.00 | shanghai   |      4 |
|    1 | liuyi     | 80.00 | beijing    |      2 |
|    4 | tianqi    | 99.00 | hangzhou   |      5 |
|    2 | wangwu    | 90.00 | shengzheng |      2 |
+------+-----------+-------+------------+--------+
7 rows in set (0.00 sec)

此处AS起到的作用:
1.创建了一个新表t1 并定义表结构,插入表数据(与info表相同)
2.但是”约束“没有被完全”复制“过来 ,如果原表设置了主键,那么附表的:default字段会默认设置一个0

说明:
在为表设置别名时,要保证别名不能与数据库中的其他表的名称冲突。
列的别名是在结果中有显示的,而表的别名在结果中没有显示,只在执行查询时使用。

6.通配符

通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。

通常通配符都是跟 LIKE 一起使用的,并协同 WHERE 子句共同来完成查询任务。常用的通配符有两个,分别是:

%:百分号表示零个、一个或多个字符
_:下划线表示单个字符

查询名字是l开头的记录

mysql> select id,name from info where name like 'l%';
+------+-------+
| id   | name  |
+------+-------+
|    7 | lilei |
|    3 | lisi  |
|    1 | liuyi |
+------+-------+
3 rows in set (0.00 sec)

查询名字里是l和l,l和i中间有一个字符的记录

mysql> select id,name from info where name like 'l_l_i';
+------+-------+
| id   | name  |
+------+-------+
|    7 | lilei |
+------+-------+
1 row in set (0.00 sec)

查询名字中间有i的记录

mysql> select id,name from info where name like '%i%';
+------+-----------+
| id   | name      |
+------+-----------+
|    6 | hanmeimei |
|    5 | jiaoshou  |
|    7 | lilei     |
|    3 | lisi      |
|    1 | liuyi     |
|    4 | tianqi    |
+------+-----------+
6 rows in set (0.00 sec)

查询li后面3个字符的名字记录

mysql> select id,name from info where name like 'li___';
+------+-------+
| id   | name  |
+------+-------+
|    7 | lilei |
|    1 | liuyi |
+------+-------+
2 rows in set (0.00 sec)

通配符“%”和“_”不仅可以单独使用,也可以组合使用
查询名字以s开头且后面至少有一位的记录,

mysql> select id,name from info where name like 'l%_';
+------+-------+
| id   | name  |
+------+-------+
|    7 | lilei |
|    3 | lisi  |
|    1 | liuyi |
+------+-------+
3 rows in set (0.00 sec)

7.子查询

子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。
PS: 子语句可以与主语句所查询的表相同,也可以是不同表
(1)相同表示例:
select name,score from info where id in (select id from info where score >80);
以上
主语句:select name,score from info where id
子语句(集合): select id from info where score >80

select name,score from info where id in (select id from info where score >80);

mysql> select name,score from info where id in (select id from info where score >80);
+----------+-------+
| name     | score |
+----------+-------+
| jiaoshou | 98.00 |
| tianqi   | 99.00 |
| wangwu   | 90.00 |
+----------+-------+
3 rows in set (0.01 sec)

(2)不同表多表示例

mysql> select * from ttt;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

mysql> select id,name,score from info where id in (select * from ttt);
+------+--------+-------+
| id   | name   | score |
+------+--------+-------+
|    3 | lisi   | 60.00 |
|    1 | liuyi  | 80.00 |
|    2 | wangwu | 90.00 |
+------+--------+-------+
3 rows in set (0.00 sec)

(3)多层嵌套
子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。

语法
IN 用来判断某个值是否在给定的结果集中,通常结合子查询来使用

语法:
<表达式> [NOT] IN <子查询>

当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE。 若启用了 NOT 关键字,则返回值相反。需要注意的是,子查询只能返回一列数据,如果需 求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。 多数情况下,子查询都是与 SELECT 语句一起使用的

查询分数大于80的记录

mysql> select name,score from info where id in (select id from info where score>80);
+----------+-------+
| name     | score |
+----------+-------+
| jiaoshou | 98.00 |
| tianqi   | 99.00 |
| wangwu   | 90.00 |
+----------+-------+
3 rows in set (0.00 sec)

子查询还可以用在 INSERT 语句中。子查询的结果集可以通过 INSERT 语句插入到其 他的表中

将t1里的记录全部删除,重新插入info表的记录

mysql> insert into t1 select * from info where id in (select id from info);
Query OK, 7 rows affected (0.01 sec)
Records: 7  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------+-----------+-------+------------+--------+
| id   | name      | score | address    | hobbid |
+------+-----------+-------+------------+--------+
|    6 | hanmeimei | 10.00 | nanjing    |      3 |
|    5 | jiaoshou  | 98.00 | laowo      |      3 |
|    7 | lilei     | 11.00 | nanjing    |      5 |
|    3 | lisi      | 60.00 | shanghai   |      4 |
|    1 | liuyi     | 80.00 | beijing    |      2 |
|    4 | tianqi    | 99.00 | hangzhou   |      5 |
|    2 | wangwu    | 90.00 | shengzheng |      2 |
+------+-----------+-------+------------+--------+
7 rows in set (0.00 sec)

UPDATE 语句也可以使用子查询。UPDATE 内的子查询,在 set 更新内容时,可以是单独的一列,也可以是多列。

将wangwu的分数改为50

mysql> update info set score=50 where id in (select * from ttt where id=2);
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from info;
+------+-----------+-------+------------+--------+
| id   | name      | score | address    | hobbid |
+------+-----------+-------+------------+--------+
|    6 | hanmeimei | 10.00 | nanjing    |      3 |
|    5 | jiaoshou  | 98.00 | laowo      |      3 |
|    7 | lilei     | 11.00 | nanjing    |      5 |
|    3 | lisi      | 60.00 | shanghai   |      4 |
|    1 | liuyi     | 80.00 | beijing    |      2 |
|    4 | tianqi    | 99.00 | hangzhou   |      5 |
|    2 | wangwu    | 50.00 | shengzheng |      2 |
+------+-----------+-------+------------+--------+
7 rows in set (0.00 sec)

mysql>

将ttt表中id>1的id除外的其他id对应的分数修改成100分

mysql> update info set score=100 where id not in (select * from ttt where id >1);
Query OK, 5 rows affected (0.00 sec)
Rows matched: 5  Changed: 5  Warnings: 0

mysql> select * from info;                                                      
+------+-----------+--------+------------+--------+
| id   | name      | score  | address    | hobbid |
+------+-----------+--------+------------+--------+
|    6 | hanmeimei | 100.00 | nanjing    |      3 |
|    5 | jiaoshou  | 100.00 | laowo      |      3 |
|    7 | lilei     | 100.00 | nanjing    |      5 |
|    3 | lisi      |  60.00 | shanghai   |      4 |
|    1 | liuyi     | 100.00 | beijing    |      2 |
|    4 | tianqi    | 100.00 | hangzhou   |      5 |
|    2 | wangwu    |  50.00 | shengzheng |      2 |
+------+-----------+--------+------------+--------+
7 rows in set (0.00 sec)

DELETE 也适用于子查询
删除分数大于80的记录

mysql> delete from t1 where id in (select id where score>80);
Query OK, 3 rows affected (0.01 sec)

mysql> select * from t1;
+------+-----------+-------+----------+--------+
| id   | name      | score | address  | hobbid |
+------+-----------+-------+----------+--------+
|    6 | hanmeimei | 10.00 | nanjing  |      3 |
|    7 | lilei     | 11.00 | nanjing  |      5 |
|    3 | lisi      | 60.00 | shanghai |      4 |
|    1 | liuyi     | 80.00 | beijing  |      2 |
+------+-----------+-------+----------+--------+
4 rows in set (0.00 sec)

mysql>

EXISTS 这个关键字在子查询时,主要用于判断子查询的结果集是否为空。如果不为空, 则返回 TRUE;反之,则返回 FALSE

查询如果存在分数等于80的记录则计算info的字段数
查询如果存在分数等于100的记录则计算info的字段数

mysql> select * from info;
+------+-----------+--------+------------+--------+
| id   | name      | score  | address    | hobbid |
+------+-----------+--------+------------+--------+
|    6 | hanmeimei | 100.00 | nanjing    |      3 |
|    5 | jiaoshou  | 100.00 | laowo      |      3 |
|    7 | lilei     | 100.00 | nanjing    |      5 |
|    3 | lisi      |  60.00 | shanghai   |      4 |
|    1 | liuyi     | 100.00 | beijing    |      2 |
|    4 | tianqi    | 100.00 | hangzhou   |      5 |
|    2 | wangwu    |  50.00 | shengzheng |      2 |
+------+-----------+--------+------------+--------+
7 rows in set (0.00 sec)

mysql> select count(*) from info where exists(select id from info where score=80);
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from info where exists(select id from info where score=100);
+----------+
| count(*) |
+----------+
|        7 |
+----------+
1 row in set (0.00 sec)

子查询,别名as
select a.id from (select id,name from info) a;
相当于
select info.id,name from info;
select 表.字段,字段 from 表;

从info表中的id和name字段的内容做为"内容" 输出id的部分

mysql> select id from (select id,name from info);				#这个格式不可以会报错
ERROR 1248 (42000): Every derived table must have its own alias

mysql> select a.id from (select id,name from info) a;
+------+
| id   |
+------+
|    6 |
|    5 |
|    7 |
|    3 |
|    1 |
|    4 |
|    2 |
+------+
7 rows in set (0.00 sec)

8.视图

数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了映射

(1)作用场景

针对不同的人(权限身份),提供不同结果集的“表”(以表格的形式展示)

(2)作用范围:

select * from info; #展示的部分是info表
select * from view_name; #展示的一张或多张表

(3)功能:

简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性
本质而言视图是一种select(结果集的呈现)
视图适合于多表连接浏览时使用!不适合增、删、改
而存储过程适合于使用较频繁的SQL语句,这样可以提高执行效率!

(4)视图和表的区别和联系

区别:
① 视图是已经编译好的sql语句。而表不是

② 视图没有实际的物理记录。而表有。
show table status\G

③ 表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改

④ 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。

⑤ 表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。

⑥ 视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的)

联系:
视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。

(5)视图的创建和数据修改

① 单表创建视图

满足80分的学生展示在视图中

mysql> create view view_score as select * from info where score>=80;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from view_score;
+------+-----------+--------+----------+--------+
| id   | name      | score  | address  | hobbid |
+------+-----------+--------+----------+--------+
|    6 | hanmeimei | 100.00 | nanjing  |      3 |
|    5 | jiaoshou  | 100.00 | laowo    |      3 |
|    7 | lilei     | 100.00 | nanjing  |      5 |
|    1 | liuyi     | 100.00 | beijing  |      2 |
|    4 | tianqi    | 100.00 | hangzhou |      5 |
+------+-----------+--------+----------+--------+
5 rows in set (0.00 sec)

在这里插入图片描述
在这里插入图片描述

② 多表创建视图

创建一个视图,需要输出id、学生姓名、分数以及年龄

+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan | 20   |
|    2 | lisi     | 30   |
|    3 | wangwu   | 29   |
+------+----------+------+
3 rows in set (0.00 sec)

mysql> create view v_info(id,name,score,age) as select info.id,info.name,info.score,test01.age from info,test01 where info.name=test01.name;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from v_info;
+------+--------+-------+------+
| id   | name   | score | age  |
+------+--------+-------+------+
|    3 | lisi   | 60.00 | 30   |
|    2 | wangwu | 50.00 | 29   |
+------+--------+-------+------+
2 rows in set (0.00 sec)

③ 修改表数据

mysql> update info set score='60' where name='liuyi';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>  select * from view_score;
+------+-----------+--------+----------+--------+
| id   | name      | score  | address  | hobbid |
+------+-----------+--------+----------+--------+
|    6 | hanmeimei | 100.00 | nanjing  |      3 |
|    5 | jiaoshou  | 100.00 | laowo    |      3 |
|    7 | lilei     | 100.00 | nanjing  |      5 |
|    4 | tianqi    | 100.00 | hangzhou |      5 |
+------+-----------+--------+----------+--------+
4 rows in set (0.00 sec)

可以通过视图修改原表

mysql> update view_score set score='120' where name='tianqi';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>  select * from view_score;
+------+-----------+--------+----------+--------+
| id   | name      | score  | address  | hobbid |
+------+-----------+--------+----------+--------+
|    6 | hanmeimei | 100.00 | nanjing  |      3 |
|    5 | jiaoshou  | 100.00 | laowo    |      3 |
|    7 | lilei     | 100.00 | nanjing  |      5 |
|    4 | tianqi    | 120.00 | hangzhou |      5 |
+------+-----------+--------+----------+--------+
4 rows in set (0.00 sec)

mysql>  select * from info;
+------+-----------+--------+------------+--------+
| id   | name      | score  | address    | hobbid |
+------+-----------+--------+------------+--------+
|    6 | hanmeimei | 100.00 | nanjing    |      3 |
|    5 | jiaoshou  | 100.00 | laowo      |      3 |
|    7 | lilei     | 100.00 | nanjing    |      5 |
|    3 | lisi      |  60.00 | shanghai   |      4 |
|    1 | liuyi     |  60.00 | beijing    |      2 |
|    4 | tianqi    | 120.00 | hangzhou   |      5 |
|    2 | wangwu    |  50.00 | shengzheng |      2 |
+------+-----------+--------+------------+--------+
7 rows in set (0.00 sec)

说明:
修改表不能修改以函数、复合函数方式计算出来的字段

查询方便:索引速度快、同时可以多表查询更为迅速(视图不保存真实数据,视图本质类似select)
安全性:我们实现登陆的账户是root ——》所拥有权限 ,视图无法显示完整的约束

9.null值

在 SQL 语句使用过程中,经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失 的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有 NOT NULL 并且没有值,这时候新记录的该字段将被保存为 NULL。需要注意 的是,NULL 值与数字 0 或者空白(spaces)的字段是不同的,值为 NULL 的字段是没有 值的。在 SQL 语句中,使用 IS NULL 可以判断表内的某个字段是不是 NULL 值,相反的用 IS NOT NULL 可以判断不是 NULL 值。

查询info表结构,name字段是不允许空值的

null值与空值的区别(空气与真空)
空值长度为0,不占空间,NULL值的长度为null,占用空间
is null无法判断空值
空值使用"=“或者”<>"来处理(!=)
count()计算时,NULL会忽略,空值会加入计算

插入一条记录,分数字段输入null,显示出来就是null

mysql> desc info;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | YES  |     | NULL    |       |
| name    | varchar(10)  | NO   | PRI | NULL    |       |
| score   | decimal(5,2) | YES  |     | NULL    |       |
| address | varchar(20)  | YES  |     | NULL    |       |
| hobbid  | int(5)       | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> alter table info add column addr varchar(50);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc info;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | YES  |     | NULL    |       |
| name    | varchar(10)  | NO   | PRI | NULL    |       |
| score   | decimal(5,2) | YES  |     | NULL    |       |
| address | varchar(20)  | YES  |     | NULL    |       |
| hobbid  | int(5)       | YES  |     | NULL    |       |
| addr    | varchar(50)  | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql>  select * from info;
+------+-----------+--------+------------+--------+------+
| id   | name      | score  | address    | hobbid | addr |
+------+-----------+--------+------------+--------+------+
|    6 | hanmeimei | 100.00 | nanjing    |      3 | NULL |
|    5 | jiaoshou  | 100.00 | laowo      |      3 | NULL |
|    7 | lilei     | 100.00 | nanjing    |      5 | NULL |
|    3 | lisi      |  60.00 | shanghai   |      4 | NULL |
|    1 | liuyi     |  60.00 | beijing    |      2 | NULL |
|    4 | tianqi    | 120.00 | hangzhou   |      5 | NULL |
|    2 | wangwu    |  50.00 | shengzheng |      2 | NULL |
+------+-----------+--------+------------+--------+------+
7 rows in set (0.00 sec)

更新数据

mysql> update info set addr='nj' where score >=70;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql>  select * from info;
+------+-----------+--------+------------+--------+------+
| id   | name      | score  | address    | hobbid | addr |
+------+-----------+--------+------------+--------+------+
|    6 | hanmeimei | 100.00 | nanjing    |      3 | nj   |
|    5 | jiaoshou  | 100.00 | laowo      |      3 | nj   |
|    7 | lilei     | 100.00 | nanjing    |      5 | nj   |
|    3 | lisi      |  60.00 | shanghai   |      4 | NULL |
|    1 | liuyi     |  60.00 | beijing    |      2 | NULL |
|    4 | tianqi    | 120.00 | hangzhou   |      5 | nj   |
|    2 | wangwu    |  50.00 | shengzheng |      2 | NULL |
+------+-----------+--------+------------+--------+------+
7 rows in set (0.00 sec)

统计数量:检测null是否会加入统计中

mysql> select count(addr) from info;
+-------------+
| count(addr) |
+-------------+
|           4 |
+-------------+
1 row in set (0.01 sec)

将info表中其中一条数据修改为空值’’,统计数量,检测空值是不会被添加到统计中

mysql>  select * from info;
+------+-----------+--------+------------+--------+------+
| id   | name      | score  | address    | hobbid | addr |
+------+-----------+--------+------------+--------+------+
|    6 | hanmeimei | 100.00 | nanjing    |      3 | nj   |
|    5 | jiaoshou  | 100.00 | laowo      |      3 | nj   |
|    7 | lilei     | 100.00 | nanjing    |      5 | nj   |
|    3 | lisi      |  60.00 | shanghai   |      4 | NULL |
|    1 | liuyi     |  60.00 | beijing    |      2 | NULL |
|    4 | tianqi    | 120.00 | hangzhou   |      5 | nj   |
|    2 | wangwu    |  50.00 | shengzheng |      2 |      |
+------+-----------+--------+------------+--------+------+
7 rows in set (0.00 sec)

mysql> select count(addr) from info;
+-------------+
| count(addr) |
+-------------+
|           5 |
+-------------+
1 row in set (0.00 sec)

查询null值和查询不为空的值

mysql> select * from info where addr is NULL;
+------+-------+-------+----------+--------+------+
| id   | name  | score | address  | hobbid | addr |
+------+-------+-------+----------+--------+------+
|    3 | lisi  | 60.00 | shanghai |      4 | NULL |
|    1 | liuyi | 60.00 | beijing  |      2 | NULL |
+------+-------+-------+----------+--------+------+
2 rows in set (0.00 sec)

mysql> select * from info where addr is not null;
+------+-----------+--------+------------+--------+------+
| id   | name      | score  | address    | hobbid | addr |
+------+-----------+--------+------------+--------+------+
|    6 | hanmeimei | 100.00 | nanjing    |      3 | nj   |
|    5 | jiaoshou  | 100.00 | laowo      |      3 | nj   |
|    7 | lilei     | 100.00 | nanjing    |      5 | nj   |
|    4 | tianqi    | 120.00 | hangzhou   |      5 | nj   |
|    2 | wangwu    |  50.00 | shengzheng |      2 |      |
+------+-----------+--------+------------+--------+------+
5 rows in set (0.00 sec)

二.正则表达式

MySQL 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中 符合要求的特殊字符串。MySQL 的正则表达式使用 REGEXP 这个关键字来指定正则表达 式的匹配模式,REGEXP 操作符所支持的匹配模式如表所示。
regexp

匹配 描述
^ 匹配文本的开始字符
$ 匹配文本的结束字符
. 匹配任何单个字符
* 匹配零个或多个在它前面的字符
% 匹配所有
+ 匹配前面的字符 1 次或多次
?
字符串 匹配包含指定的字符串
p1|p2 匹配 p1 或 p2
[…] 匹配字符集合中的任意一个字符
[^…] 匹配不在括号中的任何字符
{n} 匹配前面的字符串 n 次
{n,m} 匹配前面的字符串至少 n 次,至多 m 次

查询以li开头的学生信息

mysql> select id,name from info where name regexp '^li';
+------+-------+
| id   | name  |
+------+-------+
|    7 | lilei |
|    3 | lisi  |
|    1 | liuyi |
+------+-------+
3 rows in set (0.00 sec)

查询以i结尾的学生信息

mysql> select id,name from info where name regexp 'i$';
+------+-----------+
| id   | name      |
+------+-----------+
|    6 | hanmeimei |
|    7 | lilei     |
|    3 | lisi      |
|    1 | liuyi     |
|    4 | tianqi    |
+------+-----------+
5 rows in set (0.00 sec)

查询名字中包含an的学生信息

mysql> select id,name from info where name regexp 'an';
+------+-----------+
| id   | name      |
+------+-----------+
|    6 | hanmeimei |
|    4 | tianqi    |
|    2 | wangwu    |
+------+-----------+
3 rows in set (0.00 sec)

查询名字是tian开头,i结尾,中间不知道是一个什么字符的学生信息

mysql> select id,name from info where name regexp 'tian.i';
+------+--------+
| id   | name   |
+------+--------+
|    4 | tianqi |
+------+--------+
1 row in set (0.00 sec)

查询名字中包含an或者iu的学生信息

mysql> select id,name from info where name regexp 'an|iu';
+------+-----------+
| id   | name      |
+------+-----------+
|    6 | hanmeimei |
|    1 | liuyi     |
|    4 | tianqi    |
|    2 | wangwu    |
+------+-----------+
4 rows in set (0.00 sec)

查询名字中有an,g可有可无的学生信息
必须要有的部分是’an’ 而’g’可有可无

mysql> select id,name from info where name regexp 'ang*';
+------+-----------+
| id   | name      |
+------+-----------+
|    6 | hanmeimei |
|    4 | tianqi    |
|    2 | wangwu    |
+------+-----------+
3 rows in set (0.00 sec)

查询名字中含有an,q至少出现一次的学生信息

mysql> select id,name from info where name regexp 'anq+';
+------+--------+
| id   | name   |
+------+--------+
|    4 | tianqi |
+------+--------+
1 row in set (0.00 sec)

查询名字以s-x开头的学生信息

mysql> select id,name from info where name regexp '^[s-x]';
+------+--------+
| id   | name   |
+------+--------+
|    4 | tianqi |
|    2 | wangwu |
+------+--------+
2 rows in set (0.00 sec)

查询名字不是tianqi的学生信息

mysql> select id,name from info where name regexp '[^tianqi]';
+------+-----------+
| id   | name      |
+------+-----------+
|    6 | hanmeimei |
|    5 | jiaoshou  |
|    7 | lilei     |
|    3 | lisi      |
|    1 | liuyi     |
|    2 | wangwu    |
+------+-----------+
6 rows in set (0.00 sec)

查询学生名字不以hjt各字母开头的学生信息

mysql> select id,name from info where name regexp '^[^hjt]';
+------+--------+
| id   | name   |
+------+--------+
|    7 | lilei  |
|    3 | lisi   |
|    1 | liuyi  |
|    2 | wangwu |
+------+--------+
4 rows in set (0.00 sec)

三.运算符

1.算数运算符

以 SELECT 命令来实现最基础的加减乘除运算,MySQL 支持使用的算术运算符,如表所示:

运算符 描述
+ 加法
- 减法
* 乘法
/ 除法
% 取余

在除法运算和求余数运算中,除数不能为 0,若除数是 0,返回的结果则为 NULL。需 要注意的是,如果有多个运算符,按照先乘除后加减的优先级进行运算,相同优先级的运算 符没有先后顺序。

mysql> select 1+2,2-1,3*4,4/2,5%2;
+-----+-----+-----+--------+------+
| 1+2 | 2-1 | 3*4 | 4/2    | 5%2  |
+-----+-----+-----+--------+------+
|   3 |   1 |  12 | 2.0000 |    1 |
+-----+-----+-----+--------+------+
1 row in set (0.00 sec)

mysql>  create table mt as select 1+2,2-1,3*2,4/2,5%2;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from mt;
+-----+-----+-----+--------+------+
| 1+2 | 2-1 | 3*2 | 4/2    | 5%2  |
+-----+-----+-----+--------+------+
|   3 |   1 |   6 | 2.0000 |    1 |
+-----+-----+-----+--------+------+
1 row in set (0.00 sec)

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

2.比较运算符

比较运算符是查询数据记录时经常使用的一类运算符。通过使用比较运算符可以判断出 表中有哪些记录是符合条件的,如果比较的结果(以布尔值的方式进行返回判断)为真则返回 1,如果为假则返回 0,比较的结果如果不确定则返回 NULL。其中字符串在进行比较的时候默认是不区分大小写的,如果要区分大小写可以通过 binary关键字来实现

运算符 描述
= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
!=或<> 不等于
is null 判断一个值是否为 NULL
IS NOT NULL 判断一个值是否不为 NULL
BETWEEN AND 两者之间
IN 在集合中
LIKE 通配符匹配
GREATEST 两个或多个参数时返回最大值
LEAST 两个或多个参数时返回最小值
REGEXP 正则表达式

等号(=)是用来判断数字、字符串和表达式是否相等的,如果相等则返回 1,如果不相等则返回 0。如果比较的两者有一个值是 NULL,则比较的结果就是 NULL。其中字符的比较是根据 ASCII 码来判断的,如果 ASCII 码相等,则表示两个字符相同;如果 ASCII 码不相等,则表示两个字符不相同
例如字符串(字母)比较:(‘a’>‘b’)其实比较的就是底层的ASCII码
需要关注的是ascii码有:a、A、0(97、65、48)

mysql> select 2=4,2=2,2='2','e'='e','r'=null;
+-----+-----+-------+---------+----------+
| 2=4 | 2=2 | 2='2' | 'e'='e' | 'r'=null |
+-----+-----+-------+---------+----------+
|   0 |   1 |     1 |       1 |     NULL |
+-----+-----+-------+---------+----------+
1 row in set (0.00 sec)

说明:
如果两者都是整数,则按照整数值进行比较。
如果一个整数一个字符串,则会自动将字符串转换为数字,再进行比较。(在程序中,一般是不会把这两者进行相比较的)
如果两者都是字符串,则按照字符串进行比较。
如果两者中至少有一个值是 NULL,则比较的结果是 NULL

不等于(<>,!=)
不等于号有两种写法,分别是<>或者!=,用于针对数字、字符串和表达式不相等的比较。 如果不相等则返回 1,如果相等则返回 0,这点正好跟等于的返回值相反。需要注意的是不 等于运算符不能用于判断 NULL

mysql> select 'abc'<>'cba',2<>2,3!=2,null<>null;
+--------------+------+------+------------+
| 'abc'<>'cba' | 2<>2 | 3!=2 | null<>null |
+--------------+------+------+------------+
|            1 |    0 |    1 |       NULL |
+--------------+------+------+------------+
1 row in set (0.00 sec)

大于、小于、大于等于、小于等于

mysql> select 5>4,3<4,'a'<'b',4.4<5,'u'>=null;
+-----+-----+---------+-------+-----------+
| 5>4 | 3<4 | 'a'<'b' | 4.4<5 | 'u'>=null |
+-----+-----+---------+-------+-----------+
|   1 |   1 |       1 |     1 |      NULL |
+-----+-----+---------+-------+-----------+
1 row in set (0.00 sec)

mysql> select 2 is null,'a' is not null,null is null;
+-----------+-----------------+--------------+
| 2 is null | 'a' is not null | null is null |
+-----------+-----------------+--------------+
|         0 |               1 |            1 |
+-----------+-----------------+--------------+
1 row in set (0.00 sec)

说明:
① 大于(>)运算符用来判断左侧的操作数是否大于右侧的操作数,若大于返回 1,否则返回 0,同样不能用于判断 NULL。
② 小于(<)运算符用来判断左侧的操作数是否小于右侧的操作数,若小于返回 1,否则返回 0,同样不能用于判断 NULL。
③ 大于等于(>=)判断左侧的操作数是否大于等于右侧的操作数,若大于等于返回 1,否则返回 0,不能用于判断 NULL。
④ 小于等于(<=)判断左侧的操作数是否小于等于右侧的操作数,若小于等于返回 1,否则返回 0,不能用于判断 NULL

BETWEEN AND 比较运算通常用于判断一个值是否落在某两个值之间。
例如,判断某数字是否在另外两个数字之间,也可以判断某英文字母是否在另外两个字母之间

Between and 覆盖的范围是>= 和 <=关系

mysql> select 4 between 2 and 5,'c' between 'a' and 'b';
+-------------------+-------------------------+
| 4 between 2 and 5 | 'c' between 'a' and 'b' |
+-------------------+-------------------------+
|                 1 |                       0 |
+-------------------+-------------------------+
1 row in set (0.00 sec)

least 和greatest(取最小值、取最大值)
LEAST:当有两个或者多个参数时,返回其中的最小值。如果其中一个值为 NULL,则 返回结果就为 NULL。

GREATEST:当有两个或者多个参数时,返回其中的最大值。如果其中一个值为NULL, 则返回结果就为 NULL。

若要判断一组数字或字母中哪个最小、哪个最大,可以通过使用 LEAST 和 GREATEST 来实现

mysql> select least(1,2,3),greatest(1,2,3),least('a','b','c'),greatest('a','b','c');
+--------------+-----------------+--------------------+-----------------------+
| least(1,2,3) | greatest(1,2,3) | least('a','b','c') | greatest('a','b','c') |
+--------------+-----------------+--------------------+-----------------------+
|            1 |               3 | a                  | c                     |
+--------------+-----------------+--------------------+-----------------------+
1 row in set (0.00 sec)

IN 判断一个值是否在对应的列表中,如果是返回 1,否则返回 0。
NOT IN 判断一个值是否不在对应的列表中,如果不是返回 1,否则返回 0

mysql> select 1 in (1,2,3), 2 not in ('a','b','c');
+--------------+------------------------+
| 1 in (1,2,3) | 2 not in ('a','b','c') |
+--------------+------------------------+
|            1 |                      1 |
+--------------+------------------------+
1 row in set, 3 warnings (0.00 sec)

LIKE 用来匹配字符串,如果匹配成功则返回 1,反之返回 0
LIKE 支持两种通配符:’%’ 用于匹配任意数目的字符(*匹配的是前面一个字符),而’_’只能匹配一个字符。
NOT LIKE 正好跟 LIKE 相反,如果没有匹配成功则返回 1,反之返回 0。

mysql> select 'abc' like 'ab%','abc' like '_bc','abc' not like 'a%';
+------------------+------------------+---------------------+
| 'abc' like 'ab%' | 'abc' like '_bc' | 'abc' not like 'a%' |
+------------------+------------------+---------------------+
|                1 |                1 |                   0 |
+------------------+------------------+---------------------+
1 row in set (0.00 sec)

3.逻辑运算符(布尔值)

逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假,如果为真返回 1,否则 返回 0,真和假也可以用 TRUE 和 FALSE 表示。MySQL 中支持使用的逻辑运算符有四种, 具体如表所示。

运算符 描述
not 或 ! 逻辑非
and 或 && 逻辑与
or 逻辑或
xor 逻辑异或

(1)逻辑非

逻辑运算符中最简单的运算符就是逻辑非,逻辑非使用 NOT 或!表示。逻辑非将跟在它后面的逻辑测试取反,把真变为假,把假变为真。如果 NOT 后面的操作数为 0 时,所得值为 1;如果操作数为非 0 时,所得值为 0;如果操作数为 NULL 时,所得值为 NULL

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

(2)逻辑与(and)

当所有的操作数都为非0值且不为null时,返回值为1,否则为0
(null与0比较特殊)
逻辑与使用 AND 或者&&表示

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

and 和&& 的作用相同
1 and -1 没有0 或 null,所以返回值为1
1 and 0 中由有0,所以返回值为0
1 and null 有Null ,所以返回值为null
null and 0 返回值为0

(3)逻辑或(or)

逻辑或通常使用 OR
逻辑或表示包含的操作数,任意一个为非零值并且不是 NULL 值时,返回 1,否则返回 0。
当有一个操作数为null时,如果另一个操作数为非0值,则返回值为1,否则为null
如两个操作数均为null,则返回值为null

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

mysql> select 0 or null or 2;
+----------------+
| 0 or null or 2 |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)

(4)逻辑异或(xor)

两个非 NULL 值的操作数,如果两者都是 0 或者都是非 0,则返回 0;
如果一个为 0, 另一个为非 0,则返回结果为 1;
当任意一个值为 NULL 时,返回值为 NULL

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

4.位运算符

位运算符实际上是对二进制数进行计算的运算符。MySQL 内位运算会先将操作数变成二进制格式(1010 1111),然后进行位运算,最后在将计算结果
从二进制变回到十进制格式,方便用户查 看。MySQL 支持 6 种位运算符,具体如表所示。

位运算符 描述
& 按位与
| 按位或
~ 按位取反
^ 按位异或
<< 按位左移
>> 按位右移

mysql> select 10 & 15,10 | 15,10 ^ 15,5 &~1;
+---------+---------+---------+-------+
| 10 & 15 | 10 | 15 | 10 ^ 15 | 5 &~1 |
+---------+---------+---------+-------+
|      10 |      15 |       5 |     4 |
+---------+---------+---------+-------+
1 row in set (0.00 sec)

说明:
10 转换为二进制数是 1010, 15 转换为二进制数是 1111
按位与运算(&),是对应的二进制位都是 1 的,它们的运算结果为 1,否则为 0,所以 10 & 15 的结果为 10。
按位或运算(|),是对应的二进制位有一个或两个为 1 的,运算结果为 1,否则为 0, 所以 10 | 15 的结果为 15。
按位异或运算(^),是对应的二进制位不相同时,运算结果 1,否则为 0,所以 10 ^ 15 的结果为 5。
按位取反(~),是对应的二进制数逐位反转,即 1 取反后变为 0, 0 取反后变为 1。数字 1 的二进制是 0001,取反后变为 1110, 数字 5 的二进制是 0101,将 1110 和 0101
进行求与操作,其结果是二进制的 0100,转换为十进制就是 4

5.优先级

以上不管哪种运算符,在使用过程中都有优先级问题。运算符的优先级决定了不同的运 算符在计算过程中的先后顺序。级别高的运算符会先进行计算,如果运算符的级别相同, MySQL 会按照顺序从左到右依次进行计算,优先级如下表所示:

优先级 运算符
1 !
2 ~
3 ^
4 *、/、%
5 +,-
6 >>,<<
7 &
8 |
9 =,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
10 BETWEEN,CASE,WHEN,THEN,ELSE
11 NOT
12 &&,AND
13 ||,OR,XOR
14 :=

四.连接查询

MySQL 的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的 共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择 性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接

1.内连接

MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件,内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用 关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表

语法
SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

mysql> select * from infos;
+----------+-------+----------+
| name     | score | address  |
+----------+-------+----------+
| wangwu   | 80.00 | beijing  |
| zhangsan | 99.00 | shanghai |
| lisi     | 99.00 | nanjing  |
+----------+-------+----------+
3 rows in set (0.00 sec)

mysql> select * from info;
+------+-----------+--------+------------+--------+------+
| id   | name      | score  | address    | hobbid | addr |
+------+-----------+--------+------------+--------+------+
|    6 | hanmeimei | 100.00 | nanjing    |      3 | nj   |
|    5 | jiaoshou  | 100.00 | laowo      |      3 | nj   |
|    7 | lilei     | 100.00 | nanjing    |      5 | nj   |
|    3 | lisi      |  60.00 | shanghai   |      4 | NULL |
|    1 | liuyi     |  60.00 | beijing    |      2 | NULL |
|    4 | tianqi    | 120.00 | hangzhou   |      5 | nj   |
|    2 | wangwu    |  50.00 | shengzheng |      2 |      |
+------+-----------+--------+------------+--------+------+
7 rows in set (0.00 sec)

mysql> select info.id,info.name from info inner join infos on info.name=infos.name;
+------+--------+
| id   | name   |
+------+--------+
|    2 | wangwu |
|    3 | lisi   |
+------+--------+
2 rows in set (0.00 sec)

内连查询:通过inner join 的方式将两张表指定的相同字段的记录行输出出来

2.左连接

左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参 考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。

mysql> select * from info left join infos on info.name=infos.name;
+------+-----------+--------+------------+--------+------+--------+-------+---------+
| id   | name      | score  | address    | hobbid | addr | name   | score | address |
+------+-----------+--------+------------+--------+------+--------+-------+---------+
|    2 | wangwu    |  50.00 | shengzheng |      2 |      | wangwu | 80.00 | beijing |
|    3 | lisi      |  60.00 | shanghai   |      4 | NULL | lisi   | 99.00 | nanjing |
|    6 | hanmeimei | 100.00 | nanjing    |      3 | nj   | NULL   |  NULL | NULL    |
|    5 | jiaoshou  | 100.00 | laowo      |      3 | nj   | NULL   |  NULL | NULL    |
|    7 | lilei     | 100.00 | nanjing    |      5 | nj   | NULL   |  NULL | NULL    |
|    1 | liuyi     |  60.00 | beijing    |      2 | NULL | NULL   |  NULL | NULL    |
|    4 | tianqi    | 120.00 | hangzhou   |      5 | nj   | NULL   |  NULL | NULL    |
+------+-----------+--------+------------+--------+------+--------+-------+---------+
7 rows in set (0.00 sec)

左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为 NULL。

3.右连接

右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配

mysql> select * from info right join infos on info.name=infos.name;
+------+--------+-------+------------+--------+------+----------+-------+----------+
| id   | name   | score | address    | hobbid | addr | name     | score | address  |
+------+--------+-------+------------+--------+------+----------+-------+----------+
|    2 | wangwu | 50.00 | shengzheng |      2 |      | wangwu   | 80.00 | beijing  |
| NULL | NULL   |  NULL | NULL       |   NULL | NULL | zhangsan | 99.00 | shanghai |
|    3 | lisi   | 60.00 | shanghai   |      4 | NULL | lisi     | 99.00 | nanjing  |
+------+--------+-------+------------+--------+------+----------+-------+----------+
3 rows in set (0.00 sec)

在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 NULL 补足

五.数据库函数

1.数学函数

常用的数学函数及描述
abs (x) 返回x的绝对值;绝对值就是永远是正数,0的绝对值是0

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 2…) 返回集合中最大的值

least (x1, x2…) 返回集合中最小的值

绝对值

mysql> select abs(-8);
+---------+
| abs(-8) |
+---------+
|       8 |
+---------+
1 row in set (0.00 sec)

0到1的随机数

mysql> select rand();
+-------------------+
| rand()            |
+-------------------+
| 0.942602163127253 |
+-------------------+
1 row in set (0.00 sec)

mysql> create table a as select rand();
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from a;
+--------------------+
| rand()             |
+--------------------+
| 0.9277907786218363 |
+--------------------+
1 row in set (0.00 sec)

mysql> desc a;
+--------+--------+------+-----+---------+-------+
| Field  | Type   | Null | Key | Default | Extra |
+--------+--------+------+-----+---------+-------+
| rand() | double | NO   |     | 0       |       |
+--------+--------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> select rand()*10;						#可以结合运算符使用
+-------------------+
| rand()*10         |
+-------------------+
| 8.111474344610679 |
+-------------------+
1 row in set (0.00 sec)

取余

mysql> select mod(7,2);
+----------+
| mod(7,2) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

返回x的y次方的值power(x,y)

mysql> select power(2,8);
+------------+
| power(2,8) |
+------------+
|        256 |
+------------+
1 row in set (0.00 sec)

取最接近的整数值

mysql> select round(1.48);
+-------------+
| round(1.48) |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

mysql> select round(1.5);
+------------+
| round(1.5) |
+------------+
|          2 |
+------------+
1 row in set (0.00 sec)

mysql> select round(1.88);
+-------------+
| round(1.88) |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)

保留小数点后2位四舍五入的值

mysql> select round(1.886,2);
+----------------+
| round(1.886,2) |
+----------------+
|           1.89 |
+----------------+
1 row in set (0.00 sec)

算术平方根

mysql> select sqrt(4);
+---------+
| sqrt(4) |
+---------+
|       2 |
+---------+
1 row in set (0.00 sec)

mysql> select sqrt(5);
+------------------+
| sqrt(5)          |
+------------------+
| 2.23606797749979 |
+------------------+
1 row in set (0.00 sec)

保留小数点后2位,不四舍五入,截取

mysql> select truncate(1.699,2);
+-------------------+
| truncate(1.699,2) |
+-------------------+
|              1.69 |
+-------------------+
1 row in set (0.00 sec)

返回大于等于的整数值

mysql> select ceil(5.4);
+-----------+
| ceil(5.4) |
+-----------+
|         6 |
+-----------+
1 row in set (0.00 sec)

返回小于等于的整数值

mysql> select floor(5.4);
+------------+
| floor(5.4) |
+------------+
|          5 |
+------------+
1 row in set (0.00 sec)

返回最大值

mysql> select greatest(4,5,6);
+-----------------+
| greatest(4,5,6) |
+-----------------+
|               6 |
+-----------------+
1 row in set (0.00 sec)

返回最小值

mysql> select least(4,5,6);
+--------------+
| least(4,5,6) |
+--------------+
|            4 |
+--------------+
1 row in set (0.01 sec)

2.聚合函数

可以对数据库内的记录求和、平均值、最大值、最小值的操作

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

返回分数的总和

mysql> select sum(score) from info;
+------------+
| sum(score) |
+------------+
|     590.00 |
+------------+
1 row in set (0.00 sec)

返回分数最小的值

mysql> select min(score) from info;
+------------+
| min(score) |
+------------+
|      50.00 |
+------------+
1 row in set (0.00 sec)

返回分数最大的值

mysql> select max(score) from info;
+------------+
| max(score) |
+------------+
|     120.00 |
+------------+
1 row in set (0.00 sec)

返回平均值

mysql> select avg(score) from info;
+------------+
| avg(score) |
+------------+
|  84.285714 |
+------------+
1 row in set (0.00 sec)

返回分数的个数、addr的个数(null值不会被统计)

mysql> select count(score) from info;
+--------------+
| count(score) |
+--------------+
|            7 |
+--------------+
1 row in set (0.00 sec)

mysql> select count(addr) from info;
+-------------+
| count(addr) |
+-------------+
|           5 |
+-------------+
1 row in set (0.00 sec)

3.字符串函数

常见的字符串函数

length(x) 返回字符串x的长度

trim() 返回去除指定格式的值

concal (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反转

返回字符串的长度

mysql> select length('abcd');
+----------------+
| length('abcd') |
+----------------+
|              4 |
+----------------+
1 row in set (0.00 sec)

mysql> select length('abc d');					#空格也占字符
+-----------------+
| length('abc d') |
+-----------------+
|               5 |
+-----------------+
1 row in set (0.00 sec)

去除头部的指定格式

mysql> select trim('  lll');
+---------------+
| trim('  lll') |
+---------------+
| lll           |
+---------------+
1 row in set (0.00 sec)

mysql> select trim('  l  ll');
+-----------------+
| trim('  l  ll') |
+-----------------+
| l  ll           |
+-----------------+
1 row in set (0.00 sec)

mysql> select trim('  l  ll  ');
+-------------------+
| trim('  l  ll  ') |
+-------------------+
| l  ll             |
+-------------------+
1 row in set (0.00 sec)

select trim('  ll l   ')' at line 1
mysql> select trim('  ll l   ');
+-------------------+
| trim('  ll l   ') |
+-------------------+
| ll l              |
+-------------------+
1 row in set (0.00 sec)

字符串拼接

mysql> select concat ('he','llo');
+---------------------+
| concat ('he','llo') |
+---------------------+
| hello               |
+---------------------+
1 row in set (0.00 sec)

mysql> select concat ('he',trim(' llo'));   #结合其他函数使用
+----------------------------+
| concat ('he',trim(' llo')) |
+----------------------------+
| hello                      |
+----------------------------+
1 row in set (0.00 sec)

所有字符串大写

mysql> select upper('abC');
+--------------+
| upper('abC') |
+--------------+
| ABC          |
+--------------+
1 row in set (0.00 sec)

所有字符串小写

mysql> select lower('abC');
+--------------+
| lower('abC') |
+--------------+
| abc          |
+--------------+
1 row in set (0.00 sec)

返回字符串的前面或者后面的几个字符

mysql> select left('hello',2);
+-----------------+
| left('hello',2) |
+-----------------+
| he              |
+-----------------+
1 row in set (0.00 sec)

mysql> select right('hello',3);
+------------------+
| right('hello',3) |
+------------------+
| llo              |
+------------------+
1 row in set (0.01 sec)

mysql> select concat(left('hello',2),right('hello',3));
+------------------------------------------+
| concat(left('hello',2),right('hello',3)) |
+------------------------------------------+
| hello                                    |
+------------------------------------------+
1 row in set (0.00 sec)

重复输出多次

mysql> select repeat('he',5);
+----------------+
| repeat('he',5) |
+----------------+
| hehehehehe     |
+----------------+
1 row in set (0.00 sec)

返回3个空格

mysql> select length(space(3));
+------------------+
| length(space(3)) |
+------------------+
|                3 |
+------------------+
1 row in set (0.00 sec)

替换字符串内容

mysql> select replace('hello','ll','aa');
+----------------------------+
| replace('hello','ll','aa') |
+----------------------------+
| heaao                      |
+----------------------------+
1 row in set (0.00 sec)

mysql> select replace('lalhh','la','hh');
+----------------------------+
| replace('lalhh','la','hh') |
+----------------------------+
| hhlhh                      |
+----------------------------+
1 row in set (0.00 sec)

比较大小,小于返回-1,等于返回0,大于返回1

mysql> select strcmp(20,21);
+---------------+
| strcmp(20,21) |
+---------------+
|            -1 |
+---------------+
1 row in set (0.00 sec)

mysql> select strcmp(20,20);
+---------------+
| strcmp(20,20) |
+---------------+
|             0 |
+---------------+
1 row in set (0.00 sec)

mysql> select strcmp(21,20);
+---------------+
| strcmp(21,20) |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)

返回字符串第三个字符开始的4个字符

mysql> select substring('adfgh4rf',3,4);				#返回字符串第三个字符开始的4个字符
+---------------------------+
| substring('adfgh4rf',3,4) |
+---------------------------+
| fgh4                      |
+---------------------------+
1 row in set (0.00 sec)

mysql> select reverse(left('123dfghj',3));				#返回字符串的前三个字符,然后反转输出
+-----------------------------+
| reverse(left('123dfghj',3)) |
+-----------------------------+
| 321                         |
+-----------------------------+
1 row in set (0.00 sec)

mysql> select left(reverse('123dfghj'),3);				#先将字符反转,再输出前三个字符
+-----------------------------+
| left(reverse('123dfghj'),3) |
+-----------------------------+
| jhg                         |
+-----------------------------+
1 row in set (0.00 sec)

4.日期时间函数

函数 描述
curdate () 返回当前时间的年月日

curtime () 返回当前时间的时分秒

now () 返回当前时间的口期和时间

month (x) 返回日期x中的月份值

week (x) 返回日期x是年度第几个星期

hour (x) 返回x中的小时值

minute (x) 返回x中的分钟值

second(x) 返回x中的秒钟值

dayofweek (x) 返回x是星期几,1星期日,2星期一

replace(x, y, z) 将字符串z替代字符串x中的字符串y

dayofmonth (x) 计算日期x是本月的第几天

dayofycar (X) 计算日期x是本年的第几天,返回年月日

mysql> select curdate();			#返回当前年月日
+------------+
| curdate()  |
+------------+
| 2021-07-20 |
+------------+
1 row in set (0.00 sec)

mysql> select curtime();			#返回当前时分秒
+-----------+
| curtime() |
+-----------+
| 02:08:09  |
+-----------+
1 row in set (0.00 sec)

mysql> select now();				#返回当前时间
+---------------------+
| now()               |
+---------------------+
| 2021-07-20 02:09:29 |
+---------------------+
1 row in set (0.00 sec)

mysql> select month('2021-07-10');	#返回当前的月份
+---------------------+
| month('2021-07-10') |
+---------------------+
|                   7 |
+---------------------+
1 row in set (0.00 sec)

mysql> select week('2021-07-20');	#返回当前第几周
+--------------------+
| week('2021-07-20') |
+--------------------+
|                 29 |
+--------------------+
1 row in set (0.00 sec)

mysql> select hour(curtime());		#返回当前当天的小时
+-----------------+
| hour(curtime()) |
+-----------------+
|               2 |
+-----------------+
1 row in set (0.01 sec)

mysql> select minute(curtime());	#返回当前的分钟
+-------------------+
| minute(curtime()) |
+-------------------+
|                10 |
+-------------------+
1 row in set (0.00 sec)

mysql> select second(curtime());	#返回当前的秒
+-------------------+
| second(curtime()) |
+-------------------+
|                31 |
+-------------------+
1 row in set (0.00 sec)

mysql> select dayofweek(curdate());	#返回本周的第几天,周日是第一天
+----------------------+
| dayofweek(curdate()) |
+----------------------+
|                    3 |
+----------------------+
1 row in set (0.00 sec)

mysql> select dayofmonth(curdate());#返回当月的几号
+-----------------------+
| dayofmonth(curdate()) |
+-----------------------+
|                    20 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select dayofyear(curdate());#返回今年的第几天
+----------------------+
| dayofyear(curdate()) |
+----------------------+
|                  201 |
+----------------------+
1 row in set (0.01 sec)

六.存储过程

1.概述

一组为了完成指定功能的sql语句的集合,将这些sql语句集合存储到一个指定的名称,使用时再进行调用;在执行时比传统的sql速度更快、执行速度更快

2.简介

(1)存储过程是一组为了完成特定功能的SQL.语句集合。

(2)存储过程在使用过程中是将常用或者复杂的工作预先使用sQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统soL速度史快、执行效率更高。

3.存储过程的优点

(1)执行一次后,会将生成的二进制代码驻留级冲区,提高执行效率

( 2 ) sQL语句加上控制语句的集合,灵活性高

(3)在服务器端存储,客户端调用时,降低网络负载

(4)可多次重复被调用,可随时修改,不影响客户端调用

(5)可完成所有的数据库操作,也可控制数据库的信息访问权限

4.存储过程的创建、调用、查看

mysql> delimiter @@						#定义结束符
mysql> create procedure u()				#创建存储过程
    -> begin
    -> select * from info;
    -> end @@
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;						#将结束符改回;
mysql> call u();						#调用存储过程
+------+-----------+--------+------------+--------+------+
| id   | name      | score  | address    | hobbid | addr |
+------+-----------+--------+------------+--------+------+
|    6 | hanmeimei | 100.00 | nanjing    |      3 | nj   |
|    5 | jiaoshou  | 100.00 | laowo      |      3 | nj   |
|    7 | lilei     | 100.00 | nanjing    |      5 | nj   |
|    3 | lisi      |  60.00 | shanghai   |      4 | NULL |
|    1 | liuyi     |  60.00 | beijing    |      2 | NULL |
|    4 | tianqi    | 120.00 | hangzhou   |      5 | nj   |
|    2 | wangwu    |  50.00 | shengzheng |      2 |      |
+------+-----------+--------+------------+--------+------+
7 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> show create procedure u\G		#查看存储过程
*************************** 1. row ***************************
           Procedure: u
            sql_mode: PIPES_AS_CONCAT,ANSI_QUOTES,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    Create Procedure: CREATE DEFINER="root"@"localhost" PROCEDURE "u"()
begin
select * from info;
end
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)


show procedure status like ‘u’\G
查看指定存储过程;u不带%时就查找u一个,带上%会查找所有有u的内容

5.存储过程参数

IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)

OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值( 值只能是变量)

6.删除存储过程

存储过程内容的修改方法是:删除原有存储过程,再创建相同的名称的存储。

mysql> call u();
+------+-----------+--------+------------+--------+------+
| id   | name      | score  | address    | hobbid | addr |
+------+-----------+--------+------------+--------+------+
|    6 | hanmeimei | 100.00 | nanjing    |      3 | nj   |
|    5 | jiaoshou  | 100.00 | laowo      |      3 | nj   |
|    7 | lilei     | 100.00 | nanjing    |      5 | nj   |
|    3 | lisi      |  60.00 | shanghai   |      4 | NULL |
|    1 | liuyi     |  60.00 | beijing    |      2 | NULL |
|    4 | tianqi    | 120.00 | hangzhou   |      5 | nj   |
|    2 | wangwu    |  50.00 | shengzheng |      2 |      |
+------+-----------+--------+------------+--------+------+
7 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> drop procedure if exists u;					#删除存储过程
Query OK, 0 rows affected (0.01 sec)

mysql> call u();
ERROR 1305 (42000): PROCEDURE koko.u does not exist
mysql>

七.总结

这里主要介绍了mysql数据库的高阶语句用法,包括了常用查询、正则表达式、运算符、连接查询、函数和存储过程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值