MYSQL

来源:互联网 发布:联通网络接入点设置 编辑:程序博客网 时间:2024/06/05 02:34

多表更新之一步到位:

1.创建数据表的同时将查询结果写入到数据表 (更新原表属性为新表的ID)
CREATE TABLE tdb_goods_brands (
brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
brand_name VARCHAR(40) NOT NULL
)//不加分号
SELECT brand_name FROM tdb_goods GROUP BY brand_name;

//注意两表中都叫brand_name,

2.起别名法:UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS b ON g.brand_name = b.brand_name


SET g.brand_name = b.brand_id;

既然现在good_cate,good_brand 存的是其他表的id,那么表的列名(good_cate,good_brand )也应该改成对应id

,当然类型也要改

通过ALTER TABLE语句修改数据表结构
ALTER TABLE tdb_goods
CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,
CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;

@加外键?不一定是物理的外键,逻辑的外键也行(以上就是),当然,物理外键更能保证数据的完整性和一致性

多表连接

:SELECT goods_id,goods_name,cate_name,brand_name,goods_price
FROM tdb_goods AS g
INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
->INNER JOIN tdb_brands AS b ON g.brand_id = b.brand_id\G;

理解应用 WHERE、GROUP BY 和 HAVING 子句的正确顺序对编写高效的查询代码会有所帮助:

 

WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。 

GROUP BY 子句用来分组 WHERE 子句的输出。 

HAVING 子句用来从分组的结果中筛选行。

HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似。WHERE 搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中显示的任意项。

多表删除

DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;

个人理解:先通过SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2 这条通过 GROUP BY 给goods_name分组 然后HAVING COUNT 找到goods_name相同的数据,生成的数据想象成是一个数据表,通过左联接来找到两个表里goods_name相同的数据,然后根据条件删除 t1.goods_id > t2.goods_id的数据.

字符函数

LEFE RIGHT UPPER LOWER LENGTH  TRIM LTRIM RTRIM LEADING前导,TRAINLING后导,BOTH都删,REPLACE,SUBSTRING('',1,2)

字符串截取函数 SUBSTRING()

LIKE % 0个或多个字符(任意个字符,_任意一个字符

CONCAT();将指定的几个字符连接在一起,至少两个<br>
CONCAT_WS():将指定的几个字符通过分隔符来连接,分隔符放在第一位。
FORMAT():将数字格式化,以千分位
LOWER(‘AAS...’);将字母转换成小写;
UPPER('asd...'):将字母转换成大写
LEFT('love lina',2);获取左侧2个字符;
RIGHT('LOVE crysoul',2);获取右侧两个字符;
LENGTH('AA..');获取字符长度
LTRIM();删除前导空格
RTRIM();删除后导空格
TRIM();删除前导后导空格;
TRIM(LEADING'?'FROM'???CRYSOU??');删除前导的字符?
TRIM(TRAILING'?'FROM'??crysoul??');删除后导的字符?
TRIM(BOTH'?'FROM'??CRYSOUL???');删除前导和后导的字符?
REPLACE('????CRYOSUL??LINDAN??','?','!');替换字符串中的规定字符为另外的字符可以为空
如:REPLACE('??CRYSOUL??LINDA?','?','');相当于删除了字符中的问号?
SUBSTRING('MySQL',2,3);取字符串中第2位开始的总共3个字符 位数可以为负值(从后面往前面数)
[NOT] LIKE 模式匹配;SELECT *FROM test WHERE first_name LIKE'%O%';代表查找数据中带有字符O的字符串
PS:SELECT *FROM test WHERE first_name LIKE '%1%%' ESCAPE '1';表示1后面的百分号为字符而不是通配符
通配符还有'_'代表任意一个字符‘%’代表任意字符
可以相互嵌套

数值运算函数及函数

数值运算符

CEIL()--进一取正,也就是向上取整
FLOOR()--舍一取正,也就是向下取整
DIV--整数除法,其实和普通除法向下取整一样
MOD --取余,等价于%
POWER() --幂运算
ROUND() --取余(四舍五入)
TRUNCATE() --截断(不四舍五入)
例:
CEIL(3.01) ==>4 /*有n.xx 都是n+1 进一取整 向上取整
FLOOR(3.99) ==>3 /*取n.xx 都是n 舍一取整 向下取整
SELECT 3 DIV 4 ==> 0 /*整数除法
SELECT 3/4 ==>0.75 /*除法
SELECT 21 MOD 2 ==>1 /*取余数(取模),整数、小数都可以
SELECT 21 % 2 ==>1 /*取余数(取模),整数、小数都可以
SELECT POWER(3,4) ==>81 /*3的4次方 幂运算
SELECT ROUND(3.1415926,3) ==>3.142 /*四舍五入,截到小数后3位
SELECT TRUNCATE(123.89,1) ==>123.8 /*截取小数点后的位置
SELECT TRUNCATE(123.89,0) ==>123 /*截取小数点后的位置,0位为整数部分
SELECT TRUNCATE(123.89,-1) ==>120 /*截取-1,从个位起去掉后面的数值替换为0

ceil 进一取整, floor 取整   ceil(3.99) 为4,floor(3.99)为3

比较运算符

BETTWEEN 2 AND 6;返回1;
SELECT 12 IN(10,21,12,23);返回1;在;
SELECT NULL IS BULL;
SELECT * FROM TB1 WHERE NAME IS NULL;

日期时间函数

NOW() /*当前时间 含日期(xxxx-xx-xx)和时间(xx:xx:xx)
CURDATE() /* current当前日期 只有日期
CURTIME() /*当前时间 值有时间

DATE_ADD() /*时间增减或减少
SELECT DATE_ADD('2014-3-12',INTERVAL 365 DAY); ==>2015-3-12 /*在原有给定的时间上增加365天
INTERVAL增加可以增加负值 单位 year ,month,week,day
SELECT DATE_ADD('2014-3-12',INTERVAL 1 YEAR);//

SELECT DATEDIFF('2014-1-1','2015-1-1') ==> -365 /*时间差值计算 单位为日 前面时间减去后面时间
SELECT DATE_FORMAT('2014-3-2','%m/%d/%y'); ==> 03/02/2014 /*日期格式转换
SELECT DATE_FORMAT(NOW(),'%m/%d/%y');
//注意大小写的区别,%M,%D大写对应英语,%m,%d小写对应数字,%Y对应4位年份,%y对应2位年份

信息函数

(1)CONNECTION_ID(); // 连接ID
mysql> SELECT CONNECTION_ID();
(2)SELECT DATABASE(); // 当前数据库
(3)LAST_INSERT_ID(); // 最后句插入记录的 ID 号,如果是一次insert中插入的是多条记录,得到的是多条中的第一条(而不是最后一条!)
(4)USER(); // 当前用户
SELECT USER();
(5)VERSION(); // 版本的信息

0 0
原创粉丝点击