当前位置: 主页 > 数据库

易语言读取数据库字段-c语言读取串口数据

发布时间:2023-03-15 07:05   浏览次数:次   作者:佚名

③检索完整个表后,将得到虚表返回给用户。

EXISTS内部有一个子查询语句(SELECT … FROM…), 称为EXIST的内查询语句,其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值(true/false)。

举例:

SELECT * FROM dept a WHERE EXISTS(SELECT 1 FROM employee b WHERE a.deptnu = b.deptnu);

在dept表中遍历每一条数据,同时对每一条数据判断是否输出,输出条件是:遍历表b,如果a中当前条(即a表中的指针在两个语句中是同一个)的deptnu属性与b中有相同的,那么变返回true。

连接系列 外连接:左连接与右连接

1.左连接,把左边的全部查出来,右边有的则匹配,没有则为null

表1:employee

在这里插入图片描述

表2:dept

在这里插入图片描述

SELECT a.dname,b.* from dept a left join employee b on a.deptnu = b.deptnu;

原理:dept表(左表)中的所有信息都要显示,employee表(右表)中的信息只有匹配到的才放右边。

当左多右少时:

在这里插入图片描述

具体参见:left join 基本用法

等值连接

只返回两表相连相等的行

如下代码,在表a和表b中,查找id相等的行,然后返回a表中的name和b表中的class

select a.name,b.class from A a inner join B b on a.id=b.A_id

这个代码等同于

select a.name,b.class from A a,B b where a.id=b.A_id

联合查询

联合查询:就是把多个查询语句的查询结果结合在一起

主要语法1:… UNION … (去除重复) 主要语法2:… UNION ALL …(不去重复)

(select * from employee a where a.job = '销售员'  order by a.sal limit 999999 ) union  (select * from employee b where b.job = '文员' order by b.sal desc limit 999999);

注意:order by有时会出现排序失效的问题,在后面加上limit 99999即可。

事务

定义:指对数据库进行读或写的一个操作过程。

特性(ACID):

①原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

②一致性(Consistency):事务前后数据的完整性必须保持一致。

③隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行

④持久性(Durability):持久性是指一个事务一旦提交,对数据库中数据的改变就是永久性的。

引擎:使用事务的话易语言读取数据库字段,表的引擎要为innodb引擎

例如:

alter table account engine = 'MyISAM';	// 更换引擎

发现不用commit就已经修改数据库,事实上,其他引擎都不支持事务操作(无法回滚)。

事务实战

事务的开启与提交

开启:begin;m

提交:commit;

回滚:rooback;

举例:首先在窗口1登录数据库,创建表然后begin,开启事务,之后插入数据

使用select * from account发现插入成功

在这里插入图片描述

在窗口2登录数据库,然后查询

在这里插入图片描述

发现并没有

因为在commit之前,变化只存在于内存中,数据库(磁盘)中并没有变化,commit之后便可以更新到磁盘。从而一个事务在完成之前,是不影响另一个事务读、写数据库的。

注意:如果想要用rollback的话,最好不要设置autocommit = 1;

另一种方法(这种方法是暂时生效的,exit后重新进入又会恢复默认易语言读取数据库字段,默认开启):

如果不使用方法,直接使用语句的话,可以通过开启/关闭autocommit决定是否自动提交

查看是否自动提交

show variable like 'autocommit';

设置自动提交

set autocommit = 1; # 表示输入语句后自动提交,即更新到数据库

如果要永久生效的话,需要修改配置文件

vi /etc/my.cnf

在[mysqld]下面加上:autocommit = 1

视图

查看基表

在这里插入图片描述

创建视图

create or replace view employ(empno,ename,job,mgr,deptnu) as select empno,ename,job,mgr,deptnu from employee;

在这里插入图片描述

修改基表的话,视图也会修改

update employee set job = '销售员' where empno = '1012';

在这里插入图片描述

删除视图

drop view employ;

视图是逻辑上的表,内容由查询来定义,并在引用时动态生成。

在这里插入图片描述

优点:

简单性:不用关心视图是怎么处理数据的(背后的表结构,关联、筛选条件),只需使用即可。

安全性:用户有权去访问某个视图,但是不能访问原表,这样可以保护原表的数据。

数据独立:视图结构确定后,可屏蔽表结构变化(如新增列)对用户的影响

减少冗余:视图是逻辑上的表,不占用数据存储的资源。

缺点:sql server必须把视图转换成对基本表的操作,如果这个视图由复杂的多表查询定义,那么即使是视图的一个简单操作,sql server也要把它变成一个复杂的结合体,需要花费一定时间。

触发器

定义:监视某种情况,并触发某种操作

创建语法:

create trigger 触发器名称  after/before   insert/update/delete on 表名  
        for each row
        begin
        sql语句;
        end

举例:创建一个员工迟到表

create table work_time_delay(
            empno int not null comment '雇员编号',
            ename varchar(50) comment '雇员姓名',
            status int comment '状态'
            );

创建触发器:当work_time_delay插入数据后,会更新employee中的sal,new:指的是事件发生before或者after,对应的新表

use xiaohong;
create trigger trig_work after insert on work_time_delay 
for EACH ROW
BEGIN
update employee set sal=sal-100 where empno=new.empno;
end

当我们对work_time_delay 进行插入操作后

INSERT into work_time_delay VALUES ('1009','唐僧','1');

会发现他的sal已经执行-100操作

mysql存储引擎

存储引擎:基于表的数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行增删改查等操作,不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,还可以获得特定的功能。

(类似于不同用途的车应该使用不同的发动机)

(1)查看数据库支持的引擎

show engines;

(2)建表时指定引擎

create table yinqing(id int,name varchar(20)) engine = 'InnoDB';

(3)修改引擎

alter table yinqing engine = 'MyISam';

当然也可以直接修改配置文件

vi /etc/my.cnf

在[mysqld]下面加入

default-storage-engine = MyISam;

保存后重启即可

索引的使用 创建索引

(1)创建表的时候创建(注意会自动成为主键索引)

如下是创建关于id的唯一索引

create table test (
                        id int(7) zerofill auto_increment not null,
                        username varchar(20),
                        servnumber varchar(30),
                        password varchar(20),
                        createtime datetime,
                        unique (id)
                  )DEFAULT CHARSET=utf8;

(2)直接为表添加索引

如下,index是普通索引关键字

语法:
     alter table 表名 add index 索引名称 (字段名称);
 eg: 
     alter table test add unique unique_username (username);
​
注意:假如没有指定索引名称时,会以默认的字段名为索引名称
​
注意:假如没有指定索引名称时,会以默认的字段名为索引名称

查看索引

语法:show index from 表名\G
eg: show index from test\G

分别表示主键索引、唯一索引、普通索引

在这里插入图片描述

在这里插入图片描述

删除索引

语法:alter table 表名 drop index 索引名;
eg:alter table test drop index createtime;
eg:alter table test drop primary key;
注意:在有自增的情况下,必须先删除自增,才可以删除主键

创建主键索引

1)创建表的时候创建
​
2)直接为表添加主键索引
   语法:alter table 表名 add primary key (字段名);
   eg:alter table test add primary key (id);

全文索引

关键词:fulltext

创建方法:

方法一:创建表的时候创建全文索引

create table command (
id int(5) unsigned primary key  auto_increment,
name varchar(10),
instruction varchar(60),
fulltext('instruction')
)engine=MyISAM;

方法二:

通过alter添加

alter table command  add fulltext(instruction);

作用:解决字段是否包含的问题,可以极大提高数据的查询速度(必须是文本类型 )

例如:

普通查询

select * from command where instruction like '%sections%';

全文索引查询(速度快很多)

select * from command where match(instruction) against ('sections');

删除全文索引

alter table command drop index instruction;

外键

将一个表的某个字段指向另一个实体的主键。被指向的称之为主,父表。负责指向的称之为从表,子表。

字表中插入元素必须能与从表中的某个元素对应,否则不行

例如表1中插入deptnu为50,由于表2中没有,于是无法插入

在这里插入图片描述

外键的作用:

①为了一张表记录的数据不要太过冗余。

②保持数据的一致性、完整性。

关键词:foreign key

语法:foreign key (字段名) references 关联的表名(关联表的字段名)

方法一:创建表的时候创建外键索引

CREATE TABLE `employee` (
  `empno` int(11) NOT NULL COMMENT '雇员编号',
  `ename` varchar(50) DEFAULT NULL COMMENT '雇员姓名',
  `job` varchar(30) DEFAULT NULL,
  `mgr` int(11) DEFAULT NULL COMMENT '雇员上级编号',
  `hiredate` date DEFAULT NULL COMMENT '雇佣日期',
  `sal` decimal(7,2) DEFAULT NULL COMMENT '薪资',
  `deptnu` int(11) DEFAULT NULL COMMENT '部门编号',
  PRIMARY KEY (`empno`),
 foreign key (deptnu) references dept(deptnu)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

方法二:

alter table employee add foreign key (deptnu) references dept(deptnu);

删除

alter tabel employee drop foreign key 外键名(注意不是字段名);

注意:在删除索引之前必须先把这个索引对应的外键约束删除

联合索引

explain select * from test where username like 'user11%' and servnumber like '137000000%' and password like 'n%'

显示三个索引可用(possible_key),实际使用的是(key)

在这里插入图片描述

具体过程是:假设原本是100w条数据,那么先使用servnumber索引(由mysql判断该索引的效率最高)先进行检索并找到满足条件的10w条数据,但是剩余的条件在检索过程中是不会使用索引的,这样会很浪费时间

于是提出了联合索引的概念

alter table test add index(username,password,servnumber);