sql执行顺序
SELECT 的执行顺序
关键字的顺序是不能颠倒的:
SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …
2.SELECT 语句的执行顺序(在 MySQL 和 Oracle 中,SELECT 执行顺序基本相同):
FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMIT
SELECT DISTINCT player_id, player_name, count(*) as num #顺序5
FROM player JOIN team ON player.team_id = team.team_id #顺序1
WHERE height > 1.80 #顺序2
GROUP BY player.team_id #顺序3
HAVING num > 2 #顺序4
ORDER BY num DESC #顺序6
LIMIT 2 #顺序7
SQL
1.将查询结果插入到另一张表中
INSERT INTO
如果两张表(导出表和目标表)的字段一致,并且希望插入全部数据,可以用这种方法:
INSERT INTO 目标表 SELECT * FROM 来源表 WHERE 条件;
如果只希望导入指定字段,可以用这种方法:
INSERT INTO 目标表(字段1, 字段2, ...)SELECT 字段1, 字段2, ... FROM 来源表 WHERE 条件;
2.日期
将datetime转换为timestamp格式,使用UNIX_TIMESTAMP()函数;
将timestamp转换为datetime格式,使用FROM_UNIXTIME()函数;
将现在数据库的datetime时间转换为timestamp格式:
select UNIX_TIMESTAMP(now()) from dual
select UNIX_TIMESTAMP(‘2020-08-08’) from dual
select UNIX_TIMESTAMP(‘20200808’) from dual
日期比较大小
select order_no from order_info where
enterprise_id = #{enterpriseId}
and create_date<![CDATA[ >= ]]> #{startTime}
and create_date <![CDATA[ <= ]]> #{endTime}
SELECT CURRENT_DATE(),运行结果为 2019-04-03。
SELECT CURRENT_TIME(),运行结果为 21:26:34。
SELECT CURRENT_TIMESTAMP(),运行结果为 2019-04-03 21:26:34。
SELECT EXTRACT(YEAR FROM '2019-04-03'),运行结果为 2019。
SELECT DATE('2019-04-01 12:00:05'),运行结果为 2019-04-01。
DATE_FORMAT()
DATE_FORMAT(date,format)函数用于以不同的格式显示日期/时间数据。 date是日期列,format是格式
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。
SELECT NOW(),CURDATE(),CURTIME()
NOW() CURDATE() CURTIME()
2008-12-29 16:25:46 2008-12-29 16:25:46
3.修改字段
增加字段
ALTER TABLE <表名> ADD COLUMN <新字段名><数据类型>[约束条件]
-- 给actor表首位添加create_date字段
ALTER TABLE actor ADD COLUMN create_date datetime not null DEFAULT '2020-10-01 00:00:00' FIRST;
删除字段
ALTER TABLE <表名> DROP COLUMN <字段名>
-- 将actor_new表的actor_id字段删除
alter table actor_new drop column actor_id;
修改字段
1.修改字段名
ALTER TABLE <表名> RENAME COLUMN A to B
-- 将actor_new表的first_name字段名修改为first_name_new
alter table actor_new rename column first_name to first_name_new;
2.修改字段类型
ALTER TABLE <表名> MODIFY COLUMN <字段名> <类型>
-- 将last_name字段数据类型由varchar(45)修改为char(45)
alter table actor_new modify column last_name char(45) not null;
3.修改字段默认值
ALTER TABLE <表名> ALTER COLUMN <字段名> SET DEFAULT <默认值>
若字段有默认值,则需要先删除字段的约束,在添加新的默认值
根据约束名称删除约束
alter table <表名> alter column <字段名> drop default
-- 若本身存在默认值,则先删除
alter table actor_new alter column last_name drop default;
-- 给last_name添加默认值'洛'
alter table actor_new alter column last_name set default '洛';
3.索引
alter 语句在已经存在的表上创建索引语法
alter table [表名] add index [索引名]
使用 CREATE TABLE 语句创建索引语法:
create index [索引名] ON [表名]
4.字符串
字符串连接
update design_tag set platform_id = CONCAT(platform_id,',99995438') where yn=1
SELECT CONCAT('abc', 123),运行结果为 abc123。
SELECT LENGTH('你好'),运行结果为 6。
SELECT CHAR_LENGTH('你好'),运行结果为 2。
SELECT LOWER('ABC'),运行结果为 abc。
SELECT UPPER('abc'),运行结果 ABC。
SELECT REPLACE('fabcd', 'abc', 123),运行结果为 f123d。
SELECT SUBSTRING('fabcd', 1,3),运行结果为 fab。
5.联表查询
select p.FirstName, p.LastName, a.City, a.State from Person as p left join Address as a on p.PersonId = a.PersonId
6.插入记录
insert into 表名 () VALUES ()
7.数学运算
SELECT ABS(-2),运行结果为 2。
SELECT MOD(101,3),运行结果 2。
SELECT ROUND(37.25,1),运行结果 37.3。