@GivenCui
2017-08-29T11:05:01.000000Z
字数 14970
阅读 730
SQL
**1** 安装了cygwin, 用来强化wind的powershell
**2** 在环境变量path中添加%mysql%/bin,命令行就可以使用sql语句
**3** bin\my.ini 是mySQL的配置文件
**4** 修改编码方式
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
**5** 登录:
密码为** : mysql -u root -p [option] 回车提示输入***的密码
直接输密码: mysql -u root -ppassword [注] -p和password直接没有空格
e.g. mysql -uroot -p cc 链接sql并登录到cc库
[option]
-D,--database = name 打开指定数据库
--delimiter = name 指定分隔符
-h, --host = name 服务器名
-p, --password[=name] 密码
-P, --port=3306 端口号,3306为默认端口号
--prompt = name 设置提示符 e.g. \u@\h mySQL[\d]>
-u, --user=name 用户名
-V, --version 输出版本信息
**6** 退出数据库 exit; quit; \q; 都可以
**7** ";"的作用: 分号是语句的结束, 使mysql可以折行输出
**8** 修改提示符
进入时参见**5** [option]
进入后: prompt 参数
\D 完整的日期
\d 当前数据库
\h 服务器名称
\u 当前用户
e.g. prompt \u@\h mySQL [\d]> // 句子后面不能有";",应为这不是SQL语句, 知识命令行语句
**9** mySQL语句规范
- 关键字与函数名称全部大写
- 数据库名称、表名称、字段名称全部小写
- SQL语句必须以 ; 号结尾
**10** 创建数据库
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] 数据库名 [DEFAULT] CHARACTER SET [=] 字符编码
e.g.
CREATE DATABASE IF NOT EXISTS cc; // 默认设置utf8
CREATE DATABASE IF NOT EXISTS cc CHARACTER SET gbk; // 设置字符集为gbk
**11** 查看所有数据库
SHOW DATABASES; // 展示所有数据库
SHOW CREATE DATABASE 数据库名; // 查看具体数据库
**12** 查看警告 SHOW WARNINGS
**13** 修改数据库
ALTER {DATABASE | SCHEMA} 数据库名 [DEFAULT] CHARACTER SET [=] 字符编码
**14** 删除数据库
DROP {DATABASE | SCHEMA} {IF EXISTS} 数据库名 // 如果数据库下有其它文件删除报错
**15** 使用数据库
USE 数据库名 // 切换到已经创建的数据库
status // 各种信息
SELECT DATABASE() // 当前数据库
SELECT VERSION() // 数据版本
SELECT NOW() // 当前时间
**16** 创建表格
1. SHOW TABLES // 查看已创建的表格
2. CREATE TABLE 表名称 (列声明); // 列声明 = col_name + datatype + 其他参数
其他参数:
NOT NULL // 字段不能为空
AUTO-INCREMENT // 必须和key一起使用
e.g. [参考手册] 以创建 pet 表为例, 表中将存放 宠物名字(name)、主人(owner)、宠物种类(species)、性别(sex)、出生日期(birth)、死亡日期(death) :
CREATE TABLE pet (
name VARCHAR(20),
owner VARCHAR(20),
species VARCHAR(20),
sex CHAR(1),
birth DATE,
death DATE
);
e.g. [21分钟入门] 以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel) :
CREATE TABLE students (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(8) NOT NULL,
sex CHAR(4) NOT NULL,
age TINYINT UNSIGNED NOT NULL,
tel CHAR(13) NULL default "-"
);
3. DESCRIBE 表名 // 查看表列信息
4. LOAD DATA INFILE '路径.文件' INTO TABLE 表名
-> LINES TERMINATED BY '\r\n'; // unix可以略, win '\r\n', OS '\r'
// 用于把.txt的数据导入数据库, 默认是制表符和换行符, 也可以自己指定分隔符和行尾标记
// file.txt中不要写表头, 表头已经在数据库中定义了!!!
5. mysql -D 数据库名 -u root -p < createtable.sql // 导入sql
----------------------------------------
CRUD : Create, Retrieve, Update, Delete
----------------------------------------
**17** 向表中插数据 (Create 增)
INSERT [INTO] 表名 [(col1,col2,col3...)] VALUES (val1,val2,val3...);
e.g.
INSERT [INTO] students VALUES(NULL,"王刚","男",20,"13811371377");
INSERT students (name,sex,age) VALUES("孙丽华","女",21);
**18** 查询表中的数据 (Retrieve 查)
SELECT [关键字] 列名 FROM 表名 [查询条件];
e.g.
SELECT * FROM students;
SELECT name,age FROM students;
SELECT DISTINCT owner FROM pet; // DISTINCT去重
[查询条件]
1. WHERE 列名 =[>,<,>=,<=,!=]"值";
2. WHERE 列名 IS [NOT] NULL | IN | LIKE | NOT LIKE "值";
3. WHERE 查询条件1 AND|OR 查询条件2
4. 条件查询 略
e.g.
SELECT * FROM students WHERE age > 21;
SELECT * FROM stuendts WHERE name like "%王%";
SELECT * FROM students WHERE id<5 and age>20;
SELECT name,birth FROM pet ORDER BY birth; // 按升序排列(大小写顺序相同)
SELECT name,birth FROM pet ORDER BY BINARY birth; // 按字母顺序 (A < a)
SELECT name,birth FROM pet ORDER BY birth DESC; // 按降序,DESC只对其前面的列起作用
5. 匹配模式
a. 标准SQL匹配模式 LIKE和NOT LIKE
“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)
b. 正则表达式 REGEXP和NOT REGEXP (RLIKE和NOT RLIKE)
e.g.
// 标准
SELECT * FROM pet WHERE name LIKE '%fy'; // 匹配以fy结尾的名字
SELECT * FROM pet WHERE name LIKE '%w%'; // 匹配含有w的名字
// 正则表达式
SELECT * FROM pet WHERE name REGEXP 'fy$';
SELECT * FROM pet WHERE name REGEXP 'w'; // 没用^和$
**19** 更新表中的数据 (Update 改)
UPDATE 表名 SET 列名 = 值 WHERE 更新条件;
e.g.
UPDATE students SET age = age+1;
UPDATE students SET name="张伟鹏",age=19 WHERE tel="13288097888";
**20** 删除表中的数据 (Delete 删)
DELETE FROM 表名 WHERE 删除条件;
e.g.
DELETE FROM students WHERE id=2;
DELETE FROM students WHERE age < 20; // 删除年龄小于21岁的;
DELETE FROM students; // 删除所有数据
**21** 创建后表的修改 ALTER
1. 添加列
ALTER TABLE 表名 ADD 列名 列数据类型 [AFTER 插入位置];
e.g.
ALTER TABLE students ADD address CHAR(60) // 在表最后新增一列
ALTER TABLE students ADD birthday DATA AFTER age; // 在名为 age 的列后插入列 birthday
2. 修改列
ALTER TABLE 表名 CHANGE 列名 列新名称 新数据类型;
e.g.
ALTER TABLE students CHANGE tel telphone CHAR(13) DEFAULT "-"; // 列改名
ALTER TABLE students CHANGE name name CHAR(16) NOT NULL; // 改数据类型
3. 删除列
ALTER TABLE 表名 DROP 列名;
e.g.
ALTER TABLE students DROP birthday;
4. 重命名表
ALTER TABLE 表名 RENAME 新表名;
e.g.
ALTER TABLE students RENAME workmates;
**22** 删除 DROP
1. 删除整个表
DROP TABLE 表名;
e.g.
DROP TABLE workmates;
2. 删除整个数据库
DROP DATABASE 数据库名;
e.g.
DROP DATABASE samp_db;
**23** 修改root用户密码 p.s. root 用户默认是没有密码的,需要重设密码
mysqladmin -u root -p password 新密码 // 回车提示输入旧密码,空则再回车
表1: 三种系统换行符对比
补充: 换行符, 也就是CR回车符 (Carriage Return) 和 LF换行符 (Line Feed)的问题,各个系统方案不同,在NotePad++中可以设置;在不同平台间使用FTP软件传送文件时,在ASCII文本模式传输模式下,一些FTP客户端程序会自动对换行格式进行转换。经过这种传输的文件字节数可能会发生变化。如果你不想FTP修改原文件,可以使用bin模式(二进制模式)传输文本。
历史由来:
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33,Linux/Unix下的TTY概念也来自于此)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做"回车"Carriage Return,告诉打字机把打印头定位在左边界;另一个叫做“换行” Line Feed,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
系统 | 换行符 | 换行符的组成 |
---|---|---|
DOS/window系统 | \r\n | CR+LF |
MAC系统 | \r | CR |
UNIX/Linux系统 | \n | LF |
换行符 | 全称 | ASCII 十进制 | ASCII 十六进制 |
---|---|---|---|
CR | Carriage Return | 13 | 0x0D |
LF | Line Feed | 10 | 0x0A |
/* js进制转换 */
//十进制转其他
var x=110;
alert(x);
alert(x.toString(8));
alert(x.toString(32));
alert(x.toString(16));
//其他转十进制
var x='110';
alert(parseInt(x,2));
alert(parseInt(x,8));
alert(parseInt(x,16));
//其他转其他
//先用parseInt转成十进制再用toString转到目标进制
alert(String.fromCharCode(parseInt(141,8)))
alert(parseInt('ff',16).toString(2));
数据类型 | 存储范围(sign) | 存储范围(unsign) | 字节 |
---|---|---|---|
TINYINT | ~ | (255) | 1 |
SMALLINT | ~ | (65535) | 2 |
MEDIUMINT | ~ | 3 | |
INT | ~ | -1 | 4 |
BIGINT | ~ | -1 | 8 |
列类型 | 存储需求 |
---|---|
CHAR(M) | |
VARCHAR(M) | |
TINYTEXT | |
TEXT | |
MEDIUMTEXT | |
LONGTEXT | |
ENUM('val1','val2',...) | |
SET('val1','val2',...) | |
导入数据库的txt源
[注]: 推荐用NodePad++ 所有空为制表符, 不是空格, 注意用unix模式, \N 表示 NULL 空
Fluffy Harold cat f 1993-02-04 \N
Claws Gwen cat m 1994-03-17 \N
Buffy Harold dog f 1989-05-13 \N
Fang Benny dog m 1990-08-27 \N
Bowser Diane dog m 1979-08-31 1995-07-29
Chirpy Gwen bird f 1998-09-11 \N
Whistler Gwen bird f 1997-12-09 \N
Slim Benny snake m 1996-04-29 \N
Puffball Diane hamster f 1999-03-30 \N
mimi GivenCui cat f 2015-12-25 \N
1.子查询是指在另一个查询语句中的SELECT子句。
例句:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement),
SELECT column1 FROM t2 称为Sub Query[子查询]。
所以,我们说子查询是嵌套在外查询内部。而事实上它有可能在子查询内部再嵌套子查询。
子查询必须出现在圆括号之间。
行级子查询
SELECT * FROM t1 WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
SELECT * FROM t1 WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
行级子查询的返回结果最多为一行。
优化子查询
-- 创建数据表
CREATE TABLE IF NOT EXISTS tdb_goods(
goods_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
goods_name VARCHAR(150) NOT NULL,
goods_cate VARCHAR(40) NOT NULL,
brand_name VARCHAR(40) NOT NULL,
goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0,
is_show BOOLEAN NOT NULL DEFAULT 1,
is_saleoff BOOLEAN NOT NULL DEFAULT 0
);
-- 写入记录
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('R510VC 15.6英寸笔记本','笔记本','华硕','3399',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Y400N 14.0英寸笔记本电脑','笔记本','联想','4899',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('G150TH 15.6英寸游戏本','游戏本','雷神','8499',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X550CC 15.6英寸笔记本','笔记本','华硕','2799',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X240(20ALA0EYCD) 12.5英寸超极本','超级本','联想','4999',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('U330P 13.3英寸超极本','超级本','联想','4299',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('SVP13226SCB 13.3英寸触控超极本','超级本','索尼','7999',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad mini MD531CH/A 7.9英寸平板电脑','平板电脑','苹果','1998',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版)','平板电脑','苹果','3388',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版)','平板电脑','苹果','2788',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('IdeaCentre C340 20英寸一体电脑 ','台式机','联想','3499',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Vostro 3800-R1206 台式电脑','台式机','戴尔','2899',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iMac ME086CH/A 21.5英寸一体电脑','台式机','苹果','9188',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('AT7-7414LP 台式电脑 (i5-3450四核 4G 500G 2G独显 DVD 键鼠 Linux )','台式机','宏碁','3699',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Z220SFF F4F06PA工作站','服务器/工作站','惠普','4288',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('PowerEdge T110 II服务器','服务器/工作站','戴尔','5388',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Mac Pro MD878CH/A 专业级台式电脑','服务器/工作站','苹果','28888',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X3250 M4机架式服务器 2583i14','服务器/工作站','IBM','6888',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('玄龙精英版 笔记本散热器','笔记本配件','九州风神','',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);
-- 求所有电脑产品的平均价格,并且保留两位小数,AVG,MAX,MIN、COUNT、SUM为聚合函数
SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods;
-- 查询所有价格大于平均价格的商品,并且按价格降序排序
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > 5845.10 ORDER BY goods_price DESC;
-- 使用子查询来实现
SELECT goods_id,goods_name,goods_price FROM tdb_goods
WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods)
ORDER BY goods_price DESC;
-- 查询类型为“超记本”的商品价格
SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本';
-- 查询价格大于或等于"超级本"价格的商品,并且按价格降序排列
SELECT goods_id,goods_name,goods_price FROM tdb_goods
WHERE goods_price >= ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本')
ORDER BY goods_price DESC;
-- = ANY 或 = SOME 等价于 IN
SELECT goods_id,goods_name,goods_price FROM tdb_goods
WHERE goods_price IN (SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本')
ORDER BY goods_price DESC;
-- 创建“商品分类”表
CREATE TABLE IF NOT EXISTS tdb_goods_cates(
cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
cate_name VARCHAR(40)
);
-- 查询tdb_goods表的所有记录,并且按"类别"分组
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
-- 将分组结果写入到tdb_goods_cates数据表
INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
-- 通过tdb_goods_cates数据表来更新tdb_goods表
UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name
SET goods_cate = cate_id ;
-- 通过CREATE...SELECT来创建数据表并且同时写入记录
-- SELECT brand_name FROM tdb_goods GROUP BY brand_name;
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;
-- 通过tdb_goods_brands数据表来更新tdb_goods数据表(错误)
UPDATE tdb_goods INNER JOIN tdb_goods_brands ON brand_name = brand_name
SET brand_name = brand_id;
-- Column 'brand_name' in field list is ambigous
-- 正确
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;
-- 查看tdb_goods的数据表结构
DESC tdb_goods;
-- 通过ALTER TABLE语句修改数据表结构
ALTER TABLE tdb_goods
CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,
CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;
-- 分别在tdb_goods_cates和tdb_goods_brands表插入记录
INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');
INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神舟');
-- 在tdb_goods数据表写入任意记录
INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');
-- 查询所有商品的详细信息(通过内连接实现)
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_goods_brands AS b ON g.brand_id = b.brand_id\G;
-- 查询所有商品的详细信息(通过左外连接实现)
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
LEFT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
LEFT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;
-- 查询所有商品的详细信息(通过右外连接实现)
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
RIGHT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
RIGHT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;
-- 无限分类的数据表设计
CREATE TABLE tdb_goods_types(
type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
type_name VARCHAR(20) NOT NULL,
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
);
INSERT tdb_goods_types(type_name,parent_id) VALUES('家用电器',DEFAULT);
INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑、办公',DEFAULT);
INSERT tdb_goods_types(type_name,parent_id) VALUES('大家电',1);
INSERT tdb_goods_types(type_name,parent_id) VALUES('生活电器',1);
INSERT tdb_goods_types(type_name,parent_id) VALUES('平板电视',3);
INSERT tdb_goods_types(type_name,parent_id) VALUES('空调',3);
INSERT tdb_goods_types(type_name,parent_id) VALUES('电风扇',4);
INSERT tdb_goods_types(type_name,parent_id) VALUES('饮水机',4);
INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑整机',2);
INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑配件',2);
INSERT tdb_goods_types(type_name,parent_id) VALUES('笔记本',9);
INSERT tdb_goods_types(type_name,parent_id) VALUES('超级本',9);
INSERT tdb_goods_types(type_name,parent_id) VALUES('游戏本',9);
INSERT tdb_goods_types(type_name,parent_id) VALUES('CPU',10);
INSERT tdb_goods_types(type_name,parent_id) VALUES('主机',10);
-- 查找所有分类及其父类
SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p ON s.parent_id = p.type_id;
-- 查找所有分类及其子类
SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id;
-- 查找所有分类及其子类的数目
SELECT p.type_id,p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id;
-- 为tdb_goods_types添加child_count字段
ALTER TABLE tdb_goods_types ADD child_count MEDIUMINT UNSIGNED NOT NULL DEFAULT 0;
-- 将刚才查询到的子类数量更新到tdb_goods_types数据表
UPDATE tdb_goods_types AS t1 INNER JOIN ( SELECT p.type_id,p.type_name,count(s.type_name) AS child_count FROM tdb_goods_types AS p
LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id
GROUP BY p.type_name
ORDER BY p.type_id ) AS t2
ON t1.type_id = t2.type_id
SET t1.child_count = t2.child_count;
-- 复制编号为12,20的两条记录
SELECT * FROM tdb_goods WHERE goods_id IN (18,19);
-- INSERT ... SELECT实现复制
INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20);
-- 查找重复记录
SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2;
-- 删除重复记录
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;