mysql语句进阶
1.null
mysql> create table worker(id int not null,name varchar(8) not null,pass varchar(20) not null);
mysql> insert into worker values(1,'HA','123456');
mysql> insert into worker values(1,'LB',null);
ERROR 1048 (23000): Column 'pass' cannot be null 不能为null
mysql> insert into worker values(2,'HPC','');
mysql中的NULL是占用空间的。是一个数值。 null 和''是不同的。
2.default 设定字段的默认值
mysql> create table test2(name varchar(8) not null,dept varchar(25) default 'SOS');
mysql> insert into test2 (name) values ('kko');
如果时间字段,默认为当前时间,插入0时,默认为当前时间。
如果是enum 类型,默认为第一个元素。
3.auto_increment字段约束
对于主键,这是非常有用的。可以为每条记录创建一个惟一的标识符(最大值加1)
mysql> create table items ( id int not null auto_increment primary key , label varchar(20) not null);
mysql> insert into items (label) values ('aaba');
mysql> insert into items values (9,'aaba');
再插入一条id将为多少
mysql> insert into items (label) values ('abc');
delete 不能清除auto_increment
mysql> delete from items;
mysql> insert into items (label) values ("aaaa");
方法二:删除表中所有记录,清auto_increment 值。
mysql> truncate table items;
mysql> insert into items(label)values('abv');
4.索引
为了加快搜索速度,减少查询时间 。
1 索引是以文件存储的。如果索引过多,占磁盘空间较大。而且他影响: insert ,update ,delete 执行时间。
2索引中数据必须与数据表数据同步:如果索引过多,当表中数据更新的时候后,索引也要同步更新,这就降低了效率。
索引的类型
1、普通索引
2、唯一性索引
3、主键索引(主索引)
4、复合索引
普通索引
最基本的索引,不具备唯一性,就是加快查询速度
注:可以使用key,也可以使用index 。index 索引名称(字段) ,索引名称,可以加也可以不加,不加使用字段名作为索引名。。
mysql> create table demo( id int(4), name varchar(20), pwd varchar(20), index(pwd) );
注意:index和 key 是相同的
mysql> create table demo1( id int(4), name varchar(20), pwd varchar(20), key(pwd) );
mysql> create table demo2( id int(4), name varchar(20), pwd varchar(20), key index_pwd(pwd) ); #加上索引名称
查看索引
注:如果Key是MUL, 那么该列的值可以重复, 该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL。就是表示是一个普通索引。
我们先删除索引
mysql> alter table demo drop key pwd; 注意此处的pwd指的是索引的名称,而不是表中pwd的那个字段
再用alter添加
mysql> alter table demo add key(pwd);
唯一索引
与普通索引基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一,用来约束内容,字段值只能出现一次。应该加唯一索引。唯一性允许有NULL值<允许为空>。
mysql> create table demo3(id int(4) auto_increment primary key, uName varchar(20), uPwd varchar(20), unique index (uName));
方法二:修改表时加唯一索引
alter table 表名 add unique 索引名 (字段);
mysql> alter table demo3 drop key uName;
mysql> alter table demo3 add unique(uName);
主键索引
查询数据库,按主键查询是最快的,每个表只能有一个主键列,可以有多个普通索引列。主键列要求列的所有内容必须唯一,而索引列不要求内容必须唯一,不允许为空
mysql> create table demo4 (id int(4) not null auto_increment primary key,name varchar(4) not null );
方法二:创建表后添加<不推荐>
删除遇到这种情况是auto_increment的原因
mysql> alter table demo4 change id id int(4) not null;
mysql> alter table demo4 drop primary key;
再添加
mysql> alter table demo4 change id id int(4) not null primary key auto_increment;
总结:主键索引,唯一性索引区别:主键索引不能有NULL,唯一性索引可以有空值
复合索引
索引可以包含一个、两个或更多个列。两个或更多个列上的索引被称作复合索引
例:创建一个表存放服务器允许或拒绝的IP和port,要记录中IP和port要唯一。
mysql> create table firewall ( host varchar(15) not null ,port smallint(4) not null ,access enum('deny','allow') not null, primary key (host,port));
mysql> insert into firewall values('10.96.52.46',22,'deny');
mysql> insert into firewall values('10.96.52.46',21,'allow');
mysql> insert into firewall values('10.96.52.46',21,'allow');
ERROR 1062 (23000): Duplicate entry '10.96.52.46-21' for key 'PRIMARY'
5.外键
外键:每次插入或更新时,都会检查数据的完整性。
注:创建成功,必须满足以下4个条件:
1、确保参照的表和字段存在。
2、组成外键的字段被索引。
3、必须使用type指定存储引擎为:innodb.
4、外键字段和关联字段,数据类型必须一致。
例子:我们创建一个数据库,包含用户信息表和订单表
mysql> create database market;
mysql> create table `user`(id int(11) not null auto_increment, name varchar(50) not null default '', sex int(1) not null default '0', primary key(id))ENGINE=innodb;
#创建时,如果表名是sql关键字,使用时,需要使用反引号``
mysql> create table `order`(o_id int(11) auto_increment, u_id int(11) default '0', username varchar(50), money int(11), primary key(o_id), index(u_id), foreign key order_f_key(u_id) references user(id) on delete cascade on update cascade) ENGINE=innodb;
注:
1:on delete cascade on update cascade 添加级联删除和更新:
2::确保参照的表user中id字段存在。组成外键的字段u_id被索引。必须使用type指定存储引擎为:innodb。
外键字段和关联字段,数据类型必须一致。
插入测试数据
mysql> insert into user(name,sex)values('HA',1),('LB',2),('HPC',1);
mysql> insert into `order` (u_id,username,money)values(1,'HA',234),(2,'LB',146),(3,'HPC',256);
测试级联删除:
mysql> delete from user where id=1; 删除user表中id为1的数据
测试级联更新:
mysql> update user set id=6 where id=2;
测试数据完整性
外键约束,order表受user表的约束
在order里面插入一条数据u_id为5用户,在user表里面根本没有,所以插入不进去
mysql> insert into user values(5,'Find',1);
mysql> insert into `order` (u_id,username,money)values(5,'Find',346);
方法二:通过alter table 创建外键和级联更新,级联删除
mysql> create table order1(o_id int(11) auto_increment, u_id int(11) default '0', username varchar(50), money int(11), primary key(o_id), index(u_id))type=innodb;
mysql> alter table order1 add foreign key(u_id) references user(id) on delete cascade on update cascade,type=innodb;
mysql> alter table order1 add constraint `bk`foreign key(u_id) references user(id) on delete cascade on update cascade,type=innodb; 指定外键名称
mysql> show create table order1;
删除外键:
语法
alter table 数据表名称 drop foreign key 约束(外键)名称
mysql> alter table order1 drop foreign key order1_ibfk_1;
mysql> show create table order1;
6.视图
创建视图
语法:create view视图名称(即虚拟的表名) as select 语句。
mysql> create view bc as select b.bName ,b.price ,c.bTypeName from books as b left join category as c on b.bTypeId=c.bTypeId ;
可以按照普通表去访问。
另外视图表中的数据和原数据表中数据是同步的。
mysql> show create view bc \G
更新或修改视图
alter view视图名称(即虚拟的表名) as select 语句。
update view视图名称(即虚拟的表名)set
mysql> alter view bc as select b.bName ,b.publishing ,c.bTypeId from books as b left join category as c on b.bTypeId=c.bTypeId ;
mysql> update bc set bName='HA' where price=34;
删除视图
drop view 视图名。
mysql> drop view bc;
mysql语句进阶的更多相关文章
- MySQL第二讲 一一一一 MySQL语句进阶
通过命令来备份数据库: 通过数据库软件里面的,mysqldump模块来操作,如下: mysqldump -u root db1 > db1.sql -p; //没有-d就是备份的时候:数据表结构 ...
- mysql 开发进阶篇系列 55 权限与安全(安全事项 )
一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...
- MYSQL(进阶篇)——一篇文章带你深入掌握MYSQL
MYSQL(进阶篇)--一篇文章带你深入掌握MYSQL 我们在上篇文章中已经学习了MYSQL的基本语法和概念 在这篇文章中我们将讲解底层结构和一些新的语法帮助你更好的运用MYSQL 温馨提醒:该文章大 ...
- 如何根据执行计划,判断Mysql语句是否走索引
如何根据执行计划,判断Mysql语句是否走索引
- 让dede运行php代码和mysql语句
一.dede运行php代码 举例1: {dede:name runphp='yes'} $str = "hello ";@me = $str;@me .= "world& ...
- php代码优化,mysql语句优化,面试需要用到的
首先说个问题,就是这些所谓的优化其实代码标准化的建议,其实真算不上什么正真意义上的优化,还有一点需要指出的为了一丁点的性能优化,甚至在代码上的在一次请求上性能提升万分之一的所谓就去大面积改变代码习惯, ...
- mysql语句:批量更新多条记录的不同值[转]
mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...
- Thinkphp用exp表达式执行mysql语句,查询某字段不为空is not null,自动增值
Thinkphp用exp表达式执行mysql语句,查询某字段不为空is not null,自动增值 Thinkphp 的文档经常不够完整的表达MYSQL的各种组合,is not null在thinkp ...
- MySQL语句进行分组后的含有字段拼接方法
MySQL语句: SELECT GROUP_CONCAT(DISTINCT transaction_no) FROM `lm_wh_trans` GROUP BY staff_code; 如果tran ...
随机推荐
- Linux命令应用大词典-第33章 X Window
33.1 xhost:X服务器的访问控制程序 33.2 xinit:X Window系统初始化 33.3 Xlsclients:在显示器中列出正在运行的客户端应用程序 33.4 xlsfonts:显示 ...
- Python简要标准库(2)
集合 堆 和 双端队列 1.集合 创建集合 s = set(range(10)) 和字典一样,集合元素的顺序是随意的,因此不能以元素的顺序作为依据编程 集合支持的运算 a = set([1,2,3]) ...
- 推荐:一个适合于Python新手的入门练手项目
随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...
- leetcode-二进制手表
二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59). 每个 LED 代表一个 0 或 1,最低位在右侧. 例如,上面的二进制手表读取 “3:25”. ...
- JavaScript 作用域链范例
函数在执行的过程中,先从自己内部找变量 如果找不到,再从创建当前函数所在的作用域去找,以此往上 注意找的是变量的当前状态 范例 例1 var a=1 function fn1() { function ...
- wamp下安装https 实现 ssl 协议,主要是编写小程序通讯
也不知道腾讯为啥要这个限制,是想卖他的服务器资源么 简单几句话 1 wamp3.0.X的版本不行,我折腾了一天半,放弃了,换成wamp2.5 一次通过 2 证书 去腾讯云申请,单独域名的可以申请免费的 ...
- 官方文档 恢复备份指南一 Introduction to Backup and Recovery
1.备份分为:物理备份和逻辑备份 物理备份:备份数据文件 控制文件 归档日志文件 逻辑备份:EXP EXPDP备份等 物理备份为主,逻辑做补充 2.错误的类型 ...
- 常用正则表达式,你要的都在这里(校验字符,数字,特殊需求qq,电话等)
一.校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9 ...
- Java 抽象类和Final关键字
抽象类 用abstract关键字来修饰一个类时,这个类叫抽象类: 用abstract关键字来修饰一个方法时,该方法叫做抽象方法. 含有抽象方法的类必须被定义而为抽象类,抽象类必须被继承,抽象方法必须被 ...
- union查询
select id, uid, money, FROM_UNIXTIME(created) as created, type FROM ( #type=1是 cjw_finance_bonus ...