Mysql学习笔记一

基础部分:
1. 创建表:
create table user(
id smallint primary key not null auto_increment,
name varchar(20),
age smallint 
);
2. 常用命令:
create database test;  创建数据库test;
drop database test;    删除数据库test;
select database();   显示当前数据库;
show create table user; 查看创建表信息
show tables; 显示当前数据库所有的表
show columns from user; 显示列属性 或 discribe user;
show indexes from user \G; 显示所有的索引,“\G” 表示按列显示
drop table user1; 删除表
3. 表添加一列: alter table user add age tinyint
表删除一列: alter table user drop age;
4. 添加主键约束:alter table user2 add primary key (id);
删除主键约束:alter table user2 drop primary key;
添加唯一约束: alter table user2 add unique key uni_key (name);
删除唯一约束: drop index uni_key on user2;
添加外键约束:alter table user2 add foreign key (age) references user(id);
添加默认约束:alter table user2 alter age set default 20;
删除默认约束:alter table user2 alter age drop default;
修改列属性:alter table user2 modify name varchar(30);
修改列名:alter table user2 change age age1 tinyint not null;
修改表名:alter tabler user2 rename user3 或者 rename table user3 to user2;
注:尽量不要修改列名和表名
5. 更改客户端编码显示:set names gbk;   不影响数据库里编码;






子查询部分:
    概念:
子查询始终出现在小括号内 
子查询包含有多个关键字或者条件 eg:DISTINCT,GROUOP BY LIMIY,函数等。
子查询的外层查询可以是:SELECT,INSERT,UPDATE,SET或DO.....
子查询的返回值:标量,一行,一列或者子查询。
1. 子查询是指在另一个查询语句中的SELECT子句。
   例句:
   SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);


2. 行级子查询
   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);
   行级子查询的返回结果最多为一行。


3. 初始化数据表和数据
   a. 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
      );
   b. 写入记录
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);


4. 常用的一些sql写法:
   a. 求所有电脑产品的平均价格,并且保留两位小数,AVG,MAX,MIN、COUNT、SUM为聚合函数
SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods;


   b. 查询所有价格大于平均价格的商品,并且按价格降序排序
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > 5845.10 ORDER BY goods_price DESC;
  
   c. 使用子查询来实现
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;
   d. 查询类型为“超记本”的商品价格
SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本';


   e. 查询价格大于或等于"超级本"价格的商品,并且按价格降序排列
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


   f. 创建“商品分类”表
CREATE TABLE IF NOT EXISTS tdb_goods_cates(
cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
        cate_name VARCHAR(40)
);


   g. 将分组结果写入到tdb_goods_cates数据表
INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;


   h. 通过tdb_goods_cates数据表来更新tdb_goods表
UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name 
SET goods_cate = cate_id ;


   i. 通过CREATE...SELECT来创建数据表并且同时写入记录
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;




   j. 通过tdb_goods_brands数据表来更新tdb_goods数据表(错误)
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;


   k. 查看tdb_goods的数据表结构
DESC tdb_goods;


   l. 分别在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');


   m. 查询所有商品的详细信息(通过内连接实现)
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;


   n. 查询所有商品的详细信息(通过左外连接实现)
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;


   o. 查询所有商品的详细信息(通过右外连接实现)
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;


5. 无限分类的数据表设计


   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);


   a. 查找所有分类及其父类
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;
   
   b. 查找所有分类及其子类
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;


   c. 查找所有分类及其子类的数目
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;


   d. 为tdb_goods_types添加child_count字段
ALTER TABLE tdb_goods_types ADD child_count MEDIUMINT UNSIGNED NOT NULL DEFAULT 0;


   e. 将刚才查询到的子类数量更新到tdb_goods_types数据表
UPDATE tdb_goods_types AS t1 INNER JOIN ( 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 
                                            ORDER BY p.type_id ) AS t2 
ON  t1.type_id = t2.type_id 
SET t1.child_count = t2.children_count;


   f. 复制编号为19,20的两条记录
SELECT * FROM tdb_goods WHERE goods_id IN (19,20);


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);


   g. 查找重复记录
SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2;


   h. 删除重复记录
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;






内置函数部分:
1. 字符函数:
concat(): 字符连接
concat_ws(): 使用指定的分隔符进行字符连接
format(): 数据格式化
lower(): 转换成小写字母
upper(): 转换成大写字母
left(): 获取左侧字符
right(): 获取右侧字符
length(): 获取字符串长度
ltrim(): 删除前导空格
rtrim(): 删除后续空格
trim(): 删除前导和后续空格
substring(): 字符串截取
like(): 模糊匹配
replace(): 字符串替换


    例子:
select trim(leading '?' from '??mysql????');   --- mysql????
select trim(trailing '?' from '??mysql????');   --- ??mysql
select trim(both '?' from '??my??sql????');   --- my??sql


select * from test where first_name like '%1%%' escape '1';   -- 查询first_name 中包含"%";


2. 数值运算符函数:
ceil(): 进一取整
div: 整数除法
floor(): 舍一取整
mod: 取余数
power(): 幂运算
round(): 四舍五入
trancate(): 数据截取
    例子:
select 3 div 4  --- 0
select 3/4   --- 0.75


3. 比较运算符函数:
between...and... : 在什么之间
in(): 在列出值范围内
is null: 为空


4. 日期时间函数
now(): 当前日期和时间
curdate(): 当前日期
curtime(): 当前时间
date_add(): 日期变化
datediff(): 日期差值
date_format(): 日期格式化
    例子:
select date_add('2014-3-12', interval 365 day); --- 2015-03-12
select datediff('2013-3-12', '2014-3-12'); --- -365
SELECT DATE_FORMAT('2014-7-27','%m/%d/%y'); --- 07/27/2014
5. 信息函数:
CONNECTION_ID(): 连接ID
DATABASE(): 当前数据库
LAST INSERT_ID(): 最后插入记录
user(): 当前用户
version(): 版本信息
6. 聚合函数:
avg(): 平均值
count(): 计数
max(): 最大值
min(): 最小值
sum(): 求和
7. 加密函数:
md5(): 信息摘要算法
password(): 密码算法






自定义函数与存储过程部分:
1. 自定义函数语法:
CREATE FUNCTION function_name
RETURNS
{STRING|INTEGER|REAL|DECIMAL}
routine_body


调用:select SHOW_DATE();
    例子:
a. 无参
CREATE FUNCTION SHOW_DATE() RETURNS VARCHAR(30) 
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H时:%i分:%s秒');

b. 两个参数
CREATE FUNCTION SHOW_AVG(num1 SMALLINT UNSIGNED , num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1 + num2)/2;
c. 复合结构函数:
DELIMITER // --- 声明以'//'结束
CREATE FUNCTION ADD_USER(p_id SMALLINT,username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT user(p_id,username) VALUES(p_id,username);
RETURN LAST_INSERT_ID();
END
// 
2. 存储过程语法:
CREATE
[DEFINER = {user|CURRENT_USER}]
PROCEDURE sp_name ([proc_parameter[,...]]) //可以带0到多个参数
[characteristic ...] routine_body


IN, 表示该参数的值必须在调用存储过程时指定
OUT, 表示该参数的值可以被存储过程改变,并且可以返回
INOUT, 表示该参数的值调用时指定,并且可以被改变和返回


call sp1(); --- 调用存储过程


变量声明:
用 DECLARE 声明的变量是局部变量,局部变量只能存在于 BEGIN...END 之间,且声明时必须置于 BEGIN...END 的第一行
而通过 SELECT...INTO.../SET @id = 07 这种方法设置的变量我们称之为用户变量,只能存在于当前用户所使用的客户端有效
    例子:
a. 无参:
CREATE PROCEDURE sp1() SELECT VERSION();

b. 带有in类型参数:
DELIMITER //
CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED)
BEGIN DELETE FROM users WHERE id = p_id;
END
//
DELIMITER ;
c. 带有IN OUT类型参数
DELIMITER //
CREATE PROCEDURE removerUserAndReturnUserName(IN u_id INT UNSIGNED,OUT usernums INT UNSIGNED)
BEGIN
DELETE FROM user WHERE id = u_id;
SELECT count(ID) FROM user INTO usernums;
END
//
DELIMITER ;


调用:
CALL removerUserAndReturnUserName(10, @nums); --- @nums 所代表的就是用户变量,可用 SELECT @nums 输出 */
select @nums;
d. 带有多个IN OUT类型的参数:
DELIMITER //
CREATE PROCEDURE rmUserByAgeAndRtInfos(IN p_age SMALLINT UNSIGNED, OUT delNums SMALLINT UNSIGNED, OUT userNums SMALLINT UNSIGNED)
BEGIN
DELETE FROM users WHERE WHERE age = p_age; //注意变量不同
SELECT ROW_COUNT() INTO delNums;
SELECT COUNT(id) FROM users INTO userNums;
END
//
DELIMITER ;


调用:
call rmUserByAgeAndRtInfos(20, @delNums, @userNums);
select @delNums, @userNums;
3. 存储过程与自定义函数的区别
A、存储过程实现的功能相对复杂,函数针对性较强
B、存储过程可以返回多个值,函数只能有一个返回值
C、存储过程一般独立执行,函数可以作为 sql 语句的组成部分来出现






存储引擎部分:
1. MySQL 支持的存储引擎:
a. MyISAM
b. InnoDB
c. Memory
d. CSV
e. Archive
2. 锁:
共享锁(读锁):同一时刻多个用户可以读取同一个资源
排他锁(写锁):在任何时候只能有一个用户写入资源
   
   锁颗粒:
    表锁:是一种开销最小的锁策略;
    行锁:是一种开销最大的锁策略。


3. 设置存储引擎:
a. 通过修改MySQL配置文件:default-storage-engine = engine
b. 通过创建数据表命令:  CREATE TABLE tbl_name( ) ENGINE = engine;
c. 通过修改数据表命令: ALTER TABLE tbl_name ENGINE [=] engine_name;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值