精华内容
下载资源
问答
  • 创建clickhouse 分布式表方式 及分布式表数据增加、更新、删除、查询 1、建表语句 (1)、本地表:分别在每个节点都建立本地表,或者使用 on cluster【在其中一个节点执行即可】 CREATE TABLE city_local on ...

    创建clickhouse 分布式表方式 及分布式表数据增加、更新、删除、查询

     

    1、建表语句

    (1)、本地表:分别在每个节点都建立本地表,或者使用 on cluster【在其中一个节点执行即可】

    CREATE TABLE city_local on cluster ck_cluster_name (
      `fdate` Int64,
      `city_code` Int32,
      `city_name` String,
      `total_cnt` Int64
    ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/city_local', '{replica}')
    PARTITION BY fdate
    ORDER BY (fdate, city_code, city_name)
    SETTINGS index_granularity = 8192, storage_policy = 'ssd_to_hdd';

    说明:{} 里边表示配置文件对应的变量

    (2)、分布式表,本身不存储数据,详细了解请阅读官方文档。在其中一个节点执行即可。

    分布式表一般加_all,第一个参数是集群名称,第二个参数是数据库名称,第三个参数是对应的本地表,第四个参数是随机分布数据。

    -- 推荐使用方式一,因为这样只需要重新创建一个all与对应local表的映射关系即可

    -- 方式一:

    -- 示例1:

    CREATE TABLE IF NOT EXISTS test_db.city_all ON CLUSTER ck_cluster_name AS test_db.city_local
    ENGINE = Distributed(ck_cluster_name, test_db, city_local, fdate);

    -- 示例2:

    CREATE TABLE IF NOT EXISTS test_db.city_all ON CLUSTER ck_cluster_name AS test_db.city_local
    ENGINE = Distributed(ck_cluster_name, test_db, city_local, rand());

    -- 方式二:

    CREATE TABLE city_all on cluster ck_cluster_name (
      `fdate` Int64,
      `city_code` Int32,
      `city_name` String,
      `total_cnt` Int64
    ) ENGINE = Distributed(ck_cluster_name, test_db, city_local, rand())

    2、分布式表插入数据

    insert into city_all (fdate, city_code, city_name, total_cnt) values (20210131, 4000, 'guangzhou', 420000);
    
    insert into city_all (fdate, city_code, city_name, total_cnt) values (20210131, 5000, 'shenzhan', 55000);
    
    insert into city_all (fdate, city_code, city_name, total_cnt) values (20210131, 6000, 'huizhou', 65000);
    
    insert into city_all (fdate, city_code, city_name, total_cnt) values (20210131, 7000, 'huizhou', 75000);

    3、分布式表查询数据

    -- 插入数据后,查询数据

    select * from city_all;
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      5000 │ shenzhan  │     55000 │
    
    └──────────┴───────────┴───────────┴───────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      7000 │ huizhou   │     75000 │
    
    └──────────┴───────────┴───────────┴───────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      6000 │ huizhou   │     65000 │
    
    └──────────┴───────────┴───────────┴───────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      4000 │ guangzhou │    420000 │
    
    └──────────┴───────────┴───────────┴───────────┘

    4、分布式表更新数据

    -- 更新数据【生效】,通过local表来更新 同时指定上集群名称;如果通过all来更新则不支持会报错

    ALTER TABLE city_local ON CLUSTER ck_cluster_name UPDATE total_cnt = 2222 WHERE city_name = 'huizhou';

    -- 通过all来更新会报错,An error occurred before execution: Code: 371, e.displayText() = DB::Exception: Table 'city_all' isn't replicated, but shard #3 is replicated according to its cluster definition (version 20.2.1.2183 (official build))

    -- ALTER TABLE city_all ON CLUSTER ck_cluster_name UPDATE total_cnt = 3333 WHERE city_name = 'huizhou';

    SELECT * FROM city_all;
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      4000 │ guangzhou │    420000 │
    
    └──────────┴───────────┴───────────┴───────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      6000 │ huizhou   │      2222 │
    
    └──────────┴───────────┴───────────┴───────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      7000 │ huizhou   │      2222 │
    
    └──────────┴───────────┴───────────┴───────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      5000 │ shenzhan  │     55000 │
    
    └──────────┴───────────┴───────────┴───────────┘

    5、分布式表删除数据

    -- 删除数据【生效】,通过local表来删除 同时指定上集群名称;如果通过all来删除则不支持会报错

    ALTER TABLE city_local ON CLUSTER ck_cluster_name DELETE WHERE city_name = 'huizhou';

    -- An error occurred before execution: Code: 371, e.displayText() = DB::Exception: Table 'city_all' isn't replicated, but shard #3 is replicated according to its cluster definition (version 20.2.1.2183 (official build))

    -- ALTER TABLE city_all ON CLUSTER ck_cluster_name DELETE WHERE city_name = 'huizhou';

    SELECT * FROM city_all;
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      5000 │ shenzhan  │     55000 │
    
    └──────────┴───────────┴───────────┴───────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      4000 │ guangzhou │    420000 │
    
    └──────────┴───────────┴───────────┴───────────┘

    -- 插入数据后,查询数据

    SELECT * FROM city_all
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      5000 │ shenzhan  │     55000 │
    
    └──────────┴───────────┴───────────┴───────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┐
    
    │ 20210131 │      4000 │ guangzhou │    420000 │
    
    └──────────┴───────────┴───────────┴───────────┘

    6、分布式表添加字段

    -- 添加历史字段

    -- mysql 添加字段

    -- ALTER TABLE test_table add age int DEFAULT NULL COMMENT '年龄' after name;

    -- 生效

    alter table city_local ON CLUSTER ck_cluster_name add column history Int32;

    -- 同时支持指定在某个字段后面添加字段

    alter table city_local ON CLUSTER ck_cluster_name add column history Int32 after city_code;

    -- 不生效,报错:An error occurred before execution: Code: 371, e.displayText() = DB::Exception: Table 'city_all' isn't replicated,

    -- but shard #3 is replicated according to its cluster definition (version 20.2.1.2183 (official build)).

    alter table city_all ON CLUSTER ck_cluster_name add column history Int32;

    -- 尝试将city_all 删除重建

    drop table test_db.city_all ON CLUSTER ck_cluster_name;

    -- 重建all表,方式一:【可行】

    CREATE TABLE IF NOT EXISTS test_db.city_all ON CLUSTER ck_cluster_name AS test_db.city_local
    ENGINE = Distributed(ck_cluster, test_db, city_local, rand());
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      5000 │ shenzhan  │     55000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      4000 │ guangzhou │    420000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘

    -- 重建all表,方式二:【可行】

    CREATE TABLE city_all on cluster ck_cluster_name (
      `fdate` Int64,
      `city_code` Int32,
      `city_name` String,
      `total_cnt` Int64,
      `history` Int32
    ) ENGINE = Distributed(ck_cluster_name, test_db, city_local, rand())
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      5000 │ shenzhan  │     55000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      4000 │ guangzhou │    420000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘

    -- 查询表的创建语句

    show create table city_local;
    
    show create table city_all;

    -- 新增字段后,查询数据

    select * from city_all;

    7、分布式表新增字段后,插入数据验证

    -- 新增字段后,插入数据,并不对新字段赋值,验证可行。新增history字段默认为0

    insert into city_all (fdate, city_code, city_name, total_cnt) values (20210131, 7000, 'foshan', 75000);
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      7000 │ foshan    │     75000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      4000 │ guangzhou │    420000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      5000 │ shenzhan  │     55000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘

     

    -- 新增字段后,插入数据,对新字段赋值

    insert into city_all (fdate, city_code, city_name, total_cnt, history) values (20210131, 7000, 'dongguan', 85000, 2021);

    -- 新增字段后,查询数据

    select * from city_all;
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      4000 │ guangzhou │    420000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      7000 │ dongguan  │     85000 │    2021 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      5000 │ shenzhan  │     55000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      7000 │ foshan    │     75000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘

    -- 对分布式all表更新操作【不生效】An error occurred before execution: Code: 371, e.displayText() = DB::Exception: Table 'city_all' isn't replicated, but shard #1 is replicated according to its cluster definition (version 20.2.1.2183 (official build))

    ALTER TABLE city_all ON CLUSTER ck_cluster_name UPDATE total_cnt = 3333 WHERE city_name = 'foshan';

     

     

    -- 对分布式all表删除数据【不生效】An error occurred before execution: Code: 371, e.displayText() = DB::Exception: Table 'city_all' isn't replicated, but shard #1 is replicated according to its cluster definition (version 20.2.1.2183 (official build))

    ALTER TABLE city_all ON CLUSTER ck_cluster_name DELETE WHERE city_name = 'foshan'

    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      5000 │ shenzhan  │     55000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      7000 │ dongguan  │     85000 │    2021 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      7000 │ foshan    │     75000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘
    
    ┌────fdate─┬─city_code─┬─city_name─┬─total_cnt─┬─history─┐
    
    │ 20210131 │      4000 │ guangzhou │    420000 │       0 │
    
    └──────────┴───────────┴───────────┴───────────┴─────────┘

    8 删除字段

    -- 删除字段【可行】
    alter table test_db.city_local ON CLUSTER ck_cluster_name drop column history;

    9 删除分布式表【生效】

    drop table city_local on cluster ck_cluster_name;
    
    drop table city_all on cluster ck_cluster_name;

    文章最后,给大家推荐一些受欢迎的技术博客链接

    1. JAVA相关的深度技术博客链接
    2. Flink 相关技术博客链接
    3. Spark 核心技术链接
    4. 设计模式 —— 深度技术博客链接
    5. 机器学习 —— 深度技术博客链接
    6. Hadoop相关技术博客链接
    7. 超全干货--Flink思维导图,花了3周左右编写、校对
    8. 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
    9. 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
    10. 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂
    11. 深入聊聊Java 垃圾回收机制【附原理图及调优方法】

    欢迎扫描下方的二维码或 搜索 公众号“大数据高级架构师”,我们会有更多、且及时的资料推送给您,欢迎多多交流!

                                               

           

    展开全文
  • 1,索引的概念 是数据库对象,实现数据库的快速查询 使用索引的原因:实现数据库的快速查询,提高查询速度 2,索引的分类 1,普通索引 最基本的索引,对字段数据的类型和值没有任何限制,数据类型可以任意...

    1,索引的概念

    是数据库对象,实现数据库的快速查询

    使用索引的原因:实现数据库的快速查询,提高查询速度

    2,索引的分类

    
    1,普通索引
    		最基本的索引,对字段数据的类型和值没有任何限制,数据类型可以任意,字段的值可以为空也可以重复。
    
    2,主键索引
    		给主键字段添加的索引、
    		主键特点:唯一且非空
    
    3,唯一索引
    		给唯一字段添加的索引
    				唯一索引和主键索引的区别:
    				唯一索引:只有唯一,可以有空值
    				主键索引:唯一且非空
    				
    4,全文索引
    		适用于给一大串文本添加的索引,只可以给字符串数据类型添加
    		字符串数据类型(char varchar text)
    		
    5,空间索引
    		字段的数据类型只能是空间数据类型,且改字段的值必须为 非空 not null
    		空间数据类型 geometry point linestring polygon
    		
    6,复合索引
    		给多个字段添加的索引
    		注意:如果使用了复合索引,查询条件中只有使用了第一个字段,该索引才会被触发
    		例如(id name)只有查询条件中使用了id字段,索引才会被使用
    		如果查询条件只有name字段,则索引不会被触发
    

    3,创建索引

    1,自动创建索引
    	在创建表的时候,给表添加了主键和唯一约束时,数据库给自动的给主键约束和唯一约束创建对应的主键索引和唯一索引
    			create table index_student(
    			sno int(8) primary key auto_increment,
    			sname varchar(4) unique,
    			age int(2)
    			);
    	查询表中的索引语法为:show index from 表名
    	show index from index_student;
    	
    2,手动创建索引
    
    		a,创建表时创建索引
    		
    		
    				1,创建普通索引、
    						create table 表名(
    						字段名1 字段类型1,
    						....,
    						index|key [索引名] [索引类型] (字段名[(长度)] [asc|desc])
    						);
    				create table index_student(
    				sno int(8),
    				sname varchar(20),
    				age int(2),
    				index (sno)
    				);
    				show index from index_student;
    
    		
    				2,唯一索引的创建
    						create table 表名(
    						字段名1 字段类型1,
    						....,
    						unique index|key [索引名] [索引类型] (字段名[(长度)] [asc|desc])
    						);
    									create table index_student(
    									sno int(8),
    									sname varchar(20),
    									age int(2),
    									unique index (sno)
    									);
    									show index from index_student;
    
    
    				3,创建主键索引
    						create table表名(
    						字段名1 字段类型1,
    						....,
    						primary index|key [索引名] [索引类型] (字段名[(长度)] [asc|desc])
    						);				
    									create table index_student(
    									sno int(8),
    									sname varchar(20),
    									age int(2),
    									primary key (sno)
    									);
    									show index from index_student;
    
    
    
    				4,创建全文索引、只有:只能给字符串数据类型添加
    						create table 表名(
    						字段名1 字段类型1,
    						....,
    						fulltext index|key [索引名] [索引类型] (字段名[(长度)] [asc|desc])
    						);		
    								
    										create table index_student(
    										sno int(8),
    										sname varchar(20),
    										age int(2),
    										sinfo varchar(200),
    										fulltext key (sinfo)
    										);
    										show index from index_student;		
    
    
    
    				5,创建复合索引
    						create table 表名(
    						字段名1 字段类型1,
    						....,
    						index|key [索引名] [索引类型] (字段名1[(长度)] [asc|desc], 字段名2[(长度)] [asc|desc], 字段名3[(长度)] [asc|desc])
    						);		
    						
    								---创建表index_student,给sno 和 sname 添加复合索引
    								create table index_student(
    								sno int(8),
    								sname varchar(20),
    								age int(2),
    								sinfo varchar(200),
    								index (sno,sname)
    								);
    
    								show index from index_student;						
    
    
    				6,创建空间索引
    				注意:只能给空间数据类型添加,且该字段的值不能为空 not null
    						create table 表名(
    						字段名1 字段类型1,
    						....,
    						spatial index|key [索引名] [索引类型] (字段名[(长度)] [asc|desc])
    						);	
    						
    							---创建表index_student,给sloc字段(是point字段类型)添加空间索引
    							create table index_student(
    							sno int(8),
    							sname varchar(20),
    							age int(2),
    							sinfo varchar(200),
    							sloc point not null,
    							spatial index (sloc)
    							);
    							
    							show index from index_student;
    
    				
    		b,创建表后使用“create index ”创建索引
    		create [ unique|fulltext|spatial ] index 索引名称 [索引的类型] on 表名 (字段名1[(长度)] [asc|desc], 字段名2[(长度)] [asc|desc])
    
    		需要注意的是:使用create index这种创建索引的方式不能创建主键索引
    
    		(1),创建普通索引
    						---创建表index_student,给表sno添加普通索引
    						create table index_student(
    						sname varchar(8),
    						sno int(5),
    						age int(2)
    						);
    						create index index_student_sno on index_student (sno);
    						show index from index_student;
    
    
    		(2),创建唯一索引
    						---创建表index_student,给表sname添加唯一索引
    						create table index_student(
    						sname varchar(8),
    						sno int(5),
    						age int(2)
    						);
    						create unique index index_student_sname on index_student (sname);
    						show index from index_student;
    
    
    		(3),创建全文索引 fulltext
    					---创建表index_student,给表sinfo添加全文索引
    					create table index_student(
    					sname varchar(8),
    					sno int(5),
    					age int(2),
    					sinfo varchar(200)
    					);
    					create fulltext index index_student_sinfo on index_student (sinfo);
    					show index from index_student;
    		
    
    		(4),创建空间索引
    					---创建表index_student,给表sloc添加空间索引
    					create table index_student(
    					sname varchar(8),
    					sno int(5),
    					age int(2),
    					sloc point not null
    					);
    					create spatial index index_student_sloc on index_student (sloc);
    					show index from index_student;
    
    
    		(5),创建复合索引
    					---创建表index_student,给表sno和sname添加复合索引
    					create table index_student(
    					sname varchar(8),
    					sno int(5),
    					age int(2)
    					);
    					create index index_student_sno_sname on index_student (sno, sname);
    					show index from index_student;	
    
    
    c,给已有表添加索引“alter table”
    		
    		(1)添加普通索引
    		语法为:alter table 表名 add index|key [索引名] [索引类型] (字段名 [长度] [asc | desc])
    				---创建表index_student,给表sno添加普通索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2)
    				);
    				alter table index_student add index (sno)
    				show index from index_student;
    
    
    		(2)添加唯一索引
    		语法为:alter table 表名 add unique [index|key] [索引名] [索引类型] (字段名 [长度] [asc | desc])
    				---创建表index_student,给表sname添加唯一索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2)
    				);
    				alter table index_student add unique index (sname);
    				show index from index_student;
    
    
    		(3)添加主键索引
    		语法为:alter table 表名 add primary key [index|key] [索引名] [索引类型] (字段名 [长度] [asc | desc])
    				---创建表index_student,给表sno添加主键索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2)
    				);
    				alter table index_student add primary key (sno);
    				show index from index_student;
    		
    		
    		(4)添加全文索引
    		语法为:alter table 表名 add fulltext [index|key] [索引名] [索引类型] (字段名 [长度] [asc | desc])
    				---创建表index_student,给表sinfo添加全文索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2),
    				sinfo varchar(200)
    				);
    				alter table index_student add fulltext index(sinfo);
    				show index from index_student;		
    
    
    		(5)添加空间索引
    		语法为:alter table 表名 add spatial [index|key] [索引名] [索引类型] (字段名 [长度] [asc | desc])
    				---创建表index_student,给表sloc添加空间索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2),
    				sloc point not null
    				);
    				alter table index_student add spatial index (sloc);
    				show index from index_student;		
    
    
    		(6)添加复合索引
    		语法为:alter table 表名 add index|key [索引名] [索引类型] (字段名1 [长度] [asc | desc], 字段名2 [长度] [asc | desc])
    				---创建表index_student,给表sno和sname添加复合索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2)
    				);
    				alter table index_student add index (sno,sname);
    				show index from index_student;	
    
    

    4,删除索引

    1,使用alter table 删除
    		语法为alter table 表名 drop index|key 索引名称
    		alter table index_student drop index sno;
    		
    2,使用drop index 删除
    		语法为drop index 索引名称 on 表名
    		
    注意:使用alter table 方式不能删除主键索引
      删除主键索引的方式为:
      a,	alter table 表名 drop primary key
      b,	使用drop index进行删除
    

    5,数据的插入

    (1)为所有字段插入数据
    		语法为:insert [into] 表名 [(字段名1,字段名2,字段名3,....)] values|value (值1,值2,值3....)
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				---为表中所有字段插入数据
    				insert into student (sno,sname,age,sex,email) values (1,"张三", 20, "男", "zhangsan@163.com");
    				
    				---另一种写法表后面不写字段名,则插入值的顺序要与表结构相同
    				insert into student values (2,"李四", 21, "女", "lisi@163.com");
    				---查询表student中的数据
    				select * from student;
    
    
    
    (2)为指定字段插入数据
    		语法为:insert [into] 表名 (字段名1,字段名2,字段名3,....) values|value (值1,值2,值3....)
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				---给表中sname和age插入数据
    				insert into student (sname,age) values ("王五", 18);
    				
    				---查询表student中的数据
    				select * from student;
    
    
    (3)使用SET方式插入数据
    		语法为:insert into 表名 set 字段名1=字段值1,字段名2=字段值2,....;
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				---使用set方式给表中所有字段插入数据
    				insert into student set sno=4,sname="皮皮",age=17,sex="男",email="pipi@16.com";
    				
    				---使用set方式给指定的字段插入数据
    				insert into student set sname="彬彬",age=2,email="binbin@163.com";
    				
    				---查询表student中的数据
    				select * from student;
    				
    
    (4)同时插入多条数据
    		语法为:insert [into] 表名 [(字段名1,字段名2,字段名3,....)] values|value (值1,值2,值3....),(值1,值2,值3....),....;
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				
    				---给所有字段插入多条数据
    				insert into student (sno,sname,age,sex,email) 
    				values (6,"小红",15,"女","xiaohong@163.com"),(7,"小二",17,"男","xiaoer@163.com");
    				
    				---给指定字段插入多条数据
    				insert into student (sname,age,email) 
    				values ("小花",14,"xiaohua@163.com"),("小强",11,"xiaoqiang@163.com");
    				
    				---查询表student中的数据
    				select * from student;
    
    
    
    (5)插入查询结果
    		语法为:insert [into] 表名 (字段名1,字段名2,字段名3,....) select 字段名1,字段名2,字段名3.....from 表 where 条件;
    		注意:插入表的字段和查询的字段个数和类型要保持一致
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				
    				---创建t_student表
    				create table t_student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "女",
    				email varchar(20) unique
    				);
    				
    				---将student表中的数据查询结果插入到t_student表中
    				insert into t_student select * from student;
    				
    				select * from t_student;
    
    

    6,数据的更新

    1,更新指定数据
    		语法为:update 表名 set 字段名1=值1[,字段名2=值2,....] where 条件
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				
    				---更新指定数据
    				update student set sname="张老大" where sname="张三";
    				select * from student;
    				
    
    2,更新全部数据
    		语法为:update 表名 set 字段名1=值1[,字段名2=值2,....] 
    
    				---更新全部数据 将表中年龄都修改为18
    				update student set age=18;
    				select * from student;
    

    7,数据的删除

    1,删除指定数据
    		语法为:delete from 表名 where 条件
    		
    			---删除student表中sno大于2的学生信息
    			delete from student where sno>2;
    
    
    2,删除全部数据
    		语法为:delete from 表名 where 条件
    		
    				---删除student表的全部数据
    				delete from student;
    
    
    3,truncate关键字删除数据
    		语法为:truncate 表名
    
    4,truncate与delete删除全部记录的区别:
    
    		a,delete是数据操纵语言DML 而truncate是数据定义语言DDL
    		
    		b,delete删除数据是一条一条删除
    			truncate删除数据是保留表结构,直接删除数据,删除后表的状态相当于新表
    			truncate的效率比delete高
    			
    		c,delete删除数据,会显示删除行数
    			truncate不会显示
    			
    		d,删除记录后,再次向表添加数据,自增的值会在原来最大值+1
    			truncate删除记录后,会从1开始自增
    			
    		e,delete操作可以回滚即删除的数据可以恢复
    			truncate操作隐士提交,删除的数据不能恢复
    
    

    8,创建emp表并插入数据以及表的查询

    1,单表查询

    
    
    		用户用不同的方式从数据库中获取自己所需要的数据
    		是数据库操作中非常重要且频繁的操作
    
    ---创建新库test
    ---在test库中创建emp(雇员表)
    emp(雇员编号empno
    		雇员名称ename
    		雇员职位job
    		雇员领导mgr
    		雇员入职日期hiredate
    		雇员月薪sal
    		雇员津贴comm
    		雇员部门编号deptno
    		
    create database test;
    create table emp(
    empno int(4) primary key,
    ename varchar(10),
    job varchar(9),
    mgr int(4),
    hiredate date,
    sal decimal(7,2),
    comm decimal(7,2),
    deptno int(2)
    );
    
    ---同时插入多条数据
    
    insert into emp values
    (7369, 'Smith', 'clerk', 7902, '1980-12-17', 800, null, 20), (7499, 'Allen', 'salesman', 7698, '1981-02-20', 1600, 300, 30), (7521, 'Ward', 'salesman', 7698, '1981-02-22', 1250, 500, 30), (7566, 'Jones', 'manager', 7839, '1981-04-02', 2975, null, 20), (7654, 'Maritn', 'salesman', 7698, '1981-09-28', 1250, 1400, 30), (7698, 'Blake', 'manager', 7839, '1981-05-01', 2850, null, 30), (7782, 'Clark', 'manager', 7839, '1981-06-09', 2450, null, 10), (7788, 'Scott', 'analyst', 7566, '1987-04-19', 3000, null, 20), (7839, 'King', 'president', null, '1981-11-17', 5000, null, 10), (7844, 'Turner', 'salesman', 7698, '1981-09-08', 1500, 0, 30), (7876, 'Adams', 'clerk', 7788, '1987-05-23', 1100, null, 20), (7900, 'James', 'clerk', 7698, '1981-12-03', 950, null, 30), (7902, 'Ford', 'analyst', 7566, '1981-12-03', 3000, null, 20), (7934, 'Miller', 'clerk', 7782, '1982-01-23', 1300, null, 10);
    
    select * from emp;
    
    
    
    2,以上表创建完成之后进行单表查询
    
    	a,查询所有字段
    	语法1为:select 字段名1,字段名2,字段名3,....from 表名
    	语法2为:select * from 表名
    
    	b,查询指定字段
    	语法为:select 字段名1,字段名2,字段名3,....from 表名
    			---查询雇员表中雇员姓名,职位,部门号,薪资
    			select ename,job,deptno,sal from emp;
    
    	c,去重distinct的使用
    	语法为:select distinct 字段名1,字段名2,字段名3,....from 表名	
    			---查询雇员在哪个部门号中
    			select distinct deptno from emp;
    			---查询雇员部门号及职位
    			select distinct deptno,job from emp;
    		注意:distinct使用到多个字段上时,只有多个字段的值都相同时才去重
    
    	
    	d,查询时算术运算符的使用
    	 +   -   *  /(div)   v%(mod)
    			---查询每个雇员的年薪
    			select ename,sal*12 from emp;
    
    	e,给字段起别名
    	语法为:select 字段名1 [as] 别名,字段名2,字段名3,....from 表名;
    			---查询每个雇员的年薪,别名为yearsal
    			select ename,sal*12 as yearsal from emp;
    	注意:如果别名中有空格特殊符号,需要使用单引号括起来
    			---查询每个雇员的年薪,别名为yearsal&年薪 或者别名为 yearsal 年薪
    			select ename,sal*12 as 'yearsal&年薪' from emp;
    			select ename,sal*12 as 'yearsal 年薪' from emp;
    

    2,查询结果排序

    默认升序 asc
    降序 desc
    
    1,在单个字段中排序
    	语法为:select 查询内容 from 表名 order by 字段  asc|desc
    			---查询雇员信息按雇员薪资升序排序
    			select * from emp order by sal asc;
    			---由于默认的排序方式是升序,所以asc可以省略
    			select * from emp order by sal;
    			
    2,在多个字段中使用排序
    	语法为:select 查询内容 from 表名 order by 字段名1  asc|desc,字段名2  asc|desc....
    			---查询雇员信息,先按雇员薪资升序排,如薪资相同则按入职日期降序排序
    			select * from emp order by sal,hiredate desc;
    	注意:排序可以起别名
    			---查询雇员的年薪给年薪起个别名yearsal,按年薪降序排序
    			select ename,sal*12 as yearsal from emp order by yearsal desc;
    

    3,条件查询

    是用户按照一定条件查询,查询满足条件的部分记录
    语法格式:select 查询内容 from 表 where 条件
    
    (1)比较运算符的使用   =    >    <      >=      <=      !=       <>
    			---查询部门号为20的雇员信息
    			select * from emp where deptno=20;
    			---查询薪资大于等于3000的雇员信息
    			select * from emp where sal>=3000;
    			---查询薪资小于3000的雇员名称,薪资,职位
    			select ename,sal,job from emp where sal<3000;
    			---查询名为Smith的雇员信息
    			select * from emp where ename="Smith";
    	注意:MySQL默认不区分大小写,如果要区分大小写则可以使用binary关键字
    			---binary的使用
    			select * from emp where binary ename="Smith";
    			
    (2) [not] between and的使用 
    		可以查询某区间范围的记录
    			---查询薪资在1200-3000之间的雇员信息
    			---between后面是开始值,and后面是结束值,不能颠倒。包括边界
    			select * from emp where sal between 1200 and 3000;
    			---查询薪资不在1200-3000范围之内的雇员姓名,薪资
    			select ename,sal from emp where sal not between 1200 and 3000;
    
    (3)[not] in的使用
    	语法格式为:select 查询内容 from 表名 where 字段名 in(值1,值2,值3,...)
    			---查询雇员姓名是smith,scott,king的雇员信息
    			select * from emp where ename in("smith","scott","king");
    			---查询雇员姓名不是smith,scott,king的雇员信息
    			select * from emp where ename not in("smith","scott","king");
    
    (4)is null 或者 is not null  判断某个字段是否为空
    			---查询雇员中,有津贴的雇员信息
    			select * from emp where comm is not null;
    			---查询雇员中,没有津贴的雇员信息
    			select * from emp where comm is null;
    
    (5)模糊查询
    		可查询以XX开头,以XX结尾,包含XX,第几个是X
    		%:指任意长度的字符
    		_:匹配一个字符
    		语法为:select 查询内容from表名where字段名like
    				---查询雇员姓名以S开头的雇员信息
    				select * from emp where ename like"S%";
    				---查询雇员姓名以S结尾的雇员信息
    				select * from emp where ename like"%S";
    				---查询雇员姓名包含S的雇员信息
    				select * from emp where ename like"%S%";
    				---查询雇员姓名第二个字符是L的雇员信息
    				select * from emp where ename like"_L%";
    				---查询雇员姓名长度是5的雇员信息
    				select * from emp where ename like"_____";
    
    (6)条件中的逻辑运算符
    		and:查询时,只有满足所有条件的记录才会被查询出来
    		select 查询内容from表名where 条件1 and 条件2 and....
    				---查询雇员表中部门号为20 职位是clerk的雇员姓名 部门编号 职位
    				select ename,deptno,job from emp where deptno=20 and job="clerk";
    				---查询部门号为30,薪资在1500-3000之间的雇员信息
    				select * from emp where deptno=30 and sal between 1500 and 3000;
    				
    		or:查询时,只要满足任一条件记录就能被查询出来
    		select 查询内容from表名where 条件1 or 条件2 or....
    				---查询雇员表中部门号为20 或者职位是clerk的雇员姓名 部门编号 职位
    				select ename,deptno,job from emp where deptno=20 or job="clerk";
    
    

    4,分页查询

    select 查询内容 from 表名 where 条件 order by 字段名 asc|desc limit a,b 
    注意:
    	(a代表从哪条记录开始,b代表每页显示的条数) 且默认第一条数据的值为0
    	如果limit与order by 连用的时候,先排序再分页
    		---显示第一页雇员信息 例如每页显示4条
    		select * from emp limit 0,4;
    		---显示第二页雇员信息 每页显示4条
    		select * from emp limit 4,4;
    		---显示第三页雇员信息 每页显示4条
    		select * from emp limit 8,4;
    		---显示第n页雇员信息 每页显示4条
    		select * from emp limit (n-1)*4,4;
    
    

    9,函数的使用

    (1)单行函数

    a,字符函数 
    		(1)concat() 拼接字符串
    			---查询雇员信息,以指定格式输出
    			雇员姓名:XX,薪资:XX,职位:XX,入职日期:XX,年薪:XX,
    			select concat("雇员姓名:",ename,",薪资:",sal,",职位:",job,",入职日期:",hiredate,",年薪:",sal*12) from emp;
    		
    		(2)length()计算字符串的长度
    			---查询雇员姓名长度是5的雇员信息
    			select * from emp where length(ename)=5;
    			
    		(3)lower()  upper()转换大小写
    			---查询雇员姓名 大写的雇员姓名 小写的雇员姓名
    			select ename,lower(ename),upper(ename) from emp;		
    			
    		(4)replace()在指定的字符串中,将某子串替换为新的字符串
    			replace(目标字符串,查找的子串,新字符串)
    				---将helloWord字符串中的hello替换为hi
    				select replace("helloworld","hello","hi") from dual;
    				---另一种写法为
    				select replace("helloworld","hello","hi");
    				
    		(5)substring()截取子串
    			substring(目标字符串,开始位置,长度)  注意开始索引是从1开始的。
    				---截取雇员姓名的前4个字符
    				select substring(ename,1,4) from emp;
    
    
    b,数值函数
    	1,abs()  作用是:取绝对值
    			select(1),(-1);
    
    	2,pi()  作用是:获取圆周率
    			select pi();
    
    	3,mod() 作用是:取余
    			select mod(3,2);
    	
    	5,pow() 作用是:求一个数的n次方
    			select pow(3,2)
    
    	6,ceil() 向上取整  floor()向下取整
    			select ceil(5.43),floor(5.7);
    
    	7,round(num) 代表返回四舍五入的整数
    	round(num,n)返回四舍五入n位小数
    		select round(5.4),round(6.8),round(5.34,1),round(6.789,2);
    		
    	8,truncate(num,n) n的值可以为0,1,2,3,4...其中n为0时代表截取整数
    		select truncate(5.3,0),truncate(5.67,1),truncate(5.789,2);
    	
    	9,rand() 获取浮点类型的随机数,范围是0-1.0。包括0但不包含1
    			select rand(),rand(),rand();
    
    
    c,时间日期函数
    	1,now() 获取SQL执行时当前日期和时间 包括年月日 时分秒
    			select now();
    
    	2,curdate()获取当前日期 只包括年月日
    			select curdate()
    			
    	3,curtime()获取当前时间 只包括时分秒
    			select curtime();
    	
    	4,sysdate()获取函数执行时的日期和时间
    		select sysdate(),now(),sleep(3),sysdate(),now();
    	
    	5,dayofyear()获取某个日期是所在年份的第几天
    	 week()获取某个日期是所在年份的第几周
    	 	select dayofyear(now()),week(now());
    	
    	6,datediff()计算两个日期之间的时间间隔
    		---计算2019.1.1日距离现在时间间隔
    		select datediff("2019-12-30",now());
    
    	7,date_add(),date_sub() 实现日期的加减运算
    		date_add(日期, 时间间隔类型关键字interval, 时间间隔类型对应的表达式, 时间间隔类型)
    		 day_hour  1_12 代表1天12个小时
    		 year_month 2_1 代表2年1个月
    		 
    		 select date_add(now(), interval "2_1" year_month)
    		 select date_sub(now(), interval 10 day);
    
    e,流程控制函数
    	1,if(条件,t,f) 如果条件成立返回t,否则返回f
    		select if(1>2,"1大于2","1小于2");
    			---查询雇员的薪资,如果薪资>=3000,输入“高薪”,否则“低薪”
    			select sal,if(sal>=3000,"高薪","低薪") "薪资水平" from emp;
    			
    	2,ifnull(值1,值2) 如果值1不为空则返回值1,否则返回值2
    			---查询雇员的年薪
    			select sal,comm,(sal+comm)*12 from emp; 此语句达不到想要的效果
    			select (sal+ifnull(comm,0))*12 from emp;
    			select sal,comm,(sal+ifnull(comm,0))*12 from emp;
    	3,nullif(值1,值2) 如果值1等于值2返回null,否则返回值1
    			select nullif(1,2),nullif(1,1);
    	
    	4,	   case 值
    			when 值1 then 结果1
    			when 值2 then 结果2
    			...
    			else 其他结果
    			end
     		select case 1 when 1 then "这是结果1" when 2 then "这是结果2" else "这是其他结果" end;
    
    	5,   case 
    			when 条件 then 结果1
    			when 条件 then 结果2
    			...
    			else 其他结果
    			end
    示例为:---查询雇员薪资,如果薪资>=3000返回“高薪”,否则“低薪”
    		select sal,case
    		when sal>=3000 then "高薪"
    		else "低薪"
    		end "薪资水平"
    		from emp;
    

    (2)多行函数

    定义:操作一组数据(多行记录)返回一个结果,也叫分组函数
    大多用于统计
    例如:统计各部门中雇员的人数。统计各部门中最高和最低薪资

    1,count()统计表中记录的数目
    		---查询emp表中有多少条记录
    		select count(*) from emp;
    
    	另一条语法是count(exp)统计exp值非空的记录数目
    	---查询雇员表中,有多少位雇员有津贴
    	select count(comm) from emp;
    
    	另一条语法是count(distinct(exp)) 返回表达式exp的值不重复且非空的总记录数目
    		---统计雇员表中有多少位雇员是领导
    		select count(distinct(mgr)) from emp;--统计的是除董事长外的领导人数
    		---统计雇员表中包含董事长的领导数 需要用到ifnull函数
    		select count(distinct(ifnull(mgr,1))) from emp;
    
    2,sum(exp) 返回表达式值的总和
    	select sum(sal) from emp;
    	
    	另一条语法是sum(distinct(exp))返回不重复的表达式exp的总和
    	select sum(sal),sum(distinct(sal)) from emp;
    
    3,avg(exp)返回表达式值的平均值
    	select avg(sal) from emp;
    
    	另一条语法是avg(distinct(exp))返回不重复的表达式exp的平均值
    	select avg(distinct(sal)) from emp;
    
    4,max()  min() 
    	max(emp)返回表达式值的最大值
    	min(emp)返回表达式值的最小值
    	select min(sal),max(sal) from emp;
    

    (3)分组统计

    语法为:
    		select 查询内容
    		from 表名
    		[where 条件]
    		[group by 分组字段名1,分组字段名2,...]
    		[order by 字段名 asc|desc]
    		[limit]
    
    示例如下:
    	 ---求每个部门的人数
    	 select deptno,count(*) from emp  group by deptno;
    	 ---求每个部门的平均工资
    	 select deptno,avg(sal) from emp group by deptno;
    	 ---求每个部门中最高工资和人数
    	 select deptno,max(sal),count(*) from emp group by deptno;
    	 ---求每个岗位的人数
    	 select job,count(*) from emp group by job;
    	 ---显示每个部门不同岗位的人数
    	 select deptno,job,count(*) from emp group by deptno,job;
    
    注意事项1:如果查询字段,没有在多行函数中,则必须是分组字段
    	select ename,job,sum(sal) from emp group by job; 此语句运行后会报错
    
    注意事项2:如果没有group by 则查询字段不能与多行函数一起查询
    	select sal,empto from emp; 合法
    	select sum(sal),empto from emp;不合法
    
    注意事项3:不允许在where条件中使用多行函数
    

    having子句

    语法为:
    		select 查询内容
    		from 表名
    		[where 条件]
    		[group by 分组字段]
    		[having 条件]
    		[order by]
    select from ---where过滤---group by---having过滤
    示例如下:
    	---每个部门不同岗位的人数,且人数大于2
    	select count(*),deptno,job from emp group by deptno,job having count(*)>2;
    	---在emp表中列出工资最小值小于2000的职位
    	select job,min(sal) from emp group by job having min(sal)<2000;
    	---查询每个职位的最低薪资
    	select job,min(sal) from emp group by job;
    	---列出平均工资大于1200的部门和职位搭配组合
    	select avg(avg) from emp group by deptno,job having avg(sal)>1200;
    	---求每个部门不同职位的平均工资
    	select avg(sal) from emp group by deptno,job;
    
    展开全文
  • 手把手教你用Java设计并实现一个城市公交查询系统

    千次阅读 多人点赞 2020-12-19 10:11:33
    为了使得我国公交乘客出行及查询有关信息更方便,本文运用JAVA语言技术,Jsp技术,Mysql数据库开发了B/S结构的城市公交查询系统。 该系统顺应了时代发展且具有以下优点:首先,方便乘客的出行,乘客不用询问站牌工作...

    背景:近年来, Internet推动了以互联网技术为核心的各项工作蓬勃展开,互联网的强大也大大的促进了社会的发展,整个社会信息化进程逐步加快,网络也变成了我们日常活动中越来越重要的组成成分。为了使得我国公交乘客出行及查询有关信息更方便,本文运用JAVA语言技术,Jsp技术,Mysql数据库开发了B/S结构的城市公交查询系统。

    该系统顺应了时代发展且具有以下优点:首先,方便乘客的出行,乘客不用询问站牌工作人员如何倒车,便可到达目的地。其次,乘客在网上就可以查询到公交公司发布的路况信息,以便提早做好换乘准备节约出行时间。最后,本系统可以节约人力资源,以往的站牌附近要安排公交公司的工作人员来帮助不熟悉的乘客,有了公交查询系统提前上网查询便可知道。

    项目已经上传CODECHINA:https://codechina.csdn.net/weixin_41937552/bus

    目录

     

    1  绪论

    展开全文
  • 1.掌握交互式创建、删除视图的方法 2.掌握使用SQL创建、删除视图的方法 3.掌握交互式更新视图的方法 4.掌握使用SQL更新视图的方法 5.掌握游标的使用   一、视图  数据库中的视图是一个虚拟表,视图...

    实验目标:

    1.掌握交互式创建、删除视图的方法

    2.掌握使用SQL创建、删除视图的方法

    3.掌握交互式更新视图的方法

    4.掌握使用SQL更新视图的方法

    5.掌握游标的使用

     

    一、视图

            数据库中的视图是一个虚拟表,视图包含一系列带有名称的行和列数据。行和列数据来自自由定义视图查询所引用的表,并且在引用视图时动态生成。 
      视图是一个或者多个表中导出的,视图的行为与表非常相似,但是视图是一个虚拟表。在视图中用户可以使用SELECT语句查询数据,以及使用INSERT、UPDATE和DELETE修改记录。

    1. 创建成绩视图SCORE_VIEW,包含:学号SNO、姓名SNAME、课程名CNAME、成绩Score,通过该视图,修改学号为991102,课号为01001的成绩记录。

     

    2. 创建一个计算机系学生名单视图S_VIEW,包含:学号SNO,姓名SN,性别SEX,完成下面内容。

     

    3. 创建一个视图,即计算机系学生的成绩单SCORE_VIEW_CDEPT,包含:学号SNO,姓名SN、课程名CN、成绩Score。

     

    4. 创建一个教师工资视图SAL_VIEW,包含字段:教师名TN、性别SEX、职称PROF、工资总和SALSUM、系别DEPT。通过该视图,查询教师“张朋”的工资收入。

     

    二、使用游标

    游标的概念
    --游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
    --游标的优点
    --从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:
    --1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。
    --2)提供对基于游标位置的表中的行进行删除和更新的能力。
    --3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。

    ① 先将S表快速复制到表S1;

    ② 定义一个游标cur_xs。要求该游标返回返有所有学生的性别,且游标可以更新AGE列。

    ③ 一行一行读取游标,若性别为女,则删除该行,若性别不为女,则更新当前行的年龄,年龄加1,直到判断完所有的行。效果如下图所示。

    ④ 关闭游标

    ⑤ 删除游标

    (思路:读取游标可用fetch next,可用全局变量@@FETCH_STATUS判断游标是否到了最后一行记录,每次读取游标得到的性别可保存至一变量中,做男女判断并进行不同的处理,通过where current of 游标名更新或者删除最后由游标取的记录)

                                    

                          执行前                                                                执行后

     

     

     

     

     

     

     

     

     

    展开全文
  • protege作为领域本体编辑工作一直为自然语言处理和语义网、知识图谱等行业人士喜爱,但是...本体开发101:创建一个本体的指南 娜塔莉亚·诺伊(Natalya F. Noy) 和黛博拉·麦坚尼斯(Deborah L. 斯坦福大学,斯坦...
  • 1、插入学生数据 学号 姓名 性别 所在班级 年龄 001 张静 女 班 20 002 王伟 ...
  • 数据库使用开启 mongodb 服务:要管理数据库,必须先...清屏:cls查看所有数据库列表show dbs 创建数据库使用数据库、创建数据库use student 如果真的想把这个数据库创建成功,那么必须插入一个数据。 数据库中不能直
  • 本文分两部分,第部分为Mysql 参考手册列举的日期、时间函数说明...第二部分为根据项目实践谈谈常用的Mysql日期、时间函数使用案例,如:查询条件开始--截止日期,根据出生日期计算年龄,根据当前时间戳自动更新等。
  • 你可能第次见到这么长的总结文,有点硬核,耐心阅读
  • Hibernate自动创建

    万次阅读 2013-11-22 15:01:37
    Hibernate支持自动建表,在开发阶段很方便...、通过Hibernate的ShemaExport来创建 1)实体类 package com.xiaomo.vo; public class User { private int id;// 用户id private String name;// 用户名称 private int
  • PyQt5的表格创建

    万次阅读 2018-04-16 12:32:31
    PyQt5中有两种创建表格的控件:Table View和Table Widget。 1、Table Widget QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC、C#中的DataGrid。 pyqt5的tablewidget组件比较特殊,每方格可以...
  • MySQL创建表和约束条件(四)

    千次阅读 2019-11-15 14:09:16
    章简单介绍了 MySQL的数据类型(三),如果没有看过,请观看上. 创建表 上章时,我们学习了 MySQL的数据类型, 就像Java 知道了 int,string 之后,就该学习类了, 现在,我们知道了数据类型,就该去学习...
  • 《SpringBoot初遇Spring-Data-JPA》在此,对Spring Data Jpa...、Spring Data JPA设置创建方式: 创建方式一共分为四种: #配置数据库,使用SpringJPA spring: datasource: url: jdbc:mysql://localhost:3306/test
  • MongoDB文档更新操作

    千次阅读 2018-04-24 09:35:35
    我们在前面的文章中提到过文档的基本的增删改查操作,MongoDB中提供的增删改查的语法非常丰富,本文我们主要来看看更新都有哪些好玩的语法。 本文是MongoDB系列的第四篇文章,了解前面的文章有助于更好的理解本文...
  • Mysql索引实现原理与创建索引

    千次阅读 多人点赞 2019-02-25 17:56:42
    索引: 提高查询效率, 消除数据分组/排序, 避免 “回表” 查询 , 优化聚合查询, 用与多表 JOIN 关联查询, 利用唯一性约束保证数据唯一性, ...如果表中查询的列有一个索引,Mysql 能够快速到达一个位置去搜索...
  • SQL Server T-SQL高级查询

    千次阅读 2016-05-10 15:01:56
    SQL Server T-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的。 Ø 基本常用查询–selectselect * from student;–all 查询所有select all sex from student;–distinct 过滤重复select ...
  • 学习计划的第四天,仍然...两个或多个事务更新同一行,但这些事务彼此之间都不知道其它事务进行的修改,因此第二个更改覆盖了第一个修改 。 这样说太抽象,举个例子:在数据库表中存在一条数据 id:100 name:张散 ...
  • MySQL查询语句大全集锦

    千次阅读 2016-05-27 11:09:02
    MySQL查询语句大全集锦 ...2创建一个数据库MYSQLDATA mysql> CREATE DATABASE MYSQLDATA; 3:选择你所创建的数据库 mysql> USE MYSQLDATA; (按回车键出现Databasechanged 时说明操作成功!) 4:查看现在的数
  • mysql各种查询包括连接查询

    千次阅读 2014-05-27 15:10:36
    SQL查询语句大全集锦 MYSQL查询语句大全集锦 ...2:2、创建一个数据库MYSQLDATA mysql> CREATE DATABASE MYSQLDATA; 3:选择你所创建的数据库 mysql> USE MYSQLDATA; (按回车键出现Database changed 时说
  • MongoDB数组修改器更新数据

    千次阅读 2016-02-17 15:56:16
    MongoDB数组修改器更新数据 这里,我们了解一下数组修改器。数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用。数组修改器,顾名思义,它是用来修改...
  • SQL语句 创建表、模式、索引

    千次阅读 2020-04-10 11:16:45
    一、数据定义语句 一、 数据定义: 操作对象 创建 删除 修改 模式 CREATE SCHEMA DROP ~ 表 CREATE TABLE DROP ~ ALTER TABLE ...一个数据库中可以建立多个模式,一个模式下通常包括多个表...
  • 数据库的查询与视图

    万次阅读 2012-05-28 20:13:03
    第4章 数据库的查询和视图 4.1.1 选择列 通过SELECT语句的项组成结果表的列。 ::= SELECT [ ALL |DISTINCT ] [ TOP n [ PERCENT ] [ WITH TIES ] ] { * /*选择当前表或视图的所有列*/ | { table_name |view_...
  • 章 MySQL基础-简单查询

    千次阅读 2020-03-17 19:53:59
    第一章 MySQL基础-简单查询 数据库的概念 数据库: 存储数据的大型仓库, 数据库由表,视图,触发器,函数,存储过程,事件等组成的....一个数据库服务器包括若干数据库, 一个数据库包括若干张表; 数据库是“按...
  • Ant Design 4.0更新指南(1)——ProTable

    千次阅读 热门讨论 2020-03-30 11:26:23
    作为国内最好用的组件库【之】的Ant Design迎来跨版本大更新,年后复工后我在第时间便进行了尝鲜,刚好公司有老项目重构,在初步了解之后,决定尝试在新项目中使用And Design 4.0进行开发,与之对应的Ant ...
  • 前言: 从事python学习,有爬虫、web后台、深度学习相关经验, 坐标北京欢迎骚扰。 本答案力求简洁和直击重点,代码部分使用Python3,...1. 列出 5 常用 Python 标准库? import os # 操作系统接口 示例:os.s...
  • MYSQL索引的作用以及如何创建索引

    千次阅读 2019-06-27 14:58:13
    一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。 在数据量和访问量不大...
  • 使用Navicat12创建存储过程,执行定时事件需求说明: 一个用户在他第一次添加手机号码的时候自动他绑定到用户表的phone字段方法一:创建存储过程,执行定时事件1 创建两张表1.1 用户表tbl_userCREATE TABLE `...
  • 视图 先来说说啥是视图,我们继续百度百科 通过阅读这一段话,我们可以知道,视图就是指的数据库...作用其实就是为了展示的,好比现在有好多表一起联查,你可以图方便,直接定义一个视图,到时候直接查询视图就好了
  • 经典SQL查询语句大全

    千次阅读 多人点赞 2018-03-09 14:38:10
    、基础1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:\...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,477
精华内容 8,990
关键字:

创建一个更新查询将年龄加1