MySQL数据库-DAY03

修改表格整体结构

alter改变表的结构

添加列

altertable 表名 add 列名 数据类型;

 

删除列

altertable 表名 drop column 列名;

 

添加列,并设定默认值:

altertable 表名 add 列名 数据类型 default 默认值;

 

修改表中某列的数据类型

altertable 表名 modify column 列名 数据类型;

例子:

altertable orders modify column amount float;

 

        微观修改表中的元素    宏观修改表的整体结构

添加    insert                alter table...add...

删除    delete                alter table...drop column...

修改    update                alter table...modify column...

 

修改表名

altertable 表名 rename 新的表名;

 

修改列名

altertable 表名 change 旧名字 新名字 数据类型;

 

对表添加唯一限制

altertable 表名 add constraint MyUniqueConstraint unique(列名1,列名2...,列名N);

 

对表取消唯一限制

altertable 表名 drop index MyUniqueConstraint;

 

对表添加主键限制

altertable 表名 add primary key(列名1,列名2,...,列名n);

 

对表取消主键限制

altertable 表名 drop primary key;

 

对表添加外键限制

altertable 表名

addforeign key(列名1,列名2,...,列名N)

references另一个表的表名(列名1,列名2,...,列名N);

 

例子:

altertable orders

addforeign key(c_id)

referencescustomers(id);

 

对表取消外键限制

altertable 表名 drop foreign key 自动生成的外键限制名;

【注意】

1.用showcreate table查看系统自动生成的限制名

2.是限制名,不是外键名

 

altertable orders drop foreign key orders_ibfk_1;

 

altertable customers drop primary key;

 

对表添加非空限制

altertable 表名 modify 列名 数据类型 not null;

 

对表取消非空限制

altertable customers modify name varchar(20) default null;

insertinto customers values (9,null,null,null,null,null);

 

truncate table

保留表头,也即保留表的格式,只删除表中存放的数据内容

 

truncate table 表名;

【注意】

1.truncatetable 与 delete table 效果一样

2.droptable不仅删除表中的数据,连表的骨架也一起删除,需要用create table 和 insert into table重新建立表

 

------------------------------------------------------------------------------

子查询

【注意】

1.必须用括号包起来

2.order by 不能用于子查询,可以用groupby

3.子查询返回多行的情况,只能用多数据操作符,比如in

4.between操作符不能连接子查询;但是,可以在子查询里面使用between

 

第一类:select语句中嵌套select语句

select列名或者表达式 from 表名

where表达式 比较操作符 (子查询语句);

 

1.返回单值的子查询

select* from customers

wherecustomers.id = (select c_id from orders where o_id = 107);

 

2.返回多值的子查询

select* from customers

wherecustomers.id in (4,5);

 

selectname from customers

whereid in (select c_id from orders where o_name = 'ipad');

 

 

查看顾客的消费大于7000元,同时地址是北京或者上海的顾客信息

提示:in,and,or

 

select* from customers

wherecustomers.id in

(selectc_id from orders where amount > 7000)

and(address = 'Beijing' or address = 'Shanghai')

 

 

练习题:

查看买过价值1万元以上的ipad的客户信息

select* from customers

whereid in (select c_id from orders where o_name = 'ipad' and amount > 10000);

 

子查询与聚合函数配套练习

思考题:

选择消费最少的顾客的信息

select* from customers

whereid =

(selectc_id from orders where amount =

(selectmin(amount) from orders));

 

打印出orders表中amount的最小值

selectmin(amount) from orders; #200

练习题:

列出customers表中,全体顾客的平均工资

selectavg(salary) from customers;   #6587.5

 

 

哪些顾客的c_id,其消费额度amount大于 全体顾客的平均工资

selectc_id from orders

whereamount > (select avg(salary) from customers); #1,3,4,7,5

 

列出customers表中,消费额度大于 全体顾客的平均工资,这样的顾客的全部信息

select* from customers

whereid in

(selectc_id from orders

whereamount > (select avg(salary) from customers));

 

 

练习题*:

列出工资高于平均消费额的客户的总个数

提示:count(*)

selectcount(*) from customers

wheresalary > (select avg(amount) from orders);

 

group by ... having...

having语句嵌套子查询

 

思考题:

1.查询customers表中,各个城市对应的平均工资

selectaddress, avg(salary) from customers

groupby address;

 

2.查询customers表中,address以Sh开头的顾客信息

select* from customers

whereaddress like 'Sh%';

 

3.查询customers表中,城市对应的平均工资大于5000,并且以Sh开头的城市信息

selectaddress,avg(salary) from customers

groupby address

havingavg(salary) > 5000 and address like 'Sh%';

 

selectaddress,avg(salary) from customers

groupby address

havingavg(salary) > 5000 and address in ('Shenzhen','Shanghai');

 

 

第二类:insert语句中嵌套select语句

insertinto 表名 (列名1,列名2,...,列名n)

select列名1,列名2,...,列名n from 表名2

where条件;

 

练习题*:

使用嵌套查询,把customer表中消费额度大于8000元的客户的全部消息,存放在customers2表中

 

truncatetable customers2;

 

insertinto customers2

selectid,name,age,address,salary from customers

whereid in

(selectc_id from orders where amount > 8000);

 

 

 

第三类:delete语句中嵌套select语句

deletefrom 表名1

where列名 操作符

(select 列名 from 表名2where 条件);

 

【注意】

delete 与 update语句嵌套子查询的时候,子查询中涉及的表不同于主句中的表

 

练习题:

把customers2 中,将salary小于customers表中平均工资的顾客信息删除

 

deletefrom customers2

wheresalary <

(selectavg(salary) from customers);

 

 

 

第四类:update语句中嵌套select语句

update表名1

set列名 操作符 新的值

where列名 操作符

(select列名 from 表名2 where 条件);

 

练习题:

1.先把customers2表中数据清空

提示:truncate

 

truncatetable customers2;

 

2.把customers表中的数据复制到customers2中

提示:insert..select..

 

insertinto customers2

selectid,name,age,address,salary from customers;

 

3.把customers2表中,年龄大于customers表中平均年龄的顾客的工资翻倍

提示:update..select..

 

updatecustomers2

setsalary = salary * 2

whereage > (select avg(age) from customers);

 

聚合函数

练习题:

求出customers表中一共有多少顾客,其工资大于所有人的平均工资

 

selectcount(*) from customers

wheresalary > (select avg(salary) from customers);

 

mid(列名,起始位置,长度)

substring(列名,起始位置,长度)

 

例子:

selectmid(name,1,3) from customers;

【注意】

1:从起始位置为1开始

3:打印出三个字母的长度

第一个字母的位置是1,不是0

 

思考题:

用substring函数,打印出orders表中o_name列,从第3个字母开始,打印2个字母长度

selectsubstring(o_name,3,2) from orders;

 

SQL Scalar函数:基于输入值,返回一个单一的值

ucase():转化为大写字母

lcase():转化为小写字母

 

例子:

selectucase(name) from customers;

selectlcase(name) from customers;

 

length():长度

selectname,length(name) from customers;

lengthb()长度,常用于有汉字的语句,查看字段的长度。

 

round():对某个数值字段进行指定小数位数的四舍五入

selectround(salary,1) from customers;

 

concat():合并两个或多个字符串,成为一个字符串

selectconcat(o_name,' ',amount) from orders;

 

replace():搜索和替换一个字符串中的子字符串

update表名

set列名 = replace(列名,需要被替换的子字符串,用来代替的新的子字符串)

where条件;

 

例子:

updateorders set o_name = replace(o_name,'i','x');

 

 

trim():去除字符串中不想要的空字符

ltrim():left左边

rtrim():right右边

 

例子:

selecttrim('  Hi,Wei   ');

selectltrim('  Hi,Wei   ');

selectrtrim('  Hi,Wei   ');

 

 

format():格式化某个字段的显示方式

format(要格式化的数字,需要保留的小数点位置);

 

例子:

selectformat(12345.6789, 2);

 

SQL日期和时间函数

curdate():返回当前日期

2018-07-13

查看数据库当前时间

Selectnow();

2018-07-13 09:40:57

例子:

对比如下两种写法的区别

selectcurdate();

2018-07-13

selectcurdate() + 0;

20180713

selectdate(now());

2018-07-13

datediff: date difference计算出两个日期之间相差的天数

selectdatediff('2015-05-23','2017-11-23');

 

date_add():添加一个时间值

date_add(起始日期,interval表达式 单位)】

 

例子:

selectdate_add('1999-12-31 23:59:59',interval 1 second) result;

 

selectdate_add('1999-12-31 23:59:59',interval 1 day) result;

 

 

date_sub():减少一个时间值

selectdate_sub('2016-07-04',interval 1 day) result;

 

str_to_date():将字符串转为日期类型

selectstr_to_date('21,5,2013','%d,%m,%Y');

 

%Y年,注意一定是大写的Y

%m月

%d日

%H小时

%i分钟

%Ttime时间

%W星期几

 

date_format()调整日期显示的格式

selectdate_format('2017-12-25 23:59:59', '%Y,%m,%d');

selectdate_format('2017-12-25 23:59:59', '%T');

selectdate_format('2017-12-25 23:59:59', '%W');

selectdate_format('2017-12-25 23:59:59', '%H:%i');

 

 

练习题:

1.求出customers表中,地址为北京的顾客的总收入

selectsum(salary) from customers where address = "beijing";

 

2.选出customers表中,工资大于所有顾客平均工资的人,并且以大写字母显示姓名,以小写字母显示地址

selectucase(name),lcase(address) from customers

wheresalary > (select avg(salary) from customers);

 

3.列出customers表中的工资(只取正数部分),工资的位数

selectround(salary,0),length(salary) from customers;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值