MYSQL基础(DQL)

数据查询语句:
查询 将数据从表取出,放到一个临时的表中。查询有三种方式(选择,投影,连接)

Select 子句
from 子句
where 子句
order by 排序
having 子句
group by 分组
union 连接
1.From 首先确定数据检索的源—表
2.Where 确定限定条件对应的行—行
3.Select 确定需要检索的数据投影到对应的列—列

 无条件单表查询

1. 查询表中所有列
Select * from emp;

2. 查询表中指定列
Select ename,eno from emp;
Select eno,ename from emp;
可以更改列的顺序

3. 算术运算符
Select 子句中支持加减乘除和函数
Eg.查看员工年薪
Select ename,empno,sal*12+comm from emp;
Eg.员工转正后,月薪上调20%, 请查询出所有员工转正的月薪;转正日期为入职后的6个月
select ENAME ‘员工姓名’ , SAL ‘实习工资’ , hiredate ‘入职日期’, hiredate+interval 6 month ‘转正日期’, sal*1.2 ‘转正工资’ from emp;
Eg.员工试用期6个月,转正后月薪上调20%,请查询所有员工工作第一年的年薪所得
(不考虑奖金部分,年薪的试用期6个月的月薪+转正后的6个月的月薪)
select ENAME ‘员工姓名’ , SAL ‘实习工资’ , hiredate ‘入职日期’, hiredate+interval 6 month ‘转正日期’, sal*6+sal*1.2*6 ‘年薪’ from emp;
select ename,sal,DATE_ADD(hiredate,INTERVAL 6 MONTH) as newdate from emp;

4. null
任何值与null计算结果都为null
通过ifnull 将 null 置为0
select ename,sal * 12+ifnull(comm,0) from emp;

5. 别名
Select 列 ‘列名’ from emp;
Select 列 as ‘列名’ from emp;
Eg.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的所有收入,需要考虑奖金部分,要求显示列标题为员工姓名,工资收入, 奖金收入,总收入
select ENAME ‘员工姓名’ , sal*6+sal*1.2*6 ‘工资收入’, ifnull(comm, 0) ‘奖金收入’ , sal*6+sal*1.2*6+ifnull(comm, 0) ‘年薪’ from emp;

6. 连接字符串
Oracle 使用||进行字符串连接
Sql server 使用+进行字符串连接
Mysql 使用cancat()函数进行字符串连接
字符串常量被称为原义字符串
select concat(ename,’ 的岗位是 ‘,job) ‘员工岗位’ from emp;

7. 消除重复行
select distinct job from emp;

 条件单表查询

1. Where
关系运算符(< <= > >= <> != = )
可以对数值型 字符型 日期型 直接进行运算
select empno,ename,deptno from emp where ename>’王’;
特殊运算符(between and in like is null)
between 上限 and 下限 结果集操作包含上限和下限对应的行
like 模糊查询 %零个或者多个字符 _表示有且仅有一个字符
可以通过escape标示符实现对_ % 本身这两个字符的查找
不区分大小写

select empno,ename,deptno from emp where empno between '00002' and '00003';
select *  from emp where comm in(500,800);
select empno,ename,deptno from emp where empno in('00002','00003' );
select *  from emp where ename like '王%';
select *  from emp where hiredate like '_____03%';
select *  from emp where ename like '%/_%' escape '/';

逻辑运算符( and or not)
优先级: not and or

分页
Sql server top
Oracle renum
Mysql limit
Limit 0,5 0代表起始行 5代表起始行开始连续的行的个数
limit (pagesize-1)*pizenum,pizenum

2.Order by
默认为升序 asc
降序序显式声明为desc
select * from emp order by deptno desc;
select ename,job from emp order by deptno asc;

多列排序
select * from emp order by deptno asc,sal desc;
select ename,job from emp order by 2 asc;

mysql中用命令行复制表结构的方法主要有一下几种:

1.只复制表结构到新表
CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2 ;

CREATE TABLE 新表 LIKE 旧表 ;
注意上面两种方式,前一种方式是不会复制时的主键类型和自增方式是不会复制过去的,而后一种方式是把旧表的所有字段类型都复制到新表。

2.复制表结构及数据到新表
CREATE TABLE 新表 SELECT * FROM 旧表

3.复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表 SELECT * FROM 旧表

4.复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2,…….) SELECT 字段1,字段2,…… FROM 旧表

单行函数

1 字符函数

大小写处理
LOWER(str) UPPER(str)
SELECT LOWER(ename) from emp;
SELECT UPPER(ENAME) from emp;

字符处理函数
CONCAT(str1,str2,…) SUBSTR(str,pos,len) LENGTH(str)

SELECT CONCAT(ename,’ 的薪水是 ‘,sal) 薪水 FROM emp;
SELECT SUBSTR(ename,1,1) 姓氏 FROM emp
SELECT SUBSTR(ename,2) 名字 FROM emp
SELECT SUBSTR(ename,-1,1) 名字 FROM emp
SELECT ename,LENGTH(ename) 名字存储字节长度 FROM emp
SELECT ename,CHAR_LENGTH(ename) 名字字符长度 FROM emp

字符处理函数
INSTR(str,substr) 填补
LPAD(str,len,padstr) :用字符串 padstr对 str进行左边填补直至它的长度达到 len个字符长度,然后返回 str。如果 str的长度长于 len’,那么它将被截除到 len个字符。
RPAD(str,len,padstr) :用字符串 padstr对 str进行右边填补直至它的长度达到 len个字符长度,然后返回 str。如果 str的长度长于 len’,那么它将被截除到 len个字符。
TRIM([remstr FROM] str)
SELECT * from dept
SELECT loc,INSTR(LOC,’楼’) FROM dept
SELECT loc,LPAD(loc,10,’#’) FROM dept;
SELECT loc,RPAD(loc,2,’#’) FROM dept;
SELECT loc,REPLACE(loc,’楼’,’栋’) FROM dept
SELECT TRIM(’ 你好 ‘),TRIM(’s’ from ‘sssdsssddss’) FROM DUAL;

e.g查询姓名包含大写或小写字母a的员工姓名
select ename,CHAR_LENGTH(ename) from emp where instr(upper(ename),’A’)>0;

数值函数

SELECT FLOOR(RAND()*100) FROM DUAL
SELECT sal,CONCAT(‘$’,ROUND(sal,2))from emp
ROUND:Round(number,[decimals])
其中:
number 待做四舍五入处理的数值
decimals 指明需保留小数点后面的位数。可选项,忽略它则保留0位小数,精确到个位;为负数,表示为小数点左边四舍五入处理。

日期函数

时间相加
SELECT DATE_ADD(CURDATE(), INTERVAL 31 DAY)
*SELECT ADDDATE(CURDATE(), INTERVAL 31 DAY)

时间查询
SELECT DATE(‘2003-12-31 01:02:03’)
SELECT DATEDIFF(‘1997-11-30’,’1997-12-31’)
SELECT SUBDATE(CURDATE(), INTERVAL 3 DAY)
SELECT INTERVAL 1 DAY + ‘1997-12-31’

日期格式调整
SELECT DATE_FORMAT(CURDATE(),’%Y年%M月%D日’)
SELECT DAYOFMONTH(NOW()),DAYOFWEEK(NOW())

取出日期
SELECT DATE(NOW())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值