mysql必知必会

news2024/10/6 0:33:50
名词
  • 数据库软件 : DBMS(database manager system)

  • 数据库 :database, 通过DBMS创建和操作的容器, 保存有组织的数据的容器,,,通常是一个文件或者一组文件

  • 表: 是一种结构化文件,,,可以用来存储 特定类型的数据

  • 模式: 用来描述数据库中特定的表以及整个数据库(和其中表的关系),,,模式用作数据库的同义词

  • 列: column ,,表中的一个字段,所有表都是由一个列或者多个列组成,,根据列,,对数据进行排序和过滤

  • 数据类型: datatype所容许的数据的类型,,每个表列都有相应的数据类型,它限制该列中存储的数据类型,,,帮助正确的排序数据,并在优化磁盘使用方面起重要作用

  • 行 : row ,,,表中的一个记录,,数据库记录record

  • 主键: primary key ,,一列(一组列),,其值能够唯一区分表中的每一行,,主键用来表示一个特定的行,,没有主键,更新或删除表中特定行很困难,,因为没有安全的方法保证只涉及相关的行

    • 任意两行都不具有相同的主键值
    • 主键列不允许为NULL
  • SQL : 结构化查询语言(structured query language),sql是专门用来和 数据库通信的语言,DBMS都支持sql

  • 外键 foreign key : 某个表中的一列,,它包含另一个表的 主键值,,定义了两个表之间的关系

  • 可伸缩性 scale: 能够适应不断增加的工作量而不失败,,设计良好的数据库 或者 应用程序 称之为 可伸缩性好 scale well

DBMS
为什么使用mysql:
  • mysql开放源码,一般可以免费使用,甚至免费修改
  • mysql执行 非常快
  • 某些非常重要和声望的公司 也在用mysql
  • mysql很容易安装和使用

mysql缺点:

  • 不总是支持其他DBMS提供的功能和特性,,然而,这一点也正在逐步改善,mysql的各个新版本正不断的增加新特性,新功能
DBMS分类
  • 基于共享文件系统的DBMS

    • Microsoft Access
    • FileMaker
      用于桌面用途,通常不用于高端或更关键的应用
  • 基于客户机-服务器 的 DBMS

    • MySQL
    • Oracle
    • Microsoft SQL Server
      服务器部分: 是负责所有数据访问和处理的一个软件,数据服务器,,数据添加,删除,更新,所有请求都由 服务器软件 完成
      客户机: 与用户打交道的软件

服务器软件处理这个请求,,根据需要过滤,,丢弃,和排序的数据,,然后把结果送回到你的客户机软件

mysql命令
use 数据库名
show databases
show tables
# 查看表中的列
show columns from 表名
# 等于 show columns from 
describe 表名
# 显示创建数据库的 sql
show create database 数据库名
show create table 表名
# 显示当前登录用户的权限
show grants
# 显示服务器错误和警告
show errors
show warnings
# 显示广泛的服务器状态信息
show status

limit 3,4
limit 4 offset 3

sql不区分大小写:

  • sql关键字使用大写
  • 列和表名使用小写
子句clause

order by子句: desc 降序,默认升序

  • 如果想在多个列上降序排列,,,必须对每一个列进行desc
  • 在mysql中,,Aa视为相同,不区分大小写,如果你确实需要改变这种排序顺序,,可以设置校对,,校对在对 order by检索出来的数据排序时,起重要作用
# collate : 校对
select * from t_user order by user_name collate latin1_general_cs
  • order by 必须在 from子句之后,,limit必须位于 order by 之后
other
操作符 operator

or ,and,in,,,not

  • 在处理or操作符前,,优先处理AND操作符
  • 使用in取代or
    • in操作符的语法更清楚,,更直观
    • 在使用in时,计算的次序更容易管理,,因为使用的操作符更少
    • in操作符一般比 or操作符 执行更快
    • in 最大的有点,,是可以包含其他的select语句,,使得能够动态建立where子句
  • mysql支持notin,exists,between,,子句取反
通配符 wildcard

%: 任意字符出现任意次数,,这个代表搜索模式中给定位置的0个,1个或多个字符

  • %虽然可以匹配任何东西,,,但是不会匹配NULL

_ : _%一样,,但下划线只匹配单个字符而不是多个字符

select * from t_user where note like '_23'

通配符使用技巧:

  • 不要过度使用通配符,,如其他操作符能达到相同的目的,,应该使用其他操作符
  • 不要把他们放在搜索模式的开始处

搜索的时候,,注意输入的字符串后面有没有多余的空格:
解决:

  • 在搜索模式最后面添加一个%
  • 更好的办法,使用函数trim(),rtrim()

正则表达式

mysql用where子句,对正则表达式提供了初步的支持
regexp : 后所跟的东西作为正则表达式
如果相应的文本在 列值中找到,,会返回相应的行
^$ 定位符anchor

  • regexp不区分大小写,,如果要区分,,添加binary
select * from t_user where user_name regexp binary 'hehe'
  • 多个or条件 可以合并成一个 正则表达式
select * from t_user where user_name regexp binary '100|200'
  • 匹配几个字符串之一[]
select * from t_user where user_name regexp binary '[123]00'

[]是另一种 or语句的形式,,[123]也可以表示为[1|2|3]

  • 中括号中^表示取反 ,,,[^100]
select * from t_user where user_name regexp binary '^hehe[^100]'

[0-9]
[a-z]
. : 任意字符
为了匹配特殊字符必须使用\\为前导,,\\-,\\.
\\: 用来引用元字符,,具有特殊含义的字符
\\f : 换页
\\n : 换行
\\r : 回车
\\t : 制表
\\v : 纵向制表
\\\ : 匹配反斜杠
mysql要求两个反斜杠,,mysql自己解释一个,,正则表达式库解释另一个


匹配多个实例:
* :0个或者多个
+ : 一个多个多个 {1,}
?: 0个或者1个 {0,1}
{n}: 指定数目的匹配
{n,} : 不少于指定数目的匹配
{n,m} : 匹配数目的范围

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

select * from t_user where user_name regexp binary 'h{1,1}'
select  * from t_user where user_name regexp '[[:digit:]]{3}'
  • select 语句检测 正则表达式
    • regexp检查返回0: 没有匹配
    • regexp返回1 : 匹配
select 'hello' regexp '[a-z]'
计算字段

计算字段并不实际存在于数据库表中,,计算字段 是 运行时在select语句内创建的字段 field

在数据库服务器上完成这些 转换操作,,要比在客户机中 完成要快得多,,因为DBMS是 设计来 快速有效的完成这种处理的

函数
  • concat() : 连接两个列
    多数的DBMS使用+或者||来实现拼接,,,mysql使用concat()
select concat(user_name,'---',id) from t_user
  • rtrim(),ltrim(),trim() 删除尾部空格
  • 别名alias,,也称导出列derived column
  • mysql支持的算术运算符 +,-,*,/
  • select语句 省略from的时候,可以简单的访问和处理表达式
    select 4*2
    select trim('abc')
    select now()
    

函数分类:

  • 处理文本串: 删除,填充,大小写转换
  • 数值数据的 算术操作: 返回绝对值,进行代数运算
  • 处理日期和时间,,并从这些值中提取特定的成分:返回两个日期之差,,检查日期的有效性
  • 返回DBMS正式用的特殊信息: 用户登录信息,检查版本细节的系统函数
upper()
lower()
ltrim()
rtrim()
length()
substring()
locate()  ????
left()   ????
right()????
soundex()????

日期和时间 采用相应的数据类型和特殊的格式存储,,以便能快速和有效的排序或过滤,,并节省物理存储空间

curDate()
curTime()
Date()
DateDiff()
date_add()
date_format()
day()
dayofweek()
hour()
minute()
month()
now()
second()
time()
year()
addDate()????
addTime()????
# datetime 存储的是  带日期和时间的,,,,  如果只想比较日期,,用date() 处理
select DATE('2022-11-23 12:12:12')  #2022-11-23
select time('2022-11-23 12:12:12')  #12:12:12

# year(),,month()  查找指定月份
select * from t_user where year(birthday)=2005 and month(birthday)=9

数值处理函数:

abs()
cos()
exp()
mod()
pi()
rand()
sin()
sqrt()
tan()

聚集函数: aggregate function
运行在行组上,,,计算和返回单个值的函数
有时候,,我们实际想要的是汇总信息,,所以返回 实际表数据 是对时间和处理资源的一种浪费,,更不用说宽带了

# 忽略为null的行,,,为了获得多个列的平均值,,必须使用多个avg()
avg()
#包括空和非空
count(*) 
# 对指定的column进行统计,,忽略NULL
count(column)
# 最大的数值或者日期值,如果是文本数据,数据按相应的列排序,max是最后一行,,忽略NULL
max()
min()
# 可以计算多个列操作后的sum,,忽略NULL。。。sum(quantity*item_price)
sum()

distinct : 不能用于 count(*),distinct必须使用列名

#  平均值   有distinct  只考虑不同的平均值
select avg(distinct  prod_price)  
# with rollup  汇总,归纳
select count(*),sex from t_user group by sex with rollup

where是过滤行,having是过滤分组

select count(*),sex,sum(sex) from t_user group by sex having sum(sex)>2

having过滤基于分组聚集值,,而不是 特定行值
where在分组前进行过滤,having在数据分组后进行过滤

在这里插入图片描述

子查询

在select语句中,,子查询 总是 从内向外处理
由于性能的限制,不能嵌套太多的子查询,,子查询一般与in结合使用,但也可以用于测试,等于=,,不等于<>

select user_name,(select count(*) from t_user t where t.user_name=u.user_name) from t_user u
联结表

为什么要联结表:

  • 重复的信息浪费空间
  • 如果改动重复的信息,只需要改动一次即可
  • 如果有重复的数据,很难保证每一次的数据改数据的方式都相同,,如果不相同导致数据不一致

关系表的设计,,就是要保证把信息分解成多个表,,一类数据一个表,,各个表通过这些常用的值,相互关联

可伸缩性 scale : 能够适应不断增加的工作量而不失败,,,设计良好的 数据库 或者应用程序称之为 可伸缩性好 scale well

为什么要使用联结:

  • 有效的存储
  • 更方便的处理
  • 具有更大的可伸缩性

笛卡尔积 cartesian product : 由于没有联结条件的表关系返回的结果为笛卡尔积
叉联结 : cross join : 叉联结 又称 笛卡尔积

内部联结 equijoin : 等值连接

  • ansi sql 规范首选inner join,尽管使用where子句定义联结比较简单,,但是影响性能
  • 不要联结不必要的表,,联结的表越多,性能下降越厉害
  • 性能可能会受操作类型,,表中数据量,,是否存在索引或键,以及其他条件印象

高级联结:
起别名:

  1. 缩短sql
  2. 允许在单条select语句中,多次使用相同的表

自联结: 自己和自己联结,,此时联结所用的表时一张表
用自联结而不是子查询 : 通常作为外部语句,,用来代替从相同表中检索数据时使用的子查询语句,,虽然最终结果是相同的,,但有时候处理联结远比处理子查询快得多

标准的联结: 返回所有数据,甚至相同的列多次出现
自然连接: natural join
是一种特殊的等值连接,把等值连接中的重复属性去掉,,而等值连接并不去掉重复属性
外部联结:

  • left outer join
  • right outer join
组合查询

union : 将多条select 语句,,组合成一个结果集
组合查询: 通常称为 并union 或者 复合查询compound query
union规则:

  • 必须由两条或者两条以上的 select 语句组成
  • union中的每个查询必须包含相同的列,表达式,或聚合函数,,不过不需要以相应次序列出
  • 列数据类型必须兼容: 类型不必完全相同,但必须是DBMS可以 隐含的转换的类型

union查询结果自动去重,,,匹配所有行使用 union all
使用union之后,,只能使用一条 order by,必须出现在最后一条select语句之后,,对于结果集,不存在用一种方式排序一部分,,而又用另一种方式排序另外一部分的情况

其他

数据库经常被多个客户访问,,对处理什么请求以及用什么次序处理进行管理是mysql的任务
insert操作可能很耗时(特别是有很多索引需要更新时),,而且它可能降低等待处理select语句的性能
如果数据检索是最重要的,,则你可以通过在 insertinto之间,,添加关键字LOW_PRIORITY,指示mysql降低insert的优先级

insert low_priority into

insert…select : 将一个表的数据查找出来,,导入另一个表

insert into t_role (role_name, note) select role_name as name,note from t_role

insert...select : select查出来的别名不一定要和插入表的字段名一致,,select中的第一列对应要填充表的第一个列,,,,这对于从使用不同列名的表中导入数据非常有用

update : update更新多行,,并且在更新的这些行中的一行或者多行出现一个错误的时候,整个update操作会被取消,,错误发生前更新的所有行 会被恢复到他们原来的值
使用ignore : 即使发生错误,,也能继续更新

update jgnore hehe1 ...

为了删除某个列的值,,可以将那个字段 更新为NULL

删除表数据
truncate table : 实际是删除原来的表,并重新创建一个表,,而不是逐行删除表中的数据


主键不能使用不为NULL的列,,允许NULL值的列不能作为唯一标识

表的操作

创建表
if not exists : 仅仅在一个表不存在的时候,,创建,,,这个不会检查已有表的模式是否和你打算创建的表的模式相匹配,,只是查看表名是否存在

mysql不允许使用函数 作为 默认值,,只支持常量

修改表

# 添加一个列
alter table t_user add address varchar(50)
# 删除一个列
alter table t_user drop column address
# 删除表
drop table hehe
# 重命名一个表
rename table hehe2 to hehe
rename table hehe to hehe2,productnotes to products
# 修改表的 外键 foreign key
alter table hehe2 add constraint fk_hehe foreign key (id) references t_user(id)
auto_increment

auto_increment: 告诉mysql,,本列,,每当增加一行数据时自动增量,,每次执行insert时,mysql会对该列自动增量,,,
每个表只允许一个 auto_increment,,并且这个列必须被索引(如:通过使他成为主键)

覆盖auto_increment:在插入的时候,使用自己的值 去 代替 自动生成的值,,,后续的增量将开始使用该手动插入的值

获取生成的auto_increment值last_insert_id() …执行insert之后,,select last_insert_id()

引擎

他们具有各自不同的功能和特性,,为不同的任务选择正确的引擎能获得良好的功能和灵活性

  • innoDB : 事务处理引擎
  • Memory : 在功能上等同于MyISAM,,但由于数据存储在内存,不是磁盘,,速度很快,适合于临时表
  • MyISAM: 性能极高的引擎,不支持事务

外键不能跨引擎 : 使用一个引擎的表,,不能引用具有使用不同引擎的表的外键

视图

视图: 是一种mysql的select语句层次的封装,,可用来简化数据处理以及重新格式化基础数据,保护基础数据
虚拟的表,,,与包含数据的表不一样

  • 重用sql
  • 简化复杂的sql操作,,在编写查询后,可以方便的重用它而不必知道他的基本细节
  • 使用表组成部分而不是整个表
  • 保护数据,,可以给用户授予表的特定部分访问权限,而不是整个表的访问权限
  • 更改数据格式和表示,,,视图可返回与底层表的表示 和 格式不同的数据

可以对视图执行select操作,,过滤,排序数据,,将视图联结到其他视图或表,,甚至能添加和更新数据

性能问题: 每次使用视图时,都必须处理查询执行时所需要的任意一个检索,,如果你用了多个联结和过滤创建了复杂的视图,,或者嵌套了视图,可能会发现性能下降的厉害,,,
因此,,在部署使用了大量视图的应用时,,应该进行测试

视图的规则和限制:

  • 视图必须唯一命名
  • 对于可以创建的视图数目没有限制
  • 为了创建视图,必须有足够的访问权限,,,这些限制通常由数据管理人员授予
  • 视图可以嵌套,,即可以利用从其他视图检索出来的数据构造一个视图
  • order by 可以用在视图中,,,但是如果该视图检索数据 select 中也含有 order by,,那么该视图中的 order by 会被覆盖
  • 视图不能索引,,也不能有关联的触发器或默认值
  • 视图可以和表一起使用
# 创建视图
create view hehe as select * from t_user
# 创建视图的时候,,使用别名,,重新格式化检索出来的数据
create or replace view hehe as select user_name as userName from t_user

视图中的 where子句,,,和视图的where子句,,两组子句,,将自动组合
并非所有视图都是可更新的,,,如果mysql不能正确的确定被更新的基数据,,则不允许更新,如:group byhaving,联结,,子查询,,并,,聚集函数,,distinct,
视图主要用于数据检索,,,一般将视图用于检索而不用于更新

存储过程

存储过程: 为以后的使用而保存的一条或多条mysql语句的集合
为什么要使用存储过程:

  • 通过把处理封装在容易使用的单元中,,简化复杂的操作
  • 不要求反复建立一系列的处理步骤,,这保证了数据的完整性。。。这一点的延伸就是防止错误,将所使用的的代码写入同一个存储过程,,防止错误,,保证了数据的一致性
  • 简化对变动的管理,,如果表名,列名或者业务逻辑,或别的内容,,有变化,,只需要更改存储过程的代码,,使用它的人员甚至不需要知道这些变化,,这一点的延伸就是安全性,,通过存储过程对基础数据的访问,,减少了数据讹误的机会
  • 提高性能,,使用存储过程比使用单独的sql语句快
  • 存在一些只能用在单个请求中的mysql元素和特性,,存储过程可以使用他们来编写更强更灵活的代码
    简单,,安全,,,高性能
    缺点:
  • 存储过程的编写比 基本的sql语句复杂
  • 你可能没有创建存储过程的安全访问权限,,许多数据库管理员限制存储过程的创建权限,,允许用户使用存储过程,,但是不允许他们创建存储过程

mysql将 编写存储过程的安全和访问,,与 执行存储过程的 安全和访问 区分开来,,
这样,即使你不能编写自己的存储过程,也仍然可以在适当的时候执行别的存储过程
OUT: 从存储过程中传出一个值 给 调用者
IN : 传递给存储过程
INOUT : 对存储过程传入传出
存储过程的代码位于 BEGINEND之间

# 定义分隔符
delimiter  //

create procedure productpricing1()
begin
    select price from products;
    # end后面分隔符
end//

# 还原分隔符
delimiter ;


# 调用存储过程
call productpricing1()

# 删除存储过程
drop procedure productpricing1
# 如果不存在,,去删除存储过程,,会报错,,,使用 drop procedure if exists
drop procedure  if exists productpricing1
delimiter  //
create procedure heheprocedure(
out minprice int,
out maxprice int,
out avgprice int
)
begin
   select min(price) into minprice from products;
   select max(price) into maxprice from products;
   select avg(price) into avgprice from products;
end//


delimiter ;

# MySQL的变量都必须以`@`开始
call heheprocedure(@resultmin,@resultmax,@resultaverage)

# 显示变量
select @resultmax,@resultmin,@resultaverage

declare: 定义局部变量,,,要求指定变量名,,数据类型
comment : 不是必须的,,但如果给出,可以使用show procedure status

delimiter //
create procedure  ordertotal01(
in onumber int,
in taxable boolean,
out ototal decimal(8,2)
)comment 'hehe ordertotal'
begin
    -- 定义一个变量
    declare total decimal(8,2);
    declare taxrate int default 6;

    -- 存入局部变量total中
    select sum(price*onumber) from products where prod_id=1 into total;

    -- taxable 存在
    if taxable then
        select total+(taxrate/100*total) into total;
    end if;
    -- 将最后计算的值存入 ototal
    select total into ototal;

end//

delimiter ;
#  0表示 false,,,1表示true
call ordertotal01(20,1,@total)
select @total
# 存储过程的创建
show create procedure ordertotal01
# 列出所有的存储过程,,显示了 何时,由谁创建,等详细信息的
show procedure status
触发器

触发器: 某个表发生更改的时候做自动处理
创建触发器:

  • 唯一的触发器名 : 在每一个表中唯一,,但不是在每一个数据库中唯一
  • 触发器关联的表
  • 触发器相应的活动 insert delete update
  • 触发器何时执行 : 处理之前或者之后

如果 before触发器失败,,,mysql将不会执行 after触发器
只有表才支持触发器,,视图不支持,,临时表也不支持

create trigger newproduct3 after insert  on products
    for each row select 'hehe added1231' into @result3


insert into products (note_id,prod_id) values(5,5)

select @result3

drop trigger newproduct1

触发器不能更新或者覆盖,,,只能先删除,,再创建
before用于数据验证和净化,,,,保证插入表中的数据确实是需要的数据
在这里插入图片描述

create trigger deleteproduct before delete on products
    for each row
    # begin end 块的好处是 触发器能够容纳多条sql语句
    begin
        insert into t_role(role_name, note) values (old.prod_id,old.prod_id);
    end;

触发器的使用:

  • 触发器 创建审计跟踪,,,使用触发器,,把更改(如果需要,,甚至还有之前和之后的状态)记录到另一个表非常容易
    遗憾的是,,mysql触发器不支持call语句,,不能在触发器内调用存储过程,,所需的存储过程代码需要复制到触发器中
事务处理 transaction processing

用来维护数据库的完整性,,要么完全执行,,要么完全不执行
名词:
事务 transaction: 指一组sql语句
回退 rollback: 撤销指定sql语句的过程
提交commit : 为存储的sql语句结果写入数据库表
保留点 savepoint: 事务处理中设置的临时占位符 place-holder,,,你可以对他发布回退,,(与回退整个事务处理不同)

哪些语句可以回退: insert update delete
mysql语句都是直接针对数据库表执行和编写的,,,这就是所谓的隐含提交implicit commit,即提交操作是自动执行的

start transaction
savepoint delete1
# 保留点,,mysql要知道回退到何处
rollback to delete1

保留点 在 事务处理完成时,,自动释放,,,也可以使用release savepoint释放保留点

更改默认提交行为:
set autocommit=0 : 默认mysql行为是自动提交,,,设置为0,,表示false
这个标志 ,,针对每个连接,而不是服务器

其他

字符集: 字母和符号的集合
编码: 某个字符集成员的内部表示
校对: 规定字符如何比较的指令

# 所有可用的字符集  以及 每个字符集的描述和默认校对
show  character set

# collation 校对,,,,显示所有的可用的校对,,他们适用的字符集,可以看到有的字符集不止一种校对
show collation
create table mytable(
    column1 int,
    column2 varchar(20) character set latin1 collate latin1_general_ci
)default character set hebrew
collate hebrew_general_ci

校对: 在对order by子句检索出来的数据排序 起 重要作用

# collate : 校对
select * from t_user order by user_name collate latin1_general_cs

collate : 可以用于 order by ,还可以用于 group by,having,聚集函数,别名

convert() : 转换数据类型

select convert(now(),signed )

在这里插入图片描述

权限管理

mysql administrator : 交互的,方便管理访问控制

mysql的用户账号 存储在 名为 mysql的 数据库的user

# 创建用户
create user hehe identified by 'hehe'
# 重命名   ,,也可以update,,但是不建议
rename user hehe to cc
#删除用户   删除用户账号和所有相关的账号权限,,,mysql5之前,只能用来删除账号,,不能删除相关权限,,如果使用旧版的mysql,,需要先revoke撤回该账号的相关权限,,然后再drop user
drop user cc

# 显示这个账户有的权限
show grants for hehe

# 给 hehe 用户  设置 test09数据库 所有表的  select 权限
grant select on test09.* to hehe
# grant 的反操作 是 revoke 
# revoke  ..from
revoke select on test09.* from hehe

# 多个权限 ,  分割
grant select,insert on test09.* to hehe


# 更新指定用户的密码
set password for hehe =password('sillyb')
# 在不指定用户名的时候,,set password 更新当前登录用户的口令
set password = password ('root')
优化mysql
  • show variables ... show status :可能需要调整内存分配,缓冲区大小等
  • mysql是一个多用户多线程的DBMS,他经常执行多个任务,,show processlist显示所有活动进程,,以及他们的线程id和执行时间,,,使用kill命令,,,终结某个特定的进程
  • 总有不止一种方法编写同一个select语句,,应该试验 联结,,并,,子查询,,找出最佳方法
  • 一般来说,存储过程执行的比 一条一条的执行其中的mysql快
  • 应该总是使用正确的数据类型
  • 绝对不要检索比需求还要多的数据,,换言之,不要使用select *
  • 导入数据时,,应该关闭自动提交,,,删除索引,,包括fulltext索引,,然后在导入完成后再重建他们
  • 一系列的 or 条件,,通过使用 union 连接起来
  • 索引改善数据检索性能,但损害数据插入,删除,,更新,,如果你有一些表,,他们收集数据且不经常被搜索,,索引可以根据需要添加和删除
  • like 很慢,,最好使用fulltext
  • 数据库是不断变化的实体,,一组优化良好的表一会儿后就可能面目全非了,,由于表的使用和内容的修改,,理想的优化和配置也会改变
注意事项
  1. 如果是字符串需要 限定引号,与数值列进行比较,,不用引号
select * from t_user where id =6
  1. 在一个列不包含值的时候,,称其为包含空值NULL,,无值(no value)
select * from t_user where note is null
  1. 使用update 或者 delete的时候,应该先 select 进行测试,确保过滤的是正确的记录
  2. 强制实施引用完整性数据库,,这样mysql将不允许删除 具有与其他表相关联的数据的行
名词概念

sql过滤 和 应用过滤
让客户机应用 处理数据库的工作,会极大的影响应用的性能,,并且使所创建的应用完全不具备可伸缩性,,,此外,,如果在客户机上过滤数据,,服务器不得不通过网络发送多余的数据,,这导致网络宽带的浪费

普遍认可的好习惯:

  • 不更新主键列中的值
  • select * 检索不需要的列,,通常会降低检索和应用程序的性能

表中具有一些特定: 定义了数据在表中如何存储

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安科瑞水电预付费平台,远程控制,高校宿舍、员工宿舍、商场等多场合适用

安科瑞 司红霞 一、引言 预付费水表是一种为了适应“先付费后用水”的管理原则和系统而开发的水表产品其设计是在水表基表上加装了电子附加装置和控制阀&#xff0c;要求用户先预付&#xff0c;一定的费用或购置一定数量的水量&#xff0c;将预付费的信息输入水表后才可正常用…

四轴斜转魔方

目录 四轴斜转魔方 1&#xff0c;魔方三要素 2&#xff0c;公式推导 &#xff08;1&#xff09;调整8个角块位置 &#xff08;2&#xff09;调整6个中心块位置 &#xff08;3&#xff09;调整角块方向 四轴斜转魔方 1&#xff0c;魔方三要素 &#xff08;1&#xff09;组…

Sentinel实现服务降级并与api解耦

Sentinel怎样实现熔断降级 熔断降级介绍 sentinel支持服务的熔断降级 熔断类似于保险丝&#xff0c;在超出了阈值的情况下&#xff0c;在一定的时间内不会执行业务逻辑&#xff0c;直接执行服务降级的方法。服务降级利用本地fallback方法&#xff0c;返回一个有好的提示给客…

Scala配置和Spark配置以及Scala一些函数的用法(附带词频统计实例)

文章目录配置Spark配置Scala生成RDDfilter过滤器map方法flatMap方法reduceByKeyspark下wordcount程序参考先给出spark和Scala的下载地址&#xff0c;这是我用的版本https://pan.baidu.com/s/1rcG1xckk3zmp9BLmf74hsg?pwd1111也可以自己去官网下载。配置Spark 解压文件到softw…

public,private,protected,default的区别

public public&#xff08;公开&#xff09;表示任何人都可以访问和使用该元素&#xff1b; public class Test {public static void main(String[] args) {Person pnew Person();System.out.println(p.name);//输出小明} } class Person{public String name"小明"…

Go 开发环境安装之Goland和vscode

一、前言 Go语言或将成为新的主力开发语言&#xff0c;Go是google开发的一种静态强类型、编译型、并发型&#xff0c;并具有垃圾回收功能的编程语言&#xff0c;所以我们有必要学习并掌握它。第一件事情&#xff0c;就是把环境搭建起来&#xff0c;大家可以跟着步骤一起将Go语…

【计算机网络】数据链路层:点对点协议PPP

对于点对点链路&#xff0c;目前使用最为广泛的数据链路层协议是点对点协议PPP。 简单&#xff08;首要要求&#xff09; 封装成帧&#xff1a;保证数据传输的透明性 多种网络层协议&#xff1a;能够在同一条物理链路上同时支持多种网络层协议。 多种类型链路&#xff1a;能…

2020牛客暑期多校训练营(第十场)I.Tournament(构造/贪心)

题目 t(1<t<30)组样例&#xff0c;n(2<n<300)个球队&#xff0c; 每个球队都和其它所有球队比一场&#xff0c;一共有场比赛。 每天只比一场比赛&#xff0c;每个球队会在其第一场比赛开始时到&#xff0c;最后一场比赛后走。 安排一个日程表&#xff0c;使所有…

Linux多线程C++版(五) 线程同步和线程互斥

目录1.线程同步和线程互斥2.线程互斥案例---ATM取钱--没有使用互斥锁3.线程互斥----互斥锁(互斥量)4.互斥锁创建和销毁5.互斥锁上锁和解锁6.线程互斥案例---ATM取钱--使用互斥锁7.互斥锁属性创建和销毁8.互斥锁属性之一---进程共享属性操作9.互斥锁属性之一----互斥锁类型操作1…

[附源码]计算机毕业设计JAVA人口老龄化社区服务与管理平台

[附源码]计算机毕业设计JAVA人口老龄化社区服务与管理平台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; …

Apollo 应用与源码分析:Monitor监控 - Monitor_managerecurrent_runner分析

目录 monitor_manager 分析 结构分析 单例模式宏定义 描述现在的系统状态 HMI上显示的状态信息 仿真判断状态 判断是不是自动驾驶状态 日志缓存 当前node 所有monitor 的reader 管理map 开启一次监控 start frame分析 end frame分析 recurrent_runner 分析 结构…

计算机键盘用途及快捷键

用途&#xff1a; 电脑键盘上有那么多按键&#xff0c;到底都有什么作用呢&#xff1f; 几个重要的按键&#xff0c;一起来了解一下吧。 最上面一排&#xff1a; F1帮助 F2改名 F3搜索 F4地址 F5刷新 F6切换 F10菜单 1、键盘中间区域的所有输入按键。 一共是26个英文字母…

初次接触氛围系统架构,聊聊我这三个月的理解

本文主要介绍了作者对于氛围中心的业务理解。从氛围的概念出发&#xff0c;阐述了氛围系统的必要性&#xff0c;然后展示了配置端的数据写入、调用端的配置读取等氛围系统的架构细节&#xff0c;最后作者提出了一些对于氛围中心未来的想法和思考。概述▐ 氛围的概念氛围是能够…

V5.1.1,新版发布|软件安全大于一切

主要内容&#xff1a;本次版本除了常规的BUG修复&#xff0c;最重要的是对系统安全全面升级&#xff0c;加强了系统安全检测机制&#xff0c;更新了Thinkphp核心版本&#xff0c;强化了密码等安全。 本次新增了在线用户&#xff0c;支持在线用户下强制下线处理。 本次新增的超级…

java项目-第161期ssm弹幕视频网站系统_ssm毕业设计_计算机毕业设计

java项目-第161期ssm弹幕视频网站系统_ssm毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm弹幕视频网站》 该项目分为2个角色&#xff0c;管理员、用户。 用户可以浏览前台视频信息、商品信息&#xff0c;并且可以进行购买。 管理员角色拥有的权限最…

基于jquery 实现导航条高亮显示的两种方法

本篇文章是基于jquery实现导航菜单高亮显示&#xff0c;当点击不同导航菜单实现当前点击的菜单是高亮的&#xff0c;有需要的朋友可以关注下本文 实现原理&#xff1a;当选中当前元素时&#xff0c;给当前元素添加样式&#xff0c;同级元素移除样式。 点击不同的导航菜单实现…

基于SpringBoot的校园志愿者管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;HTML、Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#…

Java23种设计模式之第三弹-工厂模式

说起工厂&#xff0c;我们第一反应是制作什么东西的吧~。在现实生活中&#xff0c;工厂 &#xff0c; 就是用于生成一些特定事物的厂商。 回到我们此处说的工厂模式上&#xff0c;什么是工厂模式呢 &#xff0c; 顾名思义&#xff0c;就是生成我们的对象的类就会称成为工厂。 …

机器学习模型与backtrader框架整合

原创文章第116篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 北京疫情似乎还没有到拐点&#xff0c;但这三天结束后应该会到来。 今天重点说说&#xff0c;机器学习模型整合到我们的回测框架中&#xff0c;并与backtrader连接起来回测…

【Python模块】logging 日志模块

当入门一门语言时&#xff0c;最简单最直观的打印日志信息方式就是使用 print() 函数了&#xff0c;而这毕竟是自己练习和测试才会这样做。当参与项目时一定会去使用日志模块实现日志信息的打印和记录&#xff0c;而 Python 提供了内置的日志模块 logging&#xff0c;有必要深入…