MySQL(三:sql语法、类型、约束)

一、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
原文地址:https://www.cnblogs.com/BOSET/p/12799526.html