[关闭]
@GivenCui 2017-08-29T11:05:01.000000Z 字数 14970 阅读 725

mySQL基础

SQL



mooc网
21分钟入门
MySQL实验室

常用基本操作

  1. **1** 安装了cygwin, 用来强化windpowershell
  2. **2** 在环境变量path中添加%mysql%/bin,命令行就可以使用sql语句
  3. **3** bin\my.ini mySQL的配置文件
  4. **4** 修改编码方式
  5. [mysql]
  6. default-character-set=utf8
  7. [mysqld]
  8. character-set-server=utf8
  9. **5** 登录:
  10. 密码为** : mysql -u root -p [option] 回车提示输入***的密码
  11. 直接输密码: mysql -u root -ppassword [注] -ppassword直接没有空格
  12. e.g. mysql -uroot -p cc 链接sql并登录到cc
  13. [option]
  14. -D,--database = name 打开指定数据库
  15. --delimiter = name 指定分隔符
  16. -h, --host = name 服务器名
  17. -p, --password[=name] 密码
  18. -P, --port=3306 端口号,3306为默认端口号
  19. --prompt = name 设置提示符 e.g. \u@\h mySQL[\d]>
  20. -u, --user=name 用户名
  21. -V, --version 输出版本信息
  22. **6** 退出数据库 exit; quit; \q; 都可以
  23. **7** ";"的作用: 分号是语句的结束, 使mysql可以折行输出
  24. **8** 修改提示符
  25. 进入时参见**5** [option]
  26. 进入后: prompt 参数
  27. \D 完整的日期
  28. \d 当前数据库
  29. \h 服务器名称
  30. \u 当前用户
  31. e.g. prompt \u@\h mySQL [\d]> // 句子后面不能有";",应为这不是SQL语句, 知识命令行语句
  32. **9** mySQL语句规范
  33. - 关键字与函数名称全部大写
  34. - 数据库名称、表名称、字段名称全部小写
  35. - SQL语句必须以 ; 号结尾
  36. **10** 创建数据库
  37. CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] 数据库名 [DEFAULT] CHARACTER SET [=] 字符编码
  38. e.g.
  39. CREATE DATABASE IF NOT EXISTS cc; // 默认设置utf8
  40. CREATE DATABASE IF NOT EXISTS cc CHARACTER SET gbk; // 设置字符集为gbk
  41. **11** 查看所有数据库
  42. SHOW DATABASES; // 展示所有数据库
  43. SHOW CREATE DATABASE 数据库名; // 查看具体数据库
  44. **12** 查看警告 SHOW WARNINGS
  45. **13** 修改数据库
  46. ALTER {DATABASE | SCHEMA} 数据库名 [DEFAULT] CHARACTER SET [=] 字符编码
  47. **14** 删除数据库
  48. DROP {DATABASE | SCHEMA} {IF EXISTS} 数据库名 // 如果数据库下有其它文件删除报错
  49. **15** 使用数据库
  50. USE 数据库名 // 切换到已经创建的数据库
  51. status // 各种信息
  52. SELECT DATABASE() // 当前数据库
  53. SELECT VERSION() // 数据版本
  54. SELECT NOW() // 当前时间
  55. **16** 创建表格
  56. 1. SHOW TABLES // 查看已创建的表格
  57. 2. CREATE TABLE 表名称 (列声明); // 列声明 = col_name + datatype + 其他参数
  58. 其他参数:
  59. NOT NULL // 字段不能为空
  60. AUTO-INCREMENT // 必须和key一起使用
  61. e.g. [参考手册] 以创建 pet 表为例, 表中将存放 宠物名字(name)、主人(owner)、宠物种类(species)、性别(sex)、出生日期(birth)、死亡日期(death) :
  62. CREATE TABLE pet (
  63. name VARCHAR(20),
  64. owner VARCHAR(20),
  65. species VARCHAR(20),
  66. sex CHAR(1),
  67. birth DATE,
  68. death DATE
  69. );
  70. e.g. [21分钟入门] 以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel) :
  71. CREATE TABLE students
  72. id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  73. name CHAR(8) NOT NULL,
  74. sex CHAR(4) NOT NULL,
  75. age TINYINT UNSIGNED NOT NULL,
  76. tel CHAR(13) NULL default "-"
  77. );
  78. 3. DESCRIBE 表名 // 查看表列信息
  79. 4. LOAD DATA INFILE '路径.文件' INTO TABLE 表名
  80. -> LINES TERMINATED BY '\r\n'; // unix可以略, win '\r\n', OS '\r'
  81. // 用于把.txt的数据导入数据库, 默认是制表符和换行符, 也可以自己指定分隔符和行尾标记
  82. // file.txt中不要写表头, 表头已经在数据库中定义了!!!
  83. 5. mysql -D 数据库名 -u root -p < createtable.sql // 导入sql
  84. ----------------------------------------
  85. CRUD : Create, Retrieve, Update, Delete
  86. ----------------------------------------
  87. **17** 向表中插数据 (Create 增)
  88. INSERT [INTO] 表名 [(col1,col2,col3...)] VALUES (val1,val2,val3...);
  89. e.g.
  90. INSERT [INTO] students VALUES(NULL,"王刚","男",20,"13811371377");
  91. INSERT students (name,sex,age) VALUES("孙丽华","女",21);
  92. **18** 查询表中的数据 (Retrieve 查)
  93. SELECT [关键字] 列名 FROM 表名 [查询条件];
  94. e.g.
  95. SELECT * FROM students;
  96. SELECT name,age FROM students;
  97. SELECT DISTINCT owner FROM pet; // DISTINCT去重
  98. [查询条件]
  99. 1. WHERE 列名 =[>,<,>=,<=,!=]"值";
  100. 2. WHERE 列名 IS [NOT] NULL | IN | LIKE | NOT LIKE "值";
  101. 3. WHERE 查询条件1 AND|OR 查询条件2
  102. 4. 条件查询
  103. e.g.
  104. SELECT * FROM students WHERE age > 21;
  105. SELECT * FROM stuendts WHERE name like "%王%";
  106. SELECT * FROM students WHERE id<5 and age>20;
  107. SELECT name,birth FROM pet ORDER BY birth; // 按升序排列(大小写顺序相同)
  108. SELECT name,birth FROM pet ORDER BY BINARY birth; // 按字母顺序 (A < a)
  109. SELECT name,birth FROM pet ORDER BY birth DESC; // 按降序,DESC只对其前面的列起作用
  110. 5. 匹配模式
  111. a. 标准SQL匹配模式 LIKENOT LIKE
  112. _”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)
  113. b. 正则表达式 REGEXPNOT REGEXP (RLIKENOT RLIKE)
  114. e.g.
  115. // 标准
  116. SELECT * FROM pet WHERE name LIKE '%fy'; // 匹配以fy结尾的名字
  117. SELECT * FROM pet WHERE name LIKE '%w%'; // 匹配含有w的名字
  118. // 正则表达式
  119. SELECT * FROM pet WHERE name REGEXP 'fy$';
  120. SELECT * FROM pet WHERE name REGEXP 'w'; // 没用^和$
  121. **19** 更新表中的数据 (Update 改)
  122. UPDATE 表名 SET 列名 = WHERE 更新条件;
  123. e.g.
  124. UPDATE students SET age = age+1;
  125. UPDATE students SET name="张伟鹏",age=19 WHERE tel="13288097888";
  126. **20** 删除表中的数据 (Delete 删)
  127. DELETE FROM 表名 WHERE 删除条件;
  128. e.g.
  129. DELETE FROM students WHERE id=2;
  130. DELETE FROM students WHERE age < 20; // 删除年龄小于21岁的;
  131. DELETE FROM students; // 删除所有数据
  132. **21** 创建后表的修改 ALTER
  133. 1. 添加列
  134. ALTER TABLE 表名 ADD 列名 列数据类型 [AFTER 插入位置];
  135. e.g.
  136. ALTER TABLE students ADD address CHAR(60) // 在表最后新增一列
  137. ALTER TABLE students ADD birthday DATA AFTER age; // 在名为 age 的列后插入列 birthday
  138. 2. 修改列
  139. ALTER TABLE 表名 CHANGE 列名 列新名称 新数据类型;
  140. e.g.
  141. ALTER TABLE students CHANGE tel telphone CHAR(13) DEFAULT "-"; // 列改名
  142. ALTER TABLE students CHANGE name name CHAR(16) NOT NULL; // 改数据类型
  143. 3. 删除列
  144. ALTER TABLE 表名 DROP 列名;
  145. e.g.
  146. ALTER TABLE students DROP birthday;
  147. 4. 重命名表
  148. ALTER TABLE 表名 RENAME 新表名;
  149. e.g.
  150. ALTER TABLE students RENAME workmates;
  151. **22** 删除 DROP
  152. 1. 删除整个表
  153. DROP TABLE 表名;
  154. e.g.
  155. DROP TABLE workmates;
  156. 2. 删除整个数据库
  157. DROP DATABASE 数据库名;
  158. e.g.
  159. DROP DATABASE samp_db;
  160. **23** 修改root用户密码 p.s. root 用户默认是没有密码的,需要重设密码
  161. 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
  1. /* js进制转换 */
  2. //十进制转其他
  3. var x=110;
  4. alert(x);
  5. alert(x.toString(8));
  6. alert(x.toString(32));
  7. alert(x.toString(16));
  8. //其他转十进制
  9. var x='110';
  10. alert(parseInt(x,2));
  11. alert(parseInt(x,8));
  12. alert(parseInt(x,16));
  13. //其他转其他
  14. //先用parseInt转成十进制再用toString转到目标进制
  15. alert(String.fromCharCode(parseInt(141,8)))
  16. 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',...)

浮点类型

日期类型

pet数据库demo

导入数据库的txt源
[注]: 推荐用NodePad++ 所有空为制表符, 不是空格, 注意用unix模式, \N 表示 NULL 空

  1. Fluffy Harold cat f 1993-02-04 \N
  2. Claws Gwen cat m 1994-03-17 \N
  3. Buffy Harold dog f 1989-05-13 \N
  4. Fang Benny dog m 1990-08-27 \N
  5. Bowser Diane dog m 1979-08-31 1995-07-29
  6. Chirpy Gwen bird f 1998-09-11 \N
  7. Whistler Gwen bird f 1997-12-09 \N
  8. Slim Benny snake m 1996-04-29 \N
  9. Puffball Diane hamster f 1999-03-30 \N
  10. mimi GivenCui cat f 2015-12-25 \N

mooc第5章教案和demo

  1. 1.子查询是指在另一个查询语句中的SELECT子句。
  2. 例句:
  3. SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
  4. 其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement),
  5. SELECT column1 FROM t2 称为Sub Query[子查询]。
  6. 所以,我们说子查询是嵌套在外查询内部。而事实上它有可能在子查询内部再嵌套子查询。
  7. 子查询必须出现在圆括号之间。
  8. 行级子查询
  9. SELECT * FROM t1 WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
  10. SELECT * FROM t1 WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
  11. 行级子查询的返回结果最多为一行。
  12. 优化子查询
  13. -- 创建数据表
  14. CREATE TABLE IF NOT EXISTS tdb_goods(
  15. goods_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  16. goods_name VARCHAR(150) NOT NULL,
  17. goods_cate VARCHAR(40) NOT NULL,
  18. brand_name VARCHAR(40) NOT NULL,
  19. goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0,
  20. is_show BOOLEAN NOT NULL DEFAULT 1,
  21. is_saleoff BOOLEAN NOT NULL DEFAULT 0
  22. );
  23. -- 写入记录
  24. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('R510VC 15.6英寸笔记本','笔记本','华硕','3399',DEFAULT,DEFAULT);
  25. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Y400N 14.0英寸笔记本电脑','笔记本','联想','4899',DEFAULT,DEFAULT);
  26. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('G150TH 15.6英寸游戏本','游戏本','雷神','8499',DEFAULT,DEFAULT);
  27. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X550CC 15.6英寸笔记本','笔记本','华硕','2799',DEFAULT,DEFAULT);
  28. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X240(20ALA0EYCD) 12.5英寸超极本','超级本','联想','4999',DEFAULT,DEFAULT);
  29. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('U330P 13.3英寸超极本','超级本','联想','4299',DEFAULT,DEFAULT);
  30. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('SVP13226SCB 13.3英寸触控超极本','超级本','索尼','7999',DEFAULT,DEFAULT);
  31. 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);
  32. 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);
  33. 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);
  34. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('IdeaCentre C340 20英寸一体电脑 ','台式机','联想','3499',DEFAULT,DEFAULT);
  35. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Vostro 3800-R1206 台式电脑','台式机','戴尔','2899',DEFAULT,DEFAULT);
  36. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iMac ME086CH/A 21.5英寸一体电脑','台式机','苹果','9188',DEFAULT,DEFAULT);
  37. 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);
  38. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Z220SFF F4F06PA工作站','服务器/工作站','惠普','4288',DEFAULT,DEFAULT);
  39. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('PowerEdge T110 II服务器','服务器/工作站','戴尔','5388',DEFAULT,DEFAULT);
  40. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Mac Pro MD878CH/A 专业级台式电脑','服务器/工作站','苹果','28888',DEFAULT,DEFAULT);
  41. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);
  42. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);
  43. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X3250 M4机架式服务器 2583i14','服务器/工作站','IBM','6888',DEFAULT,DEFAULT);
  44. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('玄龙精英版 笔记本散热器','笔记本配件','九州风神','',DEFAULT,DEFAULT);
  45. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);
  46. INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);
  47. -- 求所有电脑产品的平均价格,并且保留两位小数,AVG,MAX,MINCOUNTSUM为聚合函数
  48. SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods;
  49. -- 查询所有价格大于平均价格的商品,并且按价格降序排序
  50. SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > 5845.10 ORDER BY goods_price DESC;
  51. -- 使用子查询来实现
  52. SELECT goods_id,goods_name,goods_price FROM tdb_goods
  53. WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods)
  54. ORDER BY goods_price DESC;
  55. -- 查询类型为“超记本”的商品价格
  56. SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本';
  57. -- 查询价格大于或等于"超级本"价格的商品,并且按价格降序排列
  58. SELECT goods_id,goods_name,goods_price FROM tdb_goods
  59. WHERE goods_price >= ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本')
  60. ORDER BY goods_price DESC;
  61. -- = ANY = SOME 等价于 IN
  62. SELECT goods_id,goods_name,goods_price FROM tdb_goods
  63. WHERE goods_price IN (SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本')
  64. ORDER BY goods_price DESC;
  65. -- 创建“商品分类”表
  66. CREATE TABLE IF NOT EXISTS tdb_goods_cates(
  67. cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  68. cate_name VARCHAR(40)
  69. );
  70. -- 查询tdb_goods表的所有记录,并且按"类别"分组
  71. SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
  72. -- 将分组结果写入到tdb_goods_cates数据表
  73. INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
  74. -- 通过tdb_goods_cates数据表来更新tdb_goods
  75. UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name
  76. SET goods_cate = cate_id ;
  77. -- 通过CREATE...SELECT来创建数据表并且同时写入记录
  78. -- SELECT brand_name FROM tdb_goods GROUP BY brand_name;
  79. CREATE TABLE tdb_goods_brands (
  80. brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  81. brand_name VARCHAR(40) NOT NULL
  82. ) SELECT brand_name FROM tdb_goods GROUP BY brand_name;
  83. -- 通过tdb_goods_brands数据表来更新tdb_goods数据表(错误)
  84. UPDATE tdb_goods INNER JOIN tdb_goods_brands ON brand_name = brand_name
  85. SET brand_name = brand_id;
  86. -- Column 'brand_name' in field list is ambigous
  87. -- 正确
  88. UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS b ON g.brand_name = b.brand_name
  89. SET g.brand_name = b.brand_id;
  90. -- 查看tdb_goods的数据表结构
  91. DESC tdb_goods;
  92. -- 通过ALTER TABLE语句修改数据表结构
  93. ALTER TABLE tdb_goods
  94. CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,
  95. CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;
  96. -- 分别在tdb_goods_catestdb_goods_brands表插入记录
  97. INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');
  98. INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神舟');
  99. -- tdb_goods数据表写入任意记录
  100. INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');
  101. -- 查询所有商品的详细信息(通过内连接实现)
  102. SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
  103. INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
  104. INNER JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;
  105. -- 查询所有商品的详细信息(通过左外连接实现)
  106. SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
  107. LEFT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
  108. LEFT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;
  109. -- 查询所有商品的详细信息(通过右外连接实现)
  110. SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
  111. RIGHT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
  112. RIGHT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;
  113. -- 无限分类的数据表设计
  114. CREATE TABLE tdb_goods_types(
  115. type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  116. type_name VARCHAR(20) NOT NULL,
  117. parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
  118. );
  119. INSERT tdb_goods_types(type_name,parent_id) VALUES('家用电器',DEFAULT);
  120. INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑、办公',DEFAULT);
  121. INSERT tdb_goods_types(type_name,parent_id) VALUES('大家电',1);
  122. INSERT tdb_goods_types(type_name,parent_id) VALUES('生活电器',1);
  123. INSERT tdb_goods_types(type_name,parent_id) VALUES('平板电视',3);
  124. INSERT tdb_goods_types(type_name,parent_id) VALUES('空调',3);
  125. INSERT tdb_goods_types(type_name,parent_id) VALUES('电风扇',4);
  126. INSERT tdb_goods_types(type_name,parent_id) VALUES('饮水机',4);
  127. INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑整机',2);
  128. INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑配件',2);
  129. INSERT tdb_goods_types(type_name,parent_id) VALUES('笔记本',9);
  130. INSERT tdb_goods_types(type_name,parent_id) VALUES('超级本',9);
  131. INSERT tdb_goods_types(type_name,parent_id) VALUES('游戏本',9);
  132. INSERT tdb_goods_types(type_name,parent_id) VALUES('CPU',10);
  133. INSERT tdb_goods_types(type_name,parent_id) VALUES('主机',10);
  134. -- 查找所有分类及其父类
  135. 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;
  136. -- 查找所有分类及其子类
  137. 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;
  138. -- 查找所有分类及其子类的数目
  139. 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;
  140. -- tdb_goods_types添加child_count字段
  141. ALTER TABLE tdb_goods_types ADD child_count MEDIUMINT UNSIGNED NOT NULL DEFAULT 0;
  142. -- 将刚才查询到的子类数量更新到tdb_goods_types数据表
  143. 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
  144. LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id
  145. GROUP BY p.type_name
  146. ORDER BY p.type_id ) AS t2
  147. ON t1.type_id = t2.type_id
  148. SET t1.child_count = t2.child_count;
  149. -- 复制编号为12,20的两条记录
  150. SELECT * FROM tdb_goods WHERE goods_id IN (18,19);
  151. -- INSERT ... SELECT实现复制
  152. 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);
  153. -- 查找重复记录
  154. SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2;
  155. -- 删除重复记录
  156. 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;

下载页

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注