1、查询以DS代号打头的商品信息(techdb.商品1)
select * from 商品表1 where 商品代号 regexp '^DS'
2、查询分类名以冰箱结尾的商品
select * from 商品表1 where 分类名 regexp '冰箱$'
3、查询商品代号中包含‘B’字符的产品
select * from 商品表1 where 商品代号 regexp 'B.'
4、查询商品代号中包含X或T的商品
select * from 商品表1 where 商品代号 regexp '[XT]'
5、查询商品代号中不包含X和T的商品
select * from 商品表1 where 商品代号 regexp '[^XT]'
6、查询test表中id中不包含a~h之间任意一个字符的学员
create table test (id char(3), name varchar(10))
insert into test(id,name) values('abc','张三'), ('xyz', '李四'), ('ahd','王五')
select * from test where id regexp '[^a-h]'
7、查询出商品表1中商品代号包含 DB或XY或AH的商品
select * from 商品表1 where 商品代号 regexp 'DB|XY|AH'
8、查询出商品表1中商品代号至少包含1个X的商品
select * from 商品表1 where 商品代号 regexp 'X{1}'
select * from 商品表1 where 商品代号 regexp 'XY{1,3}'
9、高级插入语句
INSERT INTO SELECT语句
语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1
要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量
示例:
drop table if exists mytest;
create table mytest(id int,name varchar(20) );
insert into mytest(id,name) select no,stuname from test2 ;
drop table if exists mytest;
10、replace语句
用REPLACE插入一条记录时,如果不重复,REPLACE就和INSERT的功能一样,如果有重复记录,REPLACE就使用新记录的值来替换原来的记录值。
语法:
replace tablename(列名…) VALUES(列值);
或
replace tablename SET column_name1 =value1, column_name2 = value2,…;
replace test1(id,name,age) values(104,'陈阳',22)
replace test1(id,name,age) values(200,'陈阳',18)
11、删除——高级
它支持类似于以下的语法:
DELETE FROM users WHERE name = 'Mike' LIMIT 6;
一般MySQL并不确定删除的这6条记录是哪6条,为了更保险,我们可以使用ORDER BY对记录进行排序。
DELETE FROM users WHERE name = 'Mike' ORDER BY id DESC LIMIT 6;
示例:
delete from test1 limit 3
delete from test1 where age>20 order by age limit 2
delete from test1 where age>20 order by age desc limit 2
12、将电子专业的所有学生各门课成绩加5分(techdb 成绩表)
update 选课 set 成绩=成绩+5
where 学生号 in (select 学生号 from 学生 where 专业='电子')
13、将员工表中工龄大于30年的工资全部上调20%(northwind)
select 姓名,部门,year(now())-year(雇佣日期) as 工龄 from
员工 where year(now())-year(雇佣日期)>30
update 员工 set 目前薪资=目前薪资*1.2 where year(now())-year(雇佣日期)>30
14、将比生产制造部员工最高工资还要高的员工工资下调20%
以下这种写法是错误的:
select 姓名,部门,目前薪资 from 员工
where 目前薪资>(select max(目前薪资) from 员工 where 部门='生产制造部')
正确的写法是:
update 员工 set 目前薪资=目前薪资*0.8
where 目前薪资>(select t.最高工资 from (select max(目前薪资) as 最高工资 from 员工 where 部门='生产制造部') t)
15、将比生产制部中工资排名前三的员工工资任意一个高的员工工资下调10%
以下代码是错误的:
select 姓名,部门,目前薪资 from 员工 where 目前薪资>
any(select 目前薪资 from 员工 where 部门 ='生产制造部' order by
目前薪资 desc limit 3) and 部门<>'生产制造部'
正确的代码是:
update 员工 set 目前薪资=目前薪资*0.9 where 目前薪资>
any(select t.目前薪资 from (select 目前薪资 from 员工 where 部门 ='生产制造部' order by
目前薪资 desc limit 3) t ) and 部门<>'生产制造部'
如果想把以上条件的员工删除,则SQL代码是:
delete from 员工 where 目前薪资>
any(select t.目前薪资 from (select 目前薪资 from 员工 where 部门 ='生产制造部' order by 目前薪资 desc limit 3) t ) and 部门<>'生产制造部'
16、查询至少选修了王明所选修的所有课程的学生(techdb 学生、选课)
select * from 学生 where 姓名<>'王明' and 学生号 in
(
至少选修了王明所选修的所有课程的学生号
)
至少选修了王明所选修的所有课程的学生号?
select 学生号 from 选课
where 课程号 in (select 课程号 from 选课,学生 where 选课.学生号=学生.学生号 and 姓名='王明')
group by 学生号 having count(*)=(select count(*) from 选课,学生 where 选课.学生号=学生.学生号 and 姓名='王明')
王明所选修的所有课程?
select a.课程号 from 选课 a,学生 b where a.学生号=b.学生号 and 姓名='王明'
最终代码:
select * from 学生 where 姓名!='王明' and 学生号 in (
select 学生号 from 选课
where 课程号 in (select 课程号 from 选课,学生 where 选课.学生号=学生.学生号
and 姓名='王明') group by 学生号 having count(*)=(select count(*) from 选课,学生
where 选课.学生号=学生.学生号 and 姓名='王明'))
或
select * from 学生 where 姓名!='王明' and 学生号=any (
select 学生号 from 选课
where 课程号 in (select 课程号 from 选课,学生 where 选课.学生号=学生.学生号
and 姓名='王明') group by 学生号 having count(*)=(select count(*) from 选课,学生
where 选课.学生号=学生.学生号 and 姓名='王明'))