制作简易网站,营销策划公司名称,深圳盐田建设交易中心网站,广东旅游网站建设一、NULL值 在 SQL 语句使用过程中#xff0c;经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失 的值#xff0c;也就是在表中该字段是没有值的。如果在创建表时#xff0c;限制某些字段不为空#xff0c;则可以使用 NOT NULL 关键字#xff0c;不使用则默认可以为空…一、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会忽略空值会加入计算。 验证
alter table test add column addr varchar(50);
在 test 表中添加一个名为 addr 的新列数据类型为 varchar最大长度为 50 个字符。update test set addrnj where score 70;
更新 test 表的 addr 列并将其值设置为 nj对于所有 score 列大于或等于 70 的行。统计数量检测null是否会加入统计中
select count(addr) from test;#将test表中其中一条数据修改为空值’’
update test set addr where namewangwu;#统计数量检测空值是不会被添加到统计中
select count(addr) from test;查询null值
select * from test where addr is NULL;
-----------------------------------------------
| id | name | score | address | hobbid | addr |
-----------------------------------------------
| 6 | hanmeimei | 10.00 | nanjing | 3 | NULL |
| 7 | lilei | 11.00 | nanjing | 5 | NULL |
-----------------------------------------------查询不为空的值
select * from test where addr is not null;
-------------------------------------------------
| id | name | score | address | hobbid | addr |
-------------------------------------------------
| 1 | liuyi | 80.00 | beijing | 2 | nj |
| 2 | wangwu | 90.00 | shengzheng | 2 | nj |
| 3 | lisi | 60.00 | shanghai | 4 | |
| 4 | tianqi | 99.00 | hangzhou | 5 | nj |
| 5 | jiaoshou | 98.00 | laowo | 3 | nj |
| 1 | xiaoer | 80.00 | hangzhou | 3 | nj |
-------------------------------------------------
6 rows in set (0.00 sec)内连接 左连接 右连接
二、连接查询⭐⭐⭐ MySQL 的连接查询通常都是将来自两个或多个表的记录行结合起来基于这些表之间的 共同字段进行数据的拼接。首先要确定一个主表作为结果集然后将其他表的行有选择 性的连接到选定的主表结果集上。使用较多的连接查询包括内连接、左连接和右连接
可以创建一个test1表用来做实验以下是模板:
create table test1 (
a_id int(11) default null,
a_name varchar(32) default null,
a_level int(11) default null);create table test2 (
b_id int(11) default null,
b_name varchar(32) default null,
b_level int(11) default null);insert into test1 values (1,aaaa,10);
insert into test1 values (2,bbbb,20);
insert into test1 values (3,cccc,30);
insert into test1 values (4,dddd,40);insert into test2 values (2,bbbb,20);
insert into test2 values (3,cccc,30);
insert into test2 values (5,eeee,50);
insert into test2 values (6,ffff,60);1、内连接 MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表并使用 ON 子句设置连接条件内连接是系统默认的表连接所以在 FROM 子句后可以省略 INNER 关键字只使用 关键字 JOIN。同时有多个表时也可以连续使用 INNER JOIN 来实现多表的内连接不过为了更好的性能建议最好不要超过三个表 1语法
SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name table2.column_name;模板表
create table infos(name varchar(40),score decimal(4,2),address varchar(40));insert into infos values(wangwu,80,beijing),(zhangsan,99,shanghai),(lisi,100,nanjing);mysql select * from infos;
---------------------------
| name | score | address |
---------------------------
| wangwu | 80.00 | beijing |
| zhangsan | 99.00 | shanghai |
| lisi | 99.99 | nanjing |
---------------------------mysql select info.id,info.name from info inner join infos on info.nameinfos.name;
--------------
| id | name |
--------------
| 2 | wangwu |
| 3 | lisi |
--------------
2 rows in set (0.00 sec)内连查询通过inner join 的方式将两张表指定的相同字段的记录行输出出来 内连查询面试直接了当的说 用inner join 就可以
2、左连接 左连接也可以被称为左外连接在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表接收左表的所有行并用这些行与右侧参 考表中的记录进行匹配也就是说匹配左表中的所有行以及右表中符合条件的行。
mysql select * from info left join infos on info.nameinfos.name;
---------------------------------------------------------------------------
| id | name | score | address | hobbid | addr | name | score | address |
---------------------------------------------------------------------------
| 2 | wangwu | 50.00 | shengzheng | 2 | nj | wangwu | 80.00 | beijing |
| 3 | lisi | 50.00 | shanghai | 4 | nj | lisi | 99.99 | nanjing |
| 1 | liuyi | 60.00 | beijing | 2 | nj | NULL | NULL | NULL |
| 4 | tianqi | 100.00 | hangzhou | 5 | | NULL | NULL | NULL |
| 5 | jiaoshou | 100.00 | laowo | 3 | NULL | NULL | NULL | NULL |
| 6 | hanmeimei | 100.00 | nanjing | 3 | NULL | NULL | NULL | NULL |
| 7 | lilei | 100.00 | nanjing | 5 | NULL | NULL | NULL | NULL |
| 7 | lilei | 100.00 | nanjing | 5 | NULL | NULL | NULL | NULL |
| 8 | abn | 81.00 | bj | 1 | nj | NULL | NULL | NULL |
---------------------------------------------------------------------------左连接中左表的记录将会全部表示出来而右表只会显示符合搜索条件的记录右表记录不足的地方均为 NULL。
3、右连接 右连接也被称为右外连接在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反它是以右表为基础表用于接收右表中的所有行并用这些记录与左表中的行进行匹配
mysql select * from info right join infos on info.nameinfos.name;
--------------------------------------------------------------------------
| id | name | score | address | hobbid | addr | name | score | address |
--------------------------------------------------------------------------
| 2 | wangwu | 50.00 | shengzheng | 2 | nj | wangwu | 80.00 | beijing |
| NULL | NULL | NULL | NULL | NULL | NULL | zhangsan | 99.00 | shanghai |
| 3 | lisi | 50.00 | shanghai | 4 | nj | lisi | 99.99 | nanjing |
--------------------------------------------------------------------------
3 rows in set (0.00 sec)在右连接的查询结果集中除了符合匹配规则的行外还包括右表中有但是左表中不匹 配的行这些记录在左表中以 NULL 补足
三、存储过程⭐⭐⭐
1、概述------------ 前面学习的 MySQL 相关知识都是针对一个表或几个表的单条 SQL 语句使用这样的SQL 语句虽然可以完成用户的需求但在实际的数据库应用中有些数据库操作可能会非常复杂可能会需要多条 SQL 语句一起去处理才能够完成这时候就可以使用存储过程 轻松而高效的去完成这个需求有点类似shell脚本里的函数
2、简介------------- 1、存储过程是一组为了完成特定功能的SQL语句集合。 两个点 第一 触发器定时任务 第二个判断 2、存储过程这个功能是从5.0版本才开始支持的它可以加快数据库的处理速度增强数据库在实际应用中的灵活性。存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时只需要调用它即可。操作数据库的传统 SQL 语句在执行时需要先编译然后再去执行跟存储过程一对比明显存储过程在执行上速度更快效率更高
开发人员 访问select 如果访问过多100万 触发存储过程
存储过程在数据库中L 创建并保存它不仅仅是 SQ语句的集合还可以加入一些特殊的控制结构也可以控制数据的访问方式。存储过程的应用范围很广例如封装特定的功能、 在不同的应用程序或平台上执行相同的函数等等。
3、存储过程的优点 1执行一次后会将生成的二进制代码驻留缓冲区提高执行效率 2SQL语句加上控制语句的集合灵活性高 3在服务器端存储客户端调用时降低网络负载 4可多次重复被调用可随时修改不影响客户端调用 5可完成所有的数据库操作也可控制数据库的信息访问权限 语法
CREATE PROCEDURE 过程名 ( [过程参数[,…] ] ) 过程体
[过程参数[,…] ] 格式
过程名尽量避免与内置的函数或字段重名
过程体语句
[ IN | OUT | INOUT ] 参数名类型示例不带参数的创建 ##创建存储过程##
DELIMITER $$ #将语句的结束符号从分号;临时改为两个$$(可以自定义)
CREATE PROCEDURE Proc() #创建存储过程过程名为Proc不带参数
- BEGIN #过程体以关键字 BEGIN 开始
- create table mk (id int (10), name char(10),score int (10));
- insert into mk values (1, wang,13);
- select * from mk; #过程体语句
- END $$ #过程体以关键字 END 结束
DELIMITER ; #将语句的结束符号恢复为分号##调用存储过程##
CALL Proc();I 存储过程的主体都分,被称为过程体
II 以BEGIN开始以END结束若只有一条sQL语句则可以省略BEGIN-END
III 以DELIMITER开始和结束
mysglDEL工M工TER $$ $$是用户自定义的结束符
省略存储过程其他步骤
mysqlDELIMITER ; 分号前有空格##查看存储过程##
格式
SHOW CREATE PROCEDURE [数据库.]存储过程名; #查看某个存储过程的具体信息mysql show create procedure proc\G
*************************** 1. row ***************************Procedure: procsql_mode: PIPES_AS_CONCAT,ANSI_QUOTES,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_D_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONCreate Procedure: CREATE DEFINERrootlocalhost PROCEDURE proc()
begin
select id,name from info;
update info set score10 where nametiqnai;
end
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)#查看存储过程
SHOW PROCEDURE STATUS #查看指定存储过程信息
mysql SHOW PROCEDURE STATUS like %proc%\G
*************************** 1. row ***************************Db: infoName: procType: PROCEDUREDefiner: rootlocalhostModified: 2021-07-15 05:45:21Created: 2021-07-15 05:45:21Security_type: DEFINERComment:
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.01 sec)##存储过程的参数## IN 输入参数表示调用者向过程传入值传入值可以是字面量或变量 OUT 输出参数表示过程向调用者传出值(可以返回多个值)传出值只能是变量 INOUT 输入输出参数既表示调用者向过程传入值又表示过程向调用者传出值值只能是变量
即表示调用者向过程传入值又表示过程向调用者传出值只能是变量)
举例
mysql delimiter
mysql create procedure proc (in inname varchar(40)) #行参- begin- select * from info where nameinname;- end
mysql delimiter
mysql call proc2(wangwu); #实参
------------------------
| name | score | address |
------------------------
| wangwu | 80.00 | beijing |
------------------------
1 row in set (0.00 sec)#修改存储过程
ALTER PROCEDURE 过程名[特征... ]
ALTER PROCEDURE GetRole MODIFIES SQL DATA SQL SECURITY INVOKER;
MODIFIES sQLDATA:表明子程序包含写数据的语句
SECURITY:安全等级
invoker:当定义为INVOKER时只要执行者有执行权限就可以成功执行。##删除存储过程## 存储过程内容的修改方法是通过删除原有存储过程之后再以相同的名称创建新的存储过程。
DROP PROCEDURE IF EXISTS Proc;