一、DQL
-- 1. +号在sql server中既可以作为运算符,也可以作为字符拼接,而在mysql中只有运算符功能 -- sql server select '1'+'2'; -- '12' select 1+2; -- 3 --mysql SELECT '1'+'2'; -- 3 SELECT NULL+1; -- NULL SELECT 'a'+2; -- 2 SELECT CONCAT(1,2); --12 SELECT CONCAT('1','2'); --12
-- 2. 安全等于<=>可读性差,感觉没什么用
SELECT 1 <=> 2 -- 0
SELECT NULL <=> NULL -- 1
SELECT NULL IS NULL -- 1
-- 显示当前字符集 SHOW VARIABLES LIKE '%char%'; SELECT LENGTH('窃格瓦拉ha') -- 14,因为当前是utf8,中文3字节,英文1字节。gbk中文2字节,英文1字节
USE myemployees; -- 字符函数 -- LENGTH SHOW VARIABLES LIKE '%char%';-- 显示当前字符集 SELECT LENGTH('窃格瓦拉ha') -- 14,因为当前是utf8,中文3字节,英文1字节。gbk中文2字节,英文1字节 -- SUBSTR 截取都是指字符长度,除了LENGTH是字节长度 SELECT SUBSTR('ABC',2) -- 'BC',因为SQL语言索引从1开始 SELECT SUBSTR('ABC',2,1) -- 'B' -- INSTR 返回字符首次索引,找不到返回0 SELECT INSTR('ABCBCA','B') -- 2 -- TRIM 去前后,不去中间 SELECT TRIM(' 窃格瓦拉 ') -- '窃格瓦拉' -- LPAD 左填充,字符长度不够10,左侧填充A,右填充RPAD SELECT LPAD('ABC',10,'A') -- REPLACE SELECT REPLACE('ABC','A','E') -- 'EBC' -- 数学函数 -- ROUND 四舍五入 SELECT ROUND(1.97); -- 2 SELECT ROUND(-1.97); -- 2 SELECT ROUND(1.97,1); -- 2.0 第二个参数保留几位小数 #CEIL 向上取整,返回>=该参数的最小整数 SELECT CEIL(1.97); -- 2 #FLOOR 向下取整,返回<=该参数的最小整数 SELECT FLOOR(1.97) -- 1 -- 截取 第二个参数:截取到小数点后第几位 SELECT TRUNCATE(1.2334,3); -- 1.233 SELECT TRUNCATE('2313.12345',2); -- 2313.12 -- 取余 a-a/b*b SELECT MOD(10,-3); -- 1 -- 日期函数 SELECT NOW(); -- 当前服务器日期 SELECT CURDATE(); -- 当前服务器日期,不包含时间 SELECT CURTIME(); -- 当前服务器日期,不包含日期 SELECT YEAR(NOW()); -- 当前年 SELECT MONTH(NOW()) -- 当前月 SELECT MONTHNAME(NOW()) -- 当前月(英文) SELECT STR_TO_DATE('26-4-2020','%d-%m-%Y') -- 2020-04-26 SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日') -- 2020年04月26日 -- if函数 SELECT IF(10<5,'true','false'); -- false -- case函数 相当于switch case -- case -- switch -- when -- case -- then -- : -- else -- default -- end SELECT salary AS 原始工资,department_id, CASE department_id WHEN 90 THEN salary*2 WHEN 110 THEN salary*3 ELSE salary END AS 新工资 FROM employees -- 上面这种类似swith case 多用于等值判断 -- 跟上面结果一样,但是这样写不规范,等值判断用上面的写法 SELECT salary AS 原始工资,department_id, CASE WHEN department_id=90 THEN salary*2 WHEN department_id=110 THEN salary*3 ELSE salary END AS 新工资 FROM employees -- 下面这种类似if else 多用于区间或条件表达式判断 SELECT salary AS 原始工资,department_id, CASE WHEN salary>13000 THEN salary*2 WHEN salary>10000 THEN salary*3 ELSE salary END AS 新工资 FROM employees -- 分组函数 常用语统计,又称为聚合函数或统计函数或组函数 -- sum这些 -- SELECT first_name FROM employees GROUP BY LENGTH(first_name)>3 -- any/some SELECT * FROM employees WHERE salary>SOME(SELECT salary FROM employees WHERE first_name='Steven') -- 创建数据库 CREATE DATABASE IF NOT EXISTS test2; -- 删除数据库 DROP DATABASE IF EXISTS test2; -- 创建表 USE test2; CREATE TABLE IF NOT EXISTS book ( id INT,#编号 bName VARCHAR(20),#图书名 price DOUBLE,#价格 authorId INT,#作者 publishData DATETIME#出版日期 ); DESC book; -- 修改表 ALTER TABLE book CHANGE COLUMN publishData pubDta DATETIME;-- 修改列名 ALTER TABLE book MODIFY COLUMN pubDta TIMESTAMP;-- 修改列类型 ALTER TABLE book ADD COLUMN product VARCHAR(20);-- 添加列 ALTER TABLE book DROP COLUMN product;-- 删除列 ALTER TABLE book2 RENAME TO book;-- 修改表名 -- 删除表 SHOW TABLES;-- 显示当前库下所有的表 DROP TABLE IF EXISTS book;-- 删除表 -- 复制表 CREATE TABLE copy LIKE book;-- 复制表结构 DESC copy; CREATE TABLE copy2-- 复制表结构与数据 SELECT *FROM book; DESC copy2;
#常见数据类型 /* 数值型: 整型:tinyint,smallint,mediumint,int/integer,bigint 小数: 定点数: 浮点数: 字符型: 较短的文本:char,varchar 较长的文本:text,blob(较长的二进制数据) 日期型: */ #整型: /* tinyint 1字节 8位 smallint 2字节 mediumint 3字节 int/integer 4字节 bigint 8字节 */ CREATE TABLE tabint( tab1 INT,-- 默认有符号,范围可负值 tab2 INT UNSIGNED -- 有符号,范围最低0无负值 ) -- 数值型长度表示宽度,不是长度,不足以0补齐 -- tab1 INT(7) zerofill,如果指定宽度有符号失效 /* 小数 定点数:dec(m,d)/decimal(m,d) 长度比较大,精度要求高用decimal 浮点数:float(m,d) 4字节,double(m,d) 8字节 */ CREATE TABLE tabfloat( f1 FLOAT(5,2),-- 2表示小数点后2位,超过四舍五入进1 f2 DOUBLE(5,2), f3 DECIMAL(5,2) ) INSERT INTO tabfloat VALUES(1234.5,1234.5,1234.5); SELECT *FROM tabfloat; -- 上面会报警告,因为2指定小数位2位,插入的数据1234已经有4位,一共就6位,超过规定的5位 -- 所以5表示的整数位与小数位的和不能超过5,所以这条插入默认是999.99,整数位3+小数2都以最高数9填充 /* 字符型 较短的文本:char,varchar 较长的文本:text,blob(较长的二进制数据) char(m) m表示字符数,并不是字节数,比如a表示一个字符 char(10) 固定字符,创建的时候会开10个字符空间 varchar(10) 可变字符,根据数据开空间,最大10,比如插入“中国”,只会开2个字符空间 char 耗空间,但效率高。比如性别,要么是男,要么是女。所以用char不要用varchar varchar 省空间,但效率低 enum类型 */ CREATE TABLE tabchar( c ENUM('a','b','c','d') ); INSERT INTO tabchar VALUES('a'); INSERT INTO tabchar VALUES('b'); INSERT INTO tabchar VALUES('c'); INSERT INTO tabchar VALUES('m'); -- 这个会报错,插入不成功,因为m不在枚举范围 INSERT INTO tabchar VALUES('d'); INSERT INTO tabchar VALUES('A'); -- 这个不会报错,因为不区分大小写 /* set类型 插入集合 */ CREATE TABLE tabset( c SET('a','b','c','d') ); INSERT INTO tabset VALUES('a,b,c'); /* binary,varbinary用于保存较小的二进制数据 blob(较长的二进制数据) */ /* 日期类型,必须用单引号 date:只有日期,没有时间: datetime:有日期也有时间 8字节 timestamp:有日期也有时间 4字节,时区用它 time:只有时间,没有日期 */ CREATE TABLE tabdate( t1 DATETIME, t2 TIMESTAMP ); INSERT INTO tabdate VALUES(NOW(),NOW()); SELECT *FROM tabdate SHOW VARIABLES LIKE '%time_zone%';-- 查看当前数据库时区 SET time_zone='+9:00';-- 更改当前数据库时区 -- 更改时区之后TIMESTAMP字段会根据时区变化,DATETIME不会 -- 所以如果有时区区分用TIMESTAMP