每周练习题2
1.有一张persons表包含如下信息:
现要选取居住地址Address以'C'或'h'开头 或以 'et' 结尾的所有数据,结果显示为:
下列MySQL查询语句正确的是:
SELECT * FROM persons WHERE Address REGEXP '[^Ch]|et$';
SELECT * FROM persons WHERE Address REGEXP '^[Ch]et$';
SELECT * FROM persons WHERE Address REGEXP '^[Ch]|et$';
SELECT * FROM persons WHERE Address REGEXP '^[Ch]|[et]$';
^: 匹配输入字符串的开始位置 $: 匹配输入字符串的结束位置 []: 匹配中括号里任意1个 |: 并集,就是或(or) 正确答案:C2.SELECT COALESCE(NULL,fat,2)AS name1,COALESCE(pig,test,test)AS name2 FROM NAMETABLE;以上SQL执行后name1和name2分别为多少
NULL,pig
2,test
fat,pig
null,test
正确答案: C 你的答案: B (错误) 参考分析: COALESCE用法顺口溜,帮助大家理解: COALESCE,查空值, 按顺序不能乱; 核心规则要记牢; 不为空为自己; 为空就看下1位; 一直看下去; 除非只剩后1位; 为空就为它。3. Mysql中表student_table(id,name,birth,sex),插入如下记录:
('1001' , '' , '2000-01-01' , '男');('1002' , null , '2000-12-21' , '男');
('1003' , NULL , '2000-05-20' , '男');
('1004' , '张三' , '2000-08-06' , '男');
('1005' , NULL , '2001-12-01' , '女');
('1006' , '张三' , '2001-12-02' , '女'); 执行
select t2.name from (select * from student_table where sex = '女')t1 right join (select * from student_table where sex = '男')t2 on t1.name = t2.name ;的结果行数是()? 做题思路: 看结构:两个子查询表右连接 定子查询表的行数: 子查询表 t1 (女的) :2行 子查询表 t2 (男的) :4行 看连接桥梁: 两个子查询的人名一样
计算连接后行数:右连接,以t2(男的)为主,t2的名字在t1中没有重复的,那么答案就是t2本来的行数4.
4.写一段SQL,已知衬衫表SHIRTABLE,请你实现通过窗口函数实现,根据不同的衬衫种类shirt_type,按照销售单价shirt_price从低到高的顺序创建排序表()
SELECT shirt_name, shirt_type, shirt_price, RANK() OVER (PARTITION BY shirt _type ORDER BY shirt_price) AS ranking FROM SHIRTABLE
SELECT shirt _name, shirt_type, shirt _price, PARTITION BY shirt _type ORDER BY shirt _price AS ranking FROM SHIRTABLE
SELECT shirt _name, shirt_type, shirt _price, RANK (PARTITION BY shirt _type ORDER BY shirt _price) AS ranking FROM SHIRTABLE
SELECT shirt _name, shirt_type, shirt _price, RANK() OVER (PARTITION BY shirt_type) AS ranking FROM SHIRTABLE正确答案: A 你的答案: B (错误) 参考分析: 窗口函数:over()窗口函数的语法结构 及常与over()一起使用的分析函数 1、over()窗口函数的语法结构
2、常与over()一起使用的分析函数
1、over()窗口函数的语法结构
over()函数中包括三个函数:分区partition by 列名、排序order by 列名、指定窗口范围rows between 开始位置 and 结束位置(可用\可以不用) 若over()函数中不使用这三个函数,窗口大小是针对查询产生的所有数据,如果指定了分区,窗口大小是针对每个分区的数据。partition by
partition by可理解为group by 分组。over(partition by 列名)搭配分析函数时,分析函数按照每一组每一组的数据进行计算的。
B、rows between 开始位置 and 结束位置
是指定窗口范围,比如第一行到当前行。而这个范围是随着数据变化的。over(rows between 开始位置 and 结束位置)搭配分析函数时,分析函数按照这个范围进行计算的。
2、常与over()一起使用的分析函数:
2.1、聚合类
avg()、sum()、max()、min()
2.1、排名类
rank() 按照值排序时产生一个自增编号,值相等时会重复,会产生空位(如:1、3、3、6、9)dense_rank() 按照值排序时产生一个自增编号,值相等时会重复,不会产生空位(如:1、2、2、3、3、4)
row_number() 按照值排序时产生一个自增编号,不会重复(如:1、2、3、4、5、6)
Rank()分析函数: (1)连续或不连续:dense_rank,rank (2)分区或不分区:使用partition,不使用partition 语法:rank() over(partition by 分区字段 order by 排序字段 顺序)
5.Mysql中表student_table(id,name,birth,sex),插入如下记录:
('1001' , '' , '2000-01-01' , '男');('1002' , null , '2000-12-21' , '男');
('1003' , NULL , '2000-05-20' , '男');
('1004' , '张三' , '2000-08-06' , '男');
('1005' , '李四' , '2001-12-01' , '女');
执行 select count(name) from student_table 的结果是()?
5
4
3
2
正确答案: C 你的答案: A (错误)
'' 这种只是没有实际的值,不是null(空),也是可以查询出来的
根据 MySQL 官方文档 可知,其实 count 函数 的作用是:
count(表达式)
返回 该表达式 结果非NULL 的行数。
事实上,当 count 函数 的参数为 NULL 时不会进行计算,只要参数 非NULL 都会进行计算(当参数为 0 时也会进行计算)。
并且之前学习数据库的时候是记录过的,但是自己是没有记住的,
6.一个SQL语句执行顺序是什么?
常见的一些执行顺序: 1 from 2 where 3 group by 4 having 5 select 6 order by 7 limit
知识点: 1.WHERE子句不能直接跟聚合函数 MAX.MIN等 2.WHERE子句能跟含聚合函数的子查询All:对所有数据都满足条件,整个条件才成立;
Any:只要有一条数据满足条件,整个条件成立;
Some的作用和Any一样 .
数据查询语言(DQL):是由SELECT子句,FROM子句,WHERE子句组成的查询块
数据操纵语言(DML): SELECT(查询) INSERT(插入) UPDATE(更新) DELETE(删除)
数据定义语言(DDL):CREATE(创建数据库或表或索引)ALTER(修改表或者数据库)DROP(删除表或索引)
数据控制语言(DCL):GRANT(赋予用户权限) REVOKE(收回权限) DENY(禁止权限)
事务控制语言(TCL):SAVEPOINT (设置保存点)ROLLBACK (回滚) COMMIT(提交)
7.大学生春季运动会的数据库,保存了比赛信息的三个表如下:
运动员 sporter(运动员编号 sporterid,姓名name,性别 sex,所属系号 department),
项目 item(项目编号 itemid,名称 itemname,比赛地点 location), 成绩 grade(运动员编号 id,项目编号 itemid,积分 mark)。
用SQL语句完成在“体育馆”进行比赛的各项目名称及其冠军的姓名,正确的是:( )。
SELECT i.itemname,s.name FROM grade g,
(SELECT itemid iid,MAX(mark) max FROM grade WHERE itemid IN ( SELECT itemid FROM item WHERE location='体育馆') GROUP BY itemid) temp,item i,sporter s
WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;
SELECT i.itemname,s.name FROM grade g,
(SELECT itemid iid,MIN(mark) max FROM grade WHERE itemid IN ( SELECT itemid FROM item WHERE location='体育馆') GROUP BY itemid) temp,item i,sporter s
WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;
SELECT i.itemname,s.name FROM grade g,
(SELECT itemid iid,MAX(mark) max FROM grade WHERE itemid IN ( SELECT itemid FROM item WHERE location='体育馆') ) temp,item i,sporter s
WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;
SELECT i.itemname,s.name FROM grade g,
(SELECT itemid iid,MIN(mark) max FROM grade WHERE itemid IN ( SELECT itemid FROM item WHERE location='体育馆') GROUP BY itemid) temp,item i,sporter s
WHERE g.itemid=temp.iid AND g.mark=temp.max AND
正确答案: A 你的答案: C (错误)
参考解析:
这样应该能清晰一点 1,首先找出在“体育馆”中进行的比赛项目id; SELECT itemid FROM item WHERE location='体育馆' 2,然后在成绩表中根据项目id进行分组后找出单个项目最高分; SELECT itemid iid,MAX(mark) max FROM grade WHERE itemid IN ( SELECT itemid FROM item WHERE location='体育馆') //条件限制地点在体育馆 GROUP BY itemid 3,接下来将上面含有项目id和项目最高分信息的表与另外三张表连接; grade g, (上面含有项目最高分信息的表) temp, item i,sporter s WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid4,最后按要求从连接后的表中选出项目名称和冠军姓名。 SELECT i.itemname,s.name FROM (以上连接后的表)
8.大于小于怎么转义?case函数格式
< 和 > 分别对应 < 和 >
case when 判断条件 then 成功结果 then 不成功结果 end
9.某打车公司要将驾驶里程(drivedistanced)超过5000里的司机信息转存到一张称为seniordrivers 的表中,他们的详细情况被记录在表drivers 中,正确的sql语句为()
insert into seniordrivers where drivedistanced>=5000 from drivers
insert into seniordrivers(drivedistanced) values from drivers where drivedistanced>=5000
insert into seniordrivers(drivedistanced) where values>=5000 from drivers
select * into seniordrivers from drivers where drivedistanced >=5000
正确答案: D 你的答案: B (错误)
参考解析:复制表的几种方式
INSERT INTO 语句用于向表格中插入新的行。INSERT INTO table_name VALUES (值1, 值2,....) 指定所要插入数据的列: INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。
把所有的列插入新表 SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename
只把希望的列插入新表 SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename
10.TRUNCATE函数和ROUND函数对比
TRUNCATE函数将expr按照int_expr长度在小数点后按照位数直接进行截取。
实例:
SELECT TRUNCATE(200.12567,4);
输出结果:200.1256
二、ROUND(expr, int_expr)用法
ROUND函数将expr按照int_expr长度在小数点后按照位数进行四舍五入截取。
实例:
SELECT ROUND(200.12567,4);
输出结果:200.1567
对比实例:
SELECT ROUND(200.12567,4),TRUNCATE(200.12567,4);
输出结果:
11.视图
mysql可以使用 DROP VIEW 语句来删除视图。
视图是虚表,它在存储时只存储视图的定义,而没有存储对应的数据
创建视图用CREATE VIEW
修改视图用ALTER VIEW
12.下列选项中关于数据库事务的特性描述正确的是
事务允许继续分割
多个事务在执行事务前后对同一个数据读取的结果是不同的
一个事务对数据库中数据的改变是暂时的
并发访问数据库时,各并发事务之间数据库是独立的
正确答案: D 你的答案: C (错误)
参考分析:
一个事务是一个完整的业务逻辑单元,不可再分。A 错误 事务隔离性存在隔离级别。理论存在4个级别。读未提交,读已提交。可重复读。序列化(串行化)。 读未提交:会导致脏读、不可重复读取、幻读问题。脏读(即一个事务读取了另一个事务未提交的数据)。不可重复读(一个事务还未提交。读取了另一个事务使用update和delete语句后。提交的数据。产生了不同的结果集,这种现象称为。不可以重复读取。)。幻读(同一个查询还未提交。读取了另一个事务使用insert语句后。且提交后。产生了不同的结果集。这种现象称为。幻读)。 读已提交:会导致 不可重复读和幻读问题。解决了脏读。 可重复读取:解决了上述,三个问题不加锁。msyql innodb(默认第三种隔离级别) 序列化:也解决了上述,三个问题。但是使用了锁的方式。 所以B错误 一旦事务提交。就不可以回滚。所以c 错误。 隔离级别的存在。就是为了保证。在当前事务操作的时候数据库中的数据,数据一致的问题。D对。隔离性: 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的;
13.Mysql中表student_table(id,name,birth,sex),score_table(stu_id,subject_name,score),查询多个学科的总分最高的学生记录明细以及总分,如下SQL正确的是()?
select t2.*,c1 as `最高分` from (
select stu_id,sum(score) as c1 from score_table group by stu_id order by c1 desc limit 1
) t1
join student_table t2
on t1.stu_id = t2.id ;
select t2.*,c1 as `最高分` from (
select stu_id,max(score) as c1 from score_table group by stu_id order by c1 desc limit 1
) t1
join student_table t2
on t1.stu_id = t2.id ;
select t2.*,c1 as `最高分` from (
select stu_id,max(sum(score)) as c1 from score_table group by stu_id order by c1 desc limit 1
) t1
join student_table t2
on t1.stu_id = t2.id ;
select t2.*,c1 as `最高分` from (
select stu_id,max(sum(score)) as c1 from score_table group by stu_id
) t1
join student_table t2
on t1.stu_id = t2.id ;
正确答案: A 你的答案: C (错误)
参考分析:注意聚合函数是不能嵌套的,我们所以选择A不选D。A使用降序加limit1 限制取最大的那个。
14.触发器
SQL server支持两种类型的触发器,AFTER触发器和INSTEAD OF触发器,其中、AFTER触发器要求执行某一操作INSERT、UPDATE、DELETE之后才能够触发。 INSTED OF触发器表示并不执行其所定义的操作INSERT、UPDATE、DELETE,而仅仅是触发器本身,既可以是表上定义的INSTEAD OF触发器,或者是视图是定义的INSTEAD OF 触发器转自 ————————————————
版权声明:本文为CSDN博主「legendaryhaha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/legendaryhaha/article/details/80368114
15.Mysql(版本8.0.25)中表student_table(id,name,birth,sex),
插入如下记录: ('1004' , '张三' ,'2000-08-06' , '男');
('1009' , '李四', '2000-01-01', '男');
('1010' , '李四', '2001-01-01', '男');
('1006' , '王五', '2000-08-06' , '女');
('1008' , '张三', '2002-12-01', '女');
('1012' , '张三', '2001-12-01', '女');
('1011' , '李四', '2002-08-06' , '女');
执行
select t1.*,t2.*
from (
select * from student_table where sex = '男' ) t1
full outer join
(select * from student_table where sex = '女')t2
on t1.name = t2.name ;
的结果行数是()?
5
4
3
执行报错
参考分析:mysql 不支持full join
16.查询语句select stuff('lo ina',3, 1, 've ch')结果为?stuff函数
love
love china
china love
china
正确答案: B 你的答案: 空 (错误)
参考分析:
STUFF(原字符, 开始位置, 删除长度, 插入字符),从指定的起点处开始删除指定长度的字符,并在此处插入另一组字符。
17.在SQL中如何删除触发器?
删除触发器: DROP TRIGGER 输入 : DROP TRIGGER newproduct; newproduct :触发器名称18.Mysql中表student_table(id,name,birth,sex),score_table(stu_id,subject_name,score),
查询每个学生的分数最高的学科以及对应分数、学生明细记录,如下SQL正确的是()?
select t3.*,t2.subject_name,t2.score
from (
select stu_id,max(score) as c1 from score_table group by stu_id
) t1
inner join
(
select * from score_table
)t2 on t1.stu_id = t2.stu_id and t1.c1 = t2.score
inner join student_table t3
on t1.stu_id = t3.id;
正确答案: D 你的答案: C (错误)
19.mysql空字符串和null不同之处
注意:1001和1002是不一样的,一个是空字符串,一个是NULL。针对这两种数据使用length()函数结果是不相同的。 针对1001 length(name)结果是0,针对1002、1003 length(name)结果是空值NULL 因此题干where length(name) >= 0 会筛选出 1001、1004、1005三条数据。空字符串结果为0,空值NUll不显示。20.如何修改表名?
要将employee 的表名更改为 employee_info,下面MySQL语句正确的是:
ALTER TABLE employee RENAME employee_info;表重新命名:ALTER TABLE 旧表名 to 新表名; 列重新命名:ALTER TABLE 表名 CHANGE 旧字段 新字段 列数据类型;
21.”确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新”是对下列选项哪一个事务隔离级别的描述()
在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。● 未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
● 授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
● 可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
● 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
22.假设创建新用户nkw,现在想对于任何IP的连接,仅拥有user数据库里面的select和insert权限,则列表语句中能够实现这一要求的语句是()
grant select ,insert on user.* to 'nkw'@'%'考察知识点-数据库授权命令: GRANT<权限> on 表名(或列名) to 用户 正确答案选项B: insert,select: 权限 表名: user 用户:nkw 补充知识点-回收权限 REVOKE <权限> on 表名(或列名) FROM 用户
23.下列选项关于函数的描述正确的是()
与系统函数一样,用户定义函数可以从查询中调用
24.批处理是指包含一条或多条T-SQL语句的语句组,下列选项中,关于批处理的规则描述正确的是()
一、批处理
1 .批处理:指包含一条或多条T - SQL语句的语句组,这组语句从应用程序一次性地发送到SQL server服务器执行。
2 .执行单元:SQL server服务器将批处理语句编译成一个可执行单元,这种单元称为执行单元。
3 .若批处理中的某条语句编译出错,则无法执行。若运行出错,则视情况而定。
4 .书写批处理时,go语句作为批处理命令的结束标志,当编译器读取到go语句时,会把go语句前的所有语句当作一个批处理,并将这些语句打包发送给服务器。go语句本身不是T - SQL语句的的组成部分,只是一个表示批处理结束的前端指令。
5 .建立批处理里注意:
( 1 ). create default , create rule , create trigger和create view等语句在同一个批处理中只能提交一个。
( 2 ).不能在删除一个对象之后,在同一批处理中再次引用这个对象。
( 3 ).不能把规则和默认值绑定到表字段或者自定义字段上之后,立即在同一批处理中使用它们。
( 4 ).不能定义一个check约束之后,立即在同一个批处理中使用。
( 5 ).不能修改表中一个字段名之后,立即在同一个批处理中引用这个新字段。
( 6 ).使用set语句设置的某些set选项不能应用于同一个批处理中的查询
( 7 ).若批处理中第一个语句是执行某个存储过程的execute语句,则execute关键字可以省略。若该语句不是第一个语句,则必须写上。
例:
use taihang
go
select * from yuan
go
creacte view view1 as
select * from yuan
where qq = ' asdf '
go
select * from view1
go
————————————————
版权声明:本文为CSDN博主「gloomylilac」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gloomylilac/article/details/1943308
25.下面有关sql 语句中 delete、truncate的说法正确的是?
1、处理效率:drop>trustcate>delete.
2、drop删除整个表;trustcate删除全部记录,但不删除表;delete删除部分记录
3、delete不影响所用extent,高水线保持原位置不动;trustcate会将高水线复位。
4、truncate将直接删除原来的表, 并重新创建一个表, 因此执行速度比delete快。
详细分析请参考:
https://www.cnblogs.com/javaxubo/p/15493274.html
26.下列修改表的列结构的语句中,错误的是
选项A :ALTER TABLE class MODIFY name VARCHAR(50); 语法: 修改字段数据类型 ALTER TABLE 表名 MODIFY 字段名 字段类型; 选项B:ALTER TABLE student ADD grade INT; 语法: 添加字段: ALTER TABLE 表名 ADD 新字段 字段类型; 选项C:ALTER TABLE place CHANGE name p_name VARCHAR(20); 语法: 更新字段: ALTER TABLE 表名 CHANGE 旧字段 新字段 字段类型; 选项D:ALTER TABLE grade ADD average FIRST; 语法错误。 小结:增加&更新字段,字段后面要跟字段类型。另外,在更新字段时,要指明要更新的旧字段。30.关于维护参照完整性约束的策略,下列选项描述不正确的是()
对于任何违反了参照完整性约束的数据更新,系统一概拒绝执行
当删除被参照表的一个元组造成了与参照表的不一致,则删除参照表中的所有造成不一致的元组
当修改被参照表的一个元组造成了与参照表的不一致,则修改被参照表中的所有造成不一致的元组
当删除或修改被参照表的一个元组造成了不一致,则将参照表中的所有造成和不一致的元组的对应属性设置为空值
正确答案: C 你的答案: C (正确)31.Mysql中表student_table(id,name,birth,sex),查询name重复的id最大的记录,比如'张三'重复2次,id分别是1、2,则结果是id=2的记录。如下SQL错误的是()?
select t4.*
from (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
inner join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name
)t3
right join
student_table t4
on t3.id = t4.id ;
select t4.*
from (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
inner join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name
)t3
inner join
student_table t4
on t3.id = t4.id ;
select t4.*
from (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
inner join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name
)t3
left join
student_table t4
on t3.id = t4.id ;
select t4.*
from (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
left join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name
)t3
left join
student_table t4
on t3.id = t4.id ;
这个真得实际写一下才能知道哪一个,光是看我看不出来。重点是对连接的运行,inner left right
32.Mysql中表student_table(id,name,birth,sex),分别查询男生、女生的最大、最小出生日期,如下SQL正确的是()?
select sex , min(birth) as min_birth , max(birth) as max_birth from student_table where sex = '男' group by sex union all select sex , max(birth) as max_birth , min(birth) as min_birth from student_table where sex = '女' group by sex ;
select sex , max(birth) as max_birth , min(birth) as min_birth from student_table where sex = '男' or sex = '女';
select sex , max(birth) as max_birth , min(birth) as min_birth from student_table;
select sex , max(birth) as max_birth , min(birth) as min_birth from student_table group by sex ;
参考分析:
DROP TABLE IF EXISTS student_table; CREATE TABLE student_table( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), birth DATETIME, sex CHAR(1) ); INSERT INTO student_table VALUES(NULL,'李明','1998-01-01','男'), (NULL,'李华','1997-01-01','女'), (NULL,'张三','1999-01-01','男'), (NULL,'李四','2000-01-01','女'), (NULL,'王五','1995-01-01','男'), (NULL,'小刘','1996-01-01','女');
自己试了一个才弄明白,D选项是对的,A选项是错的,错误原因在于UNION的前后max与min的位置没对应,如果前后max和min位置对应也就争取了,如果没明白的朋友也可以带入代码试一下!
33.知识点
Charindex()返回字符或字符串在另一个字符的起始位置CHARINDEX(查找字符,被查字符,开始位置) SubString()截取字符串中的一部分字符。SUBSTRING(字符串,开始位置,截取长度) Stuff()删除指定长度的字符,并在指定的起点处插入另一组字符。STUFF(列名,开始位置,长度,替代字符串) Soundex()返回表示字符串声音的一串字符34.数据库分类
数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。
1. 数据查询语言DQL
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
子句组成的查询块:
SELECT <字段名表>
FROM <表或视图名>
WHERE <查询条件>
2 .数据操纵语言DML
数据操纵语言DML主要有三种形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 删除:DELETE
3. 数据定义语言DDL
数据定义语言DDL用来创建数据库中的各种对象-----表、视图、
索引、同义词、聚簇等如:
CREATE/ TABLE/ VIEW/ INDEX/ SYN/ CLUSTER
| | | | |
表 视图 索引 同义词 簇
DDL操作是隐性提交的!不能rollback
4. 数据控制语言DCL
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制
数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
1) GRANT:授权。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
回滚---ROLLBACK
回滚命令使数据库状态回到上次最后提交的状态。其格式为:
SQL>ROLLBACK;
3) COMMIT [WORK]:提交。
在数据库的插入、删除和修改操作时,只有当事务在提交到数据
库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看
到所做的事情,别人只有在最后提交完成后才可以看到。
提交数据有三种类型:显式提交、隐式提交及自动提交。下面分
别说明这三种类型。
(1) 显式提交
用COMMIT命令直接完成的提交为显式提交。其格式为:
SQL>COMMIT;
(2) 隐式提交
用SQL命令间接完成的提交为隐式提交。这些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,
系统将自动进行提交,这就是自动提交。其格式为:
SQL>SET AUTOCOMMIT ON;
35.Mysql中表student_table(id,name,birth,sex)
插入如下记录: ('1004' , '张三' ,'2000-08-06' , '男');('1009' , '李四', '2000-01-01', '男');
('1010' , '李四', '2001-01-01', '男');
('1006' , '王五', '2000-08-06' , '女');
('1008' , '张三', '2002-12-01', '女');
('1012' , '张三', '2001-12-01', '女');
('1011' , '李四', '2002-08-06' , '女'); 执行 select t1.*,t2.*
from (
select * from student_table where sex = '男' ) t1
right join
(select * from student_table where sex = '女')t2
on t1.name = t2.name ;
的结果行数是()?
参考分析:连接,所有主表有四条数据,然后李四有两条(一对二)所以五条数据