mysql中sql笔记与sql函数

mysql中sql笔记与sql函数

一、sql笔记

1、EXISTS关键字

  • 成立则返回true不成立则返回false。如果返回的是true的话,则该行结果保留
  • 返回的是false的话,则删除该行,最后将得到的结果返回

与 IN 的区别

  • IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况
select * from student s where EXISTS(select stuid from score ss where ss.stuid = s.stuid)
select * from student s where s.stuid in(select stuid from score ss where ss.stuid = s.stuid)

2、mysql如何更新一个表中的某个字段值等于另一个表的某个字段值

update a inner join b
	on a.bid=b.id 
	set a.x=b.x , a.y=b.y ;

3、复制所有的列或者只复制希望的列插入到新表中

SELECT column_name字段名
	INTO newtable表名 [IN externaldb]
	FROM table1表名 
	where 字段=;

4、SQL语句 怎么把从一个表中查出来数据插入到另一个表中

INSERT INTO 表名(字段名)
	select 字段名 
	from

例子: 将查询出的s表中sno,j表中jno,p表中pno插入spj表中

insert into spj(sno,jno,pno)
	select sno,jno,pno
	from s,j,p

5、MySQL 索引

CREATE INDEX indexName索引名 ON table_name表 (column_name,[…])字段 * 字段顺序按最佳左前缀法则
创建、删除、展示索引

CREATE index stateIndex on aqgly_order_detail(state,id,real_total_fee)
drop index stateIndex on aqgly_order_detail
show index from aqgly_order_detail

6、IGNORE关键字(翻译:忽视)

  • INSERT IGNORE INTO 与 INSERT INTO 的区别就是

INSERT IGNORE INTO 会忽略数据库中已经存在的数据, 如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。 这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

  • 统计重复数据
SELECT COUNT(*) as repetitions, last_name, first_name
    FROM person_tbl
    GROUP BY last_name, first_name
    HAVING repetitions > 1;
  • 过滤重复数据
    distinct 或 group by
    7、on dupdate key update 插入或更新
  • on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。
  • 记录已存在时,只会更新on duplicate key update之后指定的字段。
  • 如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。
insert into user (id,username,userpwd,num) 
values (1,"testName2","testPwd2",10)
ON DUPLICATE KEY UPDATE
username = VALUES(username),
userpwd = VALUES(userpwd)

8、查询表字段

select COLUMN_NAME from information_schema.COLUMNS 
where table_name = '表名' and table_schema = '数据库名';

二、MySql中的函数

1、字符串函数

  • CONCAT(s1,s2…sn) - - - 字符串 s1,s2 等多个字符串合并为一个字符串
  • LEFT(s,n) - - - 返回字符串 s 的前 n 个字符
SELECT LEFT('runoob',2) -- ru
  • RIGHT(s,n) - - - 返回字符串 s 的后 n 个字符
  • SUBSTRING(s, start, length) - - - 从字符串 s 的 start 位置截取长度为 length 的子字符串
SELECT SUBSTRING("RUNOOB", 2, 3) AS ExtractString; -- UNO

2、数字函数

  • AVG(expression) - - - 返回一个表达式的平均值,expression 是一个字段
  • MOD(x,y) - - - 返回 x 除以 y 以后的余数
  • RAND() - - - 返回 0 到 1 的随机数
  • order by rand() -----查出来的数据随机排序
  • ROUND(x,y) - - - 返回数值 x 保留到小数点后 y 位的值
SELECT ROUND(12.3456,2)  --12.35   四舍五入
  • TRUNCATE(x,y) - - - 返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入)
SELECT TRUNCATE(1.23456,3) -- 1.234

3、日期函数

  • ADDDATE(d,n) - - - 计算起始日期 d 加上 n 天的日期 默认是天day (年year 月month 时hour 分minute 秒second) INTERVAL(偏移量)
SELECT ADDDATE("2017-06-15", INTERVAL 10 DAY); -->2017-06-25
SELECT ADDDATE("2017-06-15", INTERVAL -1 year); -->2016-06-15
SELECT ADDDATE("2011-11-11 11:11:11", INTERVAL 20 MINUTE); -->2011-11-11 11:31:11
  • DATEDIFF(d1,d2) - - - 计算日期 d1->d2 之间相隔的天数(最后一天不计入)
SELECT DATEDIFF('2001-02-02','2001-01-01')  -> 32
  • 返回当前时间
SELECT CURDATE();  -- yyyy-MM-dd
SELECT CURTIME();  -- HH-mm-ss
SELECT NOW(); -- yyyy-MM-dd HH-mm-ss
  • DATE_FORMAT(d,f) - - - 按表达式 f的要求显示日期 d
SELECT DATE_FORMAT('2011-11-11 11:11:11','%Y-%m-%d %r') --> 2011-11-11 11:11:11 AM
  • DAY(d)、 MONTH(d) 、year(d) - - - 提取日期中的 日 月 年 值
SELECT year("2017-06-15"); -- 2017
SELECT month("2017-06-15"); -- 6
SELECT day("2017-06-15"); -- 15
  • LAST_DAY(d) - - - 返回给给定日期的那一月份的最后一天,必须带dd
SELECT LAST_DAY("2017-06-20"); --> 2017-06-30
  • SEC_TO_TIME(s) - - - 将以秒为单位的时间 s 转换为时分秒的格式
SELECT SEC_TO_TIME(1206)  --> 00:20:06
  • TIME_TO_SEC(t) - - - 将时间 t 转换为秒 只计算HH:mm-ss部分
SELECT TIME_TO_SEC('18:30:10')  --> 66610 
  • DAYNAME(d) - - - 返回日期 d 是星期几,如 Monday,Tuesday
  • DAYOFMONTH(d) - - - 计算日期 d 是本月的第几天
  • DAYOFWEEK(d) - - - 日期 d 今天是星期几,1 星期日,2 星期一,以此类推
  • DAYOFYEAR(d) - - - 计算日期 d 是本年的第几天
  • MAKEDATE(year, day-of-year) - - - 计算在year年的第day-of-year天的日期
SELECT DAYNAME('2011-11-11 11:11:11') -->Friday
SELECT DAYOFMONTH('2011-11-11 11:11:11') -->11
SELECT DAYOFWEEK('2011-11-11 11:11:11')  --> 6
SELECT DAYOFYEAR('2011-11-11 11:11:11')  --> 315
SELECT MAKEDATE(2017, 50); --> 2017-02-19

4、其他函数

  • case 字段 when … then …else…end
CASE expression
		WHEN condition1 THEN result1
		WHEN condition2 THEN result2
		...
		WHEN conditionN THEN resultN
		ELSE result
	END

CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。

SELECT CASE 
  	WHEN 1 > 0
  		THEN '1 > 0'
  	WHEN 2 > 0
  		THEN '2 > 0'
  	ELSE '3 > 0'
  	END    --> 1 > 0
  • IF(expr,v1,v2) - - - 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。
SELECT IF(1 > 0,'正确','错误')    -->正确

案例: 科目一到科目四的各自的数量

select 
COUNT(*) as total,
COUNT(if(csr.keMu = 1 , 1 ,null)) as keMu1,
COUNT(if(csr.keMu = 2 , 1 ,null)) as keMu2,
COUNT(if(csr.keMu = 3 , 1 ,null)) as keMu3,
COUNT(if(csr.keMu = 4 , 1 ,null)) as keMu4 
from cp_fenzhong_record cfr,cp_study_record csr 
where csr.id = cfr.studyRecord_id and csr.student_id = 8
  • IFNULL(v1,v2) - - - 如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。
SELECT IFNULL(null,'Hello Word')  -->Hello Word
  • FIND_IN_SET(v1, v2) - - - v1字段值 包含在v2字段中
  • LAST_INSERT_ID() - - - 返回最近生成的 AUTO_INCREMENT 值
  • truncate table 你的表名 - - - 用于清空某表的数据 且让自增的id重新从0开始
  • alter table table_name AUTO_INCREMENT = n - - - 重设自增的起始值

DDL语句

  • 连接
mysql -u root -p
  • 查询
show databases;
  • 查看数据库编码
show variables like 'character%';  -- :

character_set_client 为客户端编码方式;

character_set_connection 为建立连接使用的编码;

character_set_database 为数据库的编码;

character_set_results 为结果集的编码;

character_set_server 为数据库服务器的编码;
  • 创建表
create table 表名(
    字段1 字段1类型 [comment 字段1注释],
    字段2 字段2类型 [comment 字段2注释],
    字段3 字段3类型 [comment 字段3注释],
    ......
    字段n 字段n类型 [comment 字段n注释]
)[comment 表注释];

-- 创建时间默认为当前时间, 修改时间默认为修改数据当前时间
CREATE TABLE `test` (
    `text` varchar(255) DEFAULT '' COMMENT '内容',
    `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 修改表字段
-- 添加数据表字段
alter table 表名 add 字段名 类型(长度) [comment 字段注释] [约束]
alter table students add sex varchar(2) comment '性别';       # 在students数据表中添加sex字段

-- 修改数据表字段类型
ALTER TABLE TMP_TABLE MODIFY CUSNO CHAR(20)
alter table 表名 modify 字段名 字段新数据类型(长度);
alter table students modify upassword int(15);          #修改students数据表中的upassword字段的字段类型为int

-- 修改字段名、字段类型
alter table 表名 change 旧字段名 新字段名 字段类型(长度) [comment 注释] [约束]
alter table students change upassword upwd int(30) comment '学生密码';

-- 修改数据表名
alter table 表名 rename to 新表名;
alter table students rename to students_table;
  • 删除表
-- 删除数据表字段
alter table 表名 drop 字段名;
alter table students_table drop sex;        #删除students_table数据表中的sex字段

-- 删除数据表
truncate table 表名;      #删除指定表,并重新创建该表
truncate table students_table;  #删除students_table数据表并重新创建该表
show tables;        #查询当前数据库所有表

drop table [if exists] 表名;  #删除数据表
drop table if exists stdenets_tables;   #当students_tables数据表存在时删除
show tables;        #查询当前数据库所有表

  • 索引
-- 删除索引
alter table op_customer drop index op_supplier;
-- 创建唯一索引
CREATE UNIQUE INDEX year_key_no ON op_customer (year,key_no);
Alter table 表名 add UNIQUE index 索引名 (字段1,字段2)
-- 普通索引
CREATE INDEX 索引名 ON  表名(字段1,字段2)
ALTER table 表名 ADD INDEX 索引名 ON (字段1,字段2) 

-- 查看索引  
show index from 数据库表名

你可能感兴趣的:(后端,java,mysql,sql)