第三篇
DQL:数据查询语言
--select:选择
一、基本查询语句:至少要有两个子句。
1、
select子句和from子句
格式1:可以指定字段进行查询
select colName[,colName.....] from tableName
格式2:查询整张表:
select * from tableName;
通配符*:如果是在select字句中,代替的是所有的字段。
2、给查询显示的列,起别名
格式:
select ename [as] "员工姓名"[,colName as nickName....] from tableName tableNickName
3、where子句:
作用:起到条件限制约束等操作。有过滤的作用。
位置:放在 from子句后。
格式:
select colName from tableName where 条件
条件:关系运算符:
>,>=,<,<=,=,!=,<>。
(1)null在条件中,应该使用is 或者is not
(2)范围查询:针对于某一个字段来说
1:可以使用>,>=和<,<=来进行范围限制
2: 还可以使用between and来限制。
格式:
colName [not] between val1 and val2;
注意: between val1 and val2 相当于闭区间[val1,val2]
(3)集合作为条件写法:同一个字段有多个值的情况下使用。
使用:in|not in
格式: colName [not] in (元素1,元素2,....);
注意:in 相当于 or
not in 相当于 and
集合的其他用法:
注意:mysql数据库中,集合元素的来源只能基于一张表的查询。不能写定值。
all与any
格式:
>all(元素1,元素2,元素3......)
:大于集合中最大的元素。
<all(元素1,元素2,元素3......)
:小于集合中最小的元素。
>any(元素1,元素2,元素3......)
:大于集合中最小的元素。
<any(元素1,元素2,元素3......)
:小于集合中最大的元素。
(4)模糊查询:like关键字
格式: colName like value。
通常与通配符%连用
%:0或0个以上的字符
_:匹配一个字符。
reg: 查询员工姓名第二字母是s的信息
ename like '_s%'
练习和方法:
--修改表的字段名
--格式:alter table tableName change [column] oldColName newColName newType;
--修改表的名称
--格式:alter table oldTableName rename [to] newTableName;
--小贴士:DDL语言都有关键字 table
-- DML语言直接写表名,没有table关键字
--mysql函数之字符串函数(续)
--1、locate(substr,str)/position(substr in str)/instr(str,substr)
--作用:返回substr在str第一次出现的位置。如果没有,返回0;
--练习1:计算出'zuo'在'no zuo no die'第一次出现的位置。
select locate('zuo','no zuo no die');
--练习2:计算'bar'在'foobarfoobarfoo'中第一次出现的位置
select position('bar' in 'foobarfoobarfoo');
--练习3:计算'baa'在'foobarfoobarfoo'中第一次出现的位置
select instr('foobarfoobarfoo','baa');
--2、locate(substr,str,pos)
--作用:从str的下标pos开始向后查找,substr第一次出现的位置。找不到返回0
--练习1:查找'bar'在'foobarfoobarfoo'中 第二次出现的位置。
select locate('bar','foobarfoobarfoo',locate('bar','foobarfoobarfoo')+1);
--3、lpad(str,len,padstr)/rpad(str,len,padstr);
-- 作用:在字符串str的左边/右边添加padstr,添加后的总长度为len。
-- 可称之为左补全/右补全函数
-- 右对齐/左对齐函数
--练习1:在'bar' 左边添加#,总长度为10;
--练习2: 在foo右边添加#,总长度为12;
--练习3:查询emp表中的员工姓名,右对齐,总长度为20。
select lpad(ename,20,' ') from emp;
--练习4:left(str,len)/right(str,len)
-- 作用:返回字符串左端/右端的len个字符。
--练习1: 获取'helloworld'的左端和右端的4个字符。
select left('helloworld',4), right('helloworld',4);
--5、substring(str,pos)/substring(str from pos)
--作用:截取str的子串,从pos下标开始截取到最后。
--练习1:截取"no zuo no die",从下标4开始截取
--练习2:截取"no zuo no die"的最后六个字符。
select substring('no zuo no die',4);
select substring('no zuo no die',-6);
--练习3.substring(str,pos,len)/substring(str from pos
for len)/mid(str,pos,len)
--作用:对str进行截取操作,从pos下标开始,截取len长度个。
--小贴士:数据库的字符串的下标从1开始。
--练习1:对"i like you"进行截取,从第三个位置开始,截取4个长度
select substring('i like you',3,4);
select substring('i like you' from 3 for 4);
select mid('i like you',3,4);
--练习2: 截取like字样。
select substring('i like you',locate('like','i like you'),length('like'));
--7、substring_index(str,delim,count)
--作用:截取str,截取到第count个分隔符delim
--练习1:截取'www.mysql.com',截取到第二个"."
select substring_index('www.mysql.com','.',2);
--练习2: 截取'www.mysql.com',从倒数第二个'.'开始截取。
select substring_index('www.mysql.com','.',-2);
--8、ltrim(str)/rtrim(str)
--作用:删除str的左端/右端的空格
--练习1:删除' bar '字符串的左右空格。
select ltrim(rtrim(' bar ')), length(ltrim(rtrim(' bar ')));
--9、trim([[both | leading | trailing] [remstr] from] str);
--作用: 删除str里两端的remstr。
-- 左右两端由 both|leading|trailing来控制
-- 默认情况:both
--练习1:删除' hello '前后的空格
select trim(' hello '),trim(both ' ' from ' hello ');
-- 10、replace(str,from_str,to_str)
-- 作用:使用to_str替换掉str中的from_str;
--练习1: 使用'#' 替换掉'hellohello'里的"ll";
select replace('hellohello','ll','#');
--练习2: 使用'#' 替换掉'hellohello'里的"l";
select replace('hellohello','l','#');
--11、insert(str,pos,len,newstr)
--作用:使用newstr替换str中的一部分,这部分从pos下标开始,len个。
--练习: 使用"mysql"替换掉"i like you"中的'you';
select insert('i like you',8,3,'mysql');
--12、lcase(str)/lower(str)/ucase(str)/upper(str)
-- 作用:将字符串中的英文字母全变成大/小写。
--练习:将‘I like yourName 3’变成全大写 /全小写。
select lower('I like yourName 3'),upper('I like yourName 3');
--mysql函数之数学函数。
--1、abs(n)
--作用:取参数n的绝对值
--练习1: 获取 5 和-10的绝对值
select abs(5),abs(-10);
--2、sign(n)
--作用:判断参数的符号,
-- 如果是正数,返回1,
-- 如果是负数,返回-1,
-- 如果是0,返回0;
--练习:查看 1+2+(-2*3)的正负情况
select sign(1+2+(-2*3));
--3、mod(m,n):
--作用:返回m对n的取余的结果。同(m%n);
--练习:使用不同方式,计算10对4的取余操作。
select mod(10,4),10%4;
select mod(-10,4),10%4;
select mod(10,-4),10%4;
select mod(-10,-4),10%4;
--4、floor(n)/ceiling(n)
--floor(n) 返回小于等于n的最大整数,向下取整
--ceiling(n) 返回大于等于n的最小整数。向上取整
--练习: 分别使用两个函数对 -3.14 和 0.618 操作。
select floor(-3.14),ceiling(-3.14),floor(0.618),ceiling(0.618);
--5、round(n,d)
--作用:对n进行四舍五入,保留d位小数。
--练习1:对12345.6789分别保留到百位,整数位,小数点后2位。
select round(12345.6789,-2),round(12345.6789),round(12345.6789,2);
--6、pow(x,y)/power(x,y)
--作用:计算x的y次方
--练习 计算10的3次方
select pow(10,3);
--7、sqrt(n)
-- 作用:对n进行开平方。
--练习: 计算64的平方根。
select sqrt(64);
--8、rand()
--作用:返回0~1.0的一个随机小数。
--练习: 获取一个随机数
select rand();
select rand(2);
--9、truncate(n,d)
-- 作用:对数值n进行截断。
-- d为正数时,保留小数点后d位。
-- d为0时,保留整数位。
-- d为负数时,保留小书店前d位。
--练习:对12345.12进行保留1位小数,保留整数位,保留到千位。
select truncate(12345.12,1),truncate(12345.12,0),truncate(12345.12,-3);
--least(n.....)/greatest(n....);
--作用:统计多个参数中的最小值/最大值。
--注意:参数类型可以不一致,但是必须能互相自动转换
--练习:统计1,2,'10','5'中最小值和最大值。
select least(1,2,'10','5'),greatest(1,2,'10','5');
--练习:统计三个日期中的最小和最大的
select least('2018-09-05','2017-12-12','2017-09-05');
select greatest('2018-09-05','2017-09-05','2017-12-12');
--mysq函数之日期时间函数
--1、dayofweek(date)
--作用:查看指定日期date是所在周的第几天,返回的是数字
-- 1--周日.......7--周六
--练习1:查看2018-9-5是所在周的第几天
select dayOfWeek('2018-9-5');
--2、weekday(date)
--作用:返回指定date是所在周的周几。返回的也是数字
-- 0-周1........6--周日
--练习1:查看2018-9-5是周几
select weekday("2018-9-5");
--3、dayname(date)
--作用:返回指定日期是周几,注意:返回的是英文描述。
--练习:查看自己的出生年月日是周几
select dayname('1986-11-08');
--4、dayofmonth(date)/dayofyear(date);
--作用:返回指定日期是当月/当年的第几天
--练习:查看出生日期是当年的第几天
select dayofyear('1986-11-08');
--5、monthname(date)
--作用:返回指定日期所在月的英文描述。
--练习:输出出生年月所在月的英文描述。
select monthname('1989-11-12');
--6、week(date,first)
-- 作用:返回指定日期是当年的第几周。first可以取值0或1.
-- 0表示周日是一周的第一天,1表示周1是一周的第一天。
--练习:查看当前系统时间是今年的第几周。
select week('2018-9-5',1);
--7、year(date),month(date),hour(time),minute(time),second(time)
--作用:返回指定日期或时间的时间分量。
--练习:获取当前系统时间now()的时,分,秒。
select hour(now()),minute(now()),second(now()),year(now())
--8、extract(part from date);
--作用:截取指定日期的一部分,part:year,month,day,hour,minute,second;
--练习: 截取当前系统时间的时间分量
select extract(year from now()),extract(day from now());
--9、date_format(date,format)
--作用:将指定日期date,按照自定义格式,转成字符串显示。
--格式: 年: %y
-- 月: %M或%m
-- 日: %d
--练习: 将当前系统时间格式化 yyyy年mm月dd日 mm分ss秒HH时。
select now();
select date_format(now(),'%Y年%m月%d日 %i分%s秒%H');
--10、curdate()/curtime();
--作用:获取当前系统的日期/时间
select curdate(),curtime();
--11、now()/sysdate()/current_timestamp();
--获取当前系统时间:都包含年月日时分秒。
select now(),sysdate(),current_timestamp();
--12、sec_to_time(n)
--作用:将指定数值n转成时间格式
--练习:计算一下36001转成时间格式
select sec_to_time(36001);
--13、time_to_sec(time)
--作用:将指定时间转成秒的总数。
--练习:将'13:56:56'转成秒数。
select time_to_sec('13:56:56');
select time_to_sec(now());--只转时间部分。
--练习.计算一下自己活了多少个月
select period_diff('201809','199607');