MySQL笔记

1)mac采用brew安装mysql
  1.1)获取brew安装的列表
      brew list
  1.2)具体安装位置
      brew list [email protected]
2)mac 启动和关闭mysql数据库
  # mysql.server start
  # mysql.server stop
  # mysql.server restart
3)终端连接数据库
  # sudo su
  # 输入电脑密码
  # mysql -uroot -p -P3306 -h127.0.0.1
  # 输入mysql密码
  mysql> //todo something...
4)修改默认提示符
  4.1)连接客户端时通过参数指定
      shell>mysql -uroot -proot --prompt 提示符
      ex:mysql -uroot -proot --prompt \h    
      prompt参数后面跟的提示符包括:
      {\D:完整的日期;\d:当前数据库;\h:服务器名称;\u:当前用户}
  4.1)登录了mysql终端修改
      mysql>prompt
5)常用命令
  5.1)显示当前服务器版本 SELECT VERSION();
  5.2)显示当前日期       SELECT NOW();
  5.3)显示当前用户      SELECT USER();
  5.3)显示当前数据库      SELECT DATABASE();
6)书写规范
  关键字和函数名称全部大写;
  数据库名称、表名称、字段名称全部小写;
  SQL语句必须以分号结尾;
7)创建数据库语法结构: 大括号内是必选项,中括号是可选选
  CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] character_name;
8) 查看当前服务器下有多少个数据库
    SHOW {DATABASES | SCHEMAS} [LIKE 'pattern' | WHERE expr]
9)修改数据库
  ALTER {DATABASE | SCHEMA}  db_name [DEFAULT] CHARACTER SET [=] character_name;
10)删除数据库
  DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;
11)数据类型
  整型:TINYINT(1),SMALLINT(2),MEDIUMINT(3),INT(4),BIGINT(8); 无符号位:UNSIGNED
  浮点型:FLOAT[(M,D)],DOUBLE[(M,D)]   M是数字总位数,D是小数点后面的位数
  日期类型:YEAR,TIME,DATE,DATETIME,TIMESTAMP
  字符型:CHAR(M),VARCHAR(M),TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT,ENUM('value1',...,'valueN'),SET('value1',...,'valueN')
12)打开数据库
  USE database_name;
13)创建表语法结构
    CREATE TABLE [IF NOT EXISTS] table_name(
      column_name data_type,
      ...
    );
    -- example
    CREATE TABLE `item_stock` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `stock` int(11) NOT NULL DEFAULT '0',
      `item_id` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

14)查看数据表列表
  SHOW TABLES [FROM db_name][LIKE 'pattern' | WHERE expr]
15)查看数据表结构
  15.1)SHOW COLUMNS FROM table_name;
  15.2)DESC table_name;
16)INSERT插入命令语法
  1) INSERT [INTO] table_name[(col_name,...)] VALUES(val,...);
  2) INSERT [INTO] table_name[(col_name,...)] {VALUES|VALUE}({expr | DEFAULT},...),(...),...
  3)INSERT [INTO] table_name SET col_name ={expr | DEFAULT},... 插入子查询查询的结果
  4)INSERT [INTO] table_name[(col_name,...)] SELECT ...
  
  如果插入的时候是自增序列则使用DEFAULT 或者 NULL,则自增序列不受影响。
17)SELECT 命令语法
  SELECT expr,...FROM table_name 
18)空值和非空
  NULL,字段值可为空
  NOT NULL,字段值不能为空
19)自动编号
  AUTO_INCREMENT
  自动编号,且与主键组合使用;
  默认情况下,起始值为1,自增值为1;
20)主键
  PRIMARY KEY
  主键约束:
    每张数据表都有唯一一个主键,
    主键保证记录的唯一性,
    主键自动为NOT NULL;
21)唯一约束
  UNIQUE KEY
  唯一约束保证记录的唯一性,
  唯一约束的字段可以为NULL,
  每张数据表可以存在多个唯一约束;
22)默认约束 DEFAULT 
  当插入记录时,如果没有明确为字段赋值,则自动赋予默认值;
23)约束
  23.1)约束保证数据的完整性和一致性;
  23.2)约束分为表级约束和列级约束
  23.3)约束分类:
    NOT NULL(非空约束)
    PRIMARY KEY(主键约束)
    UNIQUE KEY (唯一约束)
    DEFAULT (默认约束)
    FOREIGN KEY (外键约束)
24)外键约束 FOREIGN KEY
  保证数据的完整性和一致性;
  实现一对一或者一对多的关系;
  要求:
    1)父表和子表必须使用相同的数据引擎,而且禁止使用临时表;
    2)数据表的存储引擎必须只能为InnoDB;
    3)外键列和参照列必须使用相似的数据类型。其中数字的长度或是否有符号位必须相同,而字符的长度可以不同;
    4)外键列和参照列必须创建索引,如果外键不存在索引,Mysql则自动创建索引;
25)外键约束的参照操作
  1)CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行
  2)SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL,如果使用该选项,必须指定子表列没有指定NOT NULL
  3)RESTRICT:拒绝对父表的更新或删除操作
  4)NO ACTION: 标准SQL的关键字,在mysql中与RESTRICT相同
  具体语法:
     FOREIGN KEY (sub_table_id) REFERENCES father_table (id) ON DELETE CASCADE
26)编辑数据库默认的存储引擎
  mysql配置文件:
    default-storage-engine=INNODB
27)表级约束和列级约束
  1)对一个数据列建立的约束,称为列级约束
  2)对多个数据列建立的约束,称为表级约束
  3)列级约束既可以在列定义时声明,也可在列定义后声明
  4)表级约束只能在列定义后声明
28)修改数据表-添加/删除列
  1)添加单列
    ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name];
  2)添加多列
    ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition,...);
  3)删除列
    TABLE tbl_name DROP [COLUMN] col_name;
29)修改数据表-添加约束
  1)添加主键约束
    ALTER TABLE tbl_name ADD [CONSTRAINT [symbol 自定义约束名称]] PRIMARY KEY [index_type](index_col_name,...);
  2)添加唯一约束
    ALTER TABLE tbl_name ADD [symbol 自定义约束名称]] UNIQUE [INDEX | KEY] [index_name] [index_type](index_col_name,...);
  3)添加外键约束
    ALTER TABLE tbl_name ADD [symbol 自定义约束名称]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition;
  4)添加/删除默认约束
    ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
  5)删除主键约束
     ALTER TABLE tbl_name DROP PRIMARY KEY
  6)删除唯一约束
     ALTER TABLE tbl_name DROP {INDEX|KEY} index_name
  7)删除外键约束
     ALTER TABLE tbl_name DROP FOREIGN KEY ky_symbol
  8)修改定义列
     ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
  9)修改列名称
     ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]
  10)数据表更名
    1) TABLE tbl_name RENAME [TO|AS]  new_tbl_name
    2) RENAME TABLE tbl_name  TO new_tbl_name [,tbl2_name TO new_tbl2_name]...
30)单表更新记录UPDATE
  UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1 = {expr|DEFAULT} [,col_name2 = {expr|DEFAULT}]...
  [WHERE where_condition] 
  table_reference表的关系:
    table_reference 
      {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN} 
    table_reference
      ON conditional_expr
    连接类型
    INNER JOIN 内连接
    LEFT [OUTER] JOIN 左外连接
    RIGHT [OUTER] JOIN 右外连接
    在mysql中,JOIN,CROSS JOIN,INNER JOIN 都是等价的。
    多表更新数据:
      UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name SET goods_cate = cate_id;
      
30)单表删除记录 DELETE
  DELETE FROM table_name [WHERE where_condition]
31)查询记录 SELECT 
  SELECT select_expr[,select_expr ...]
  [
    FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | position} [ASC | DESC],...]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position} [ASC | DESC],...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
  ]
31)查询表达式 select_expr
  每一个表达式表示的是一列,必须有至少一个;
  多列之间用英文逗号分隔;
  星号(*)表示所有列,tbl_name.*可以表示命名表的所有列;
  查询表达式可以使用[AS] alias_name 为其赋予别名;
  别名可以用于GROUP BY、ORDER BY或HAVING子句中;
31)查询条件表达式 WHERE
  对记录进行过滤,没有指定WHERE则查询全部记录;
  在WHERE表达式中,可以使用mysql支持的函数或表达式;
32)查询结果分组 GROUP BY
  [GROUP BY {col_name | position} [ASC | DESC],...]
33)分组条件 HAVING 针对符合条件的分组
  [HAVING where_condition] where_condition是集合函数表达式
34)对查询结果进行排序 ORDER BY
  [ORDER BY {col_name | expr | position} [ASC | DESC],...]
  ASC 升序,DESC 降序,position 位置
35)限制查询结果返回的数量 LIMIT
  [LIMIT {[offset,] row_count | row_count OFFSET offset}]
  offset:偏移量
  row_count:需要返回的行数
36)子查询
  1)子查询(SubQuery)是指出现在其他SQL语句内的SELECT子句
  SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2);
  其中 SELECT * FROM t1称为Outer Quary / Outer Statement
  SELECT col2 FROM t2 称为SubQuery。
  2)子查询指嵌套在查询内部,且必须始终出现在小圆括号内;
    子查询可以包含多个关键字或条件(DISTINCT,GROUP BY.ORDER BY, LIMIT)
    子查询的外围查询可是:SELECT,INSERT,UPDATE,SET或DO。
  3)子查询可以返回标量,一行,一列,子查询;
  4)比较符号的子查询
    =、>、<、<=、>=、<>、!=、<=>
    语法结构
      operand comparisn_operator subquery
    查询大于平均价格的商品
    SELECT * FROM tdb_goods WHERE goods_price >= (SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);
    4.1)当子查询出现多行记录,用ANY、SOME、ALL修饰的比较运算符
    operand comparison_operator ANY (称为SubQuery)
    operand comparison_operator SOME (称为SubQuery)
    operand comparison_operator ALL (称为SubQuery)
    ANY和SOME是等价的,满足一个即可;ALL是全部满足。
              ANY        SOME      ALL
    >、>=    最小值     最小值   最大值
    <、<+    最大值     最大值   最小值
    =        任意值     最大值
    <>、!=                       最大值
  -- 查询商品价格
  SELECT * FROM  tdb_goods WHERE goods_price >= ALL
    (SELECT goods_price FROM tdb_goods WHERE  goods_cate = '超级本');
  5)[NOT] IN 子查询
    operand comparison_operator [NOT] IN (SubQuery)
    =ANY运算符和IN等效
    !=ALL或<>ALL运算符和NOT IN 等效
  6)创建表的时候插入数据 CREATE...SELECT
    创建数据库表的同时将查询到的结果集写入到数据表
    CREATE TABLE [IF NOT EXISTS] tbl_name 
    [(create_definition,...)]
    select_statement
    -- example
    CREATE TABLE tdb_goods_brand(
	    band_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	    band_name VARCHAR(40) NOT NULL
    )SELECT brand_name FROM tdb_goods GROUP BY  brand_name;

    -- 同时修改多列列明的同时修改字段类型
    ALERT TABLE tdb_goods 
      CHANGE goog_cate cate_id SMALLINT UNSIGNED NOT NULL,
      CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;
37)连接的语法结构
    table_reference表的关系:
    table_reference 
      {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN} 
    table_reference
      ON conditional_expr
    连接类型
    INNER JOIN 内连接
    LEFT [OUTER] JOIN 左外连接
    RIGHT [OUTER] JOIN 右外连接
    在mysql中,JOIN,CROSS JOIN,INNER JOIN 都是等价的。
    
    2)tbl_name [[AS] alias] | table_query [AS] alias
      数据表可以使用tbl_name [[AS] alias]赋予别名;
      table_query可以作为子查询使用在FROM子句中,这样的子查询必须赋予别名
38)连接条件
  使用ON关键字来设定连接条件,也可以使用WHERE来代替。
  通常使用ON关键字来设定连接条件,
  使用WHERE来进行结果集的过滤。
39)连接
  1)内连接:显示左表和右表符合连接条件的记录,取A表和B表的交集
    SELECT goods_id,goods_name,cate_name 
    FROM tdb_goods INNER JOIN tdb_goods_cate
    ON tdb_goods.cate_id = tdb_goods_cate.cate_id
  2)左外连接:显示左表的全部记录和右表符合连接记录的集合
    SELECT goods_id,goods_name,cate_name 
    FROM tdb_goods LEFT JOIN tdb_goods_cate
    ON tdb_goods.cate_id = tdb_goods_cate.cate_id
  3)右外连接:显示右表的全部记录和左表符合连接记录的集合
  4)多表连接
40)无限分类的数据表设计
  CREATE TABLE tb_type(
	  type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	  type_name VARCHAR(20) NOT NULL,
	  parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
  );
  自身连接:
    -- 查询子类的父类
    SELECT s.type_id,s.type_name,p.type_name
    FROM tb_type AS s
    LEFT JOIN tb_type AS P
    ON s.type_id = p.type_id;
  -- 查询父类下面的子类
    SELECT p.type_id,p.type_name,s.type_name
    FROM tb_type AS p
    LEFT JOIN tb_type AS s
    ON s.type_id = p.type_id;
41)多表删除
  DELETE table_name[.*][,table_name[.*]]...
  FROM table_reference
  [WHERE where_condition]
  -- example
  DELETE t1 FROM tb_type AS t1
  LEFT JOIN 
    (SELECT goods_id,goods_name 
	   FROM tb_type 
	   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;
42)函数-字符函数
  CONCAT()  字符连接
  CONCAT_WS() 使用指定的分隔符连接字符串
  FORMAT() 数字格式化
  LOWER() 转换为小写字母
  UPPER() 转换为大写字母
  LEFT()  获取左侧字符
  RIGHT() 获取右侧字符
  LENGTH() 获取字符串长度
  LTRIM()  删除前导空格
  RTRIM() 删除后续空格
  TRIM()  删除前导和后续空格
  SUBSTRING() 字符串截取
  [NOT]LIKE  模糊匹配
  REPLACE() 字符串替换
43)函数-数值运算符函数
  CEIL() 进一取整
  DIV()  整数除法
  FLOOR() 舍一取整
  MOD() 取余数(取模)
  POWER() 幂运算
  ROUND() 四舍五入
  TRUNCATE() 数字截取
44)函数-比较运算符
  [NOT]BETWEEN...AND... [不]在范围内
  [NOT] IN()[不]在列出范围内
  IS [NOT] NULL[不]为空
45)函数-日期函数
  NOW()   获取当前日期和时间
  CURDATE() 当前日期
  CURTIME() 当前时间
  DATE_ADD() 日期变化
  DATEDIFF() 日期差值
  DATE_FORMAT() 日期格式化
46)函数-信息函数
  CONNECTION_ID() 连接ID
  DATABASE() 当前数据库
  LAST_INSERT_ID() 最后插入记录的ID
  USER() 当前用户
  VERSION()  版本信息
47)函数-集合函数-只有一个返回值
  AVG() 平均值
  COUNT() 计数
  MAX() 最大值
  MIN() 最小值
  SUM() 求和
48)函数-加密函数
  MD5()   信息摘要算法
  PASSWORD()密码算法 修改当前账号或其他账号登录mysql的登录密码
50)函数-自定义函数
  CREATE FUNCTION function_name
  RETURNS
  {STRING|INTEGER|REAL|DECIMAL}
  routine_body
  
  routine_body函数体:
    由合法的SQL语句组成;
    可以是简单的SELECT或INSERT语句;
    如果函数体为复合结构,则使用BEGIN...END语句;
    复合结构可以包含声明、循环、控制结构;
  1)创建不带参数的自定义函数:
    CREATE FUNCTION f1() RETURNS VARCHAR(30)
    RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');
    调用函数:SELECT f1();
  2)创建带参数的自定义函数:
    CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED) 
    RETURNS FLOAT(10,2) UNSIGNED
    RETURN (num1 + num2) / 2;
    调用函数:SELECT f2(10,5);
  3)创建集合函数的自定义函数
    -- 替换分隔符
    DELIMITER $$
    -- 创建聚合自定义函数
    CREATE FUNCTION addUser(userName VARCHAR(20))
    RETURNS INT UNSIGNED
    BEGIN
	    INSERT INTO test(username) VALUES(userName);
	    RETURN LAST_INSERT_ID();
    END
    $$
    DELIMITER ;
    -- 调用函数
    SELECT addUser('TOM');
    
51)-存储过程-创建
  CREATE 
  [DEFINER = {user | CURRENT_USER}]
  PROCEDURE sp_name ([proc_paramter[,...]])
  [characteristic ...] routine_body
  
  proc_paramter:
  [IN | OUT] param_name type
  参数:
    IN表示在调用存储过程的时候必须指定
    OUT表示该参数的值可以被存储过程改变,并且可以返回
    INOUT表示该参数调用时指定,并且可以被修改和返回
  特性:
    COMMENT: 注释
    CONTAINS SQL: 包含sql语句,但是不包含读或写的语句
    NO SQL: 不包含sql语句
    READS SQL DATA: 包含读数据的语句
    MODIFIES SQL DATA: 包含写数据的语句
    SQL SECURITY{DEFINER | INVOKER} 指明谁有权限执行
  过程体:
    过程体由合法是sql语句组成;
    过程体是任意的sql语句;
    过程体如果是复合结构,则采用BEGIN...END语句;
    复合结构可以包含声明、循环、控制结构;
  调用存储过程:
    CALL sp_name([paramter[,...]])
    CALL sp_name[{}]
  删除存储过程
    DROP PROCEDURE  [IF EXISTS] param_name
  不带参数的存储过程:
    CREATE PROCEDURE sp1() SELECT VERSION();
    CALL sp1;
  带IN参数的存储过程:
    DELIMITER $$
    CREATE PROCEDURE sp2(IN p_id INT UNSIGNED)
    BEGIN
	    DELETE FROM users WHERE users.id = p_id; 
    END
    DELIMITER ;
    CALL sp2(11);
  带IN,OUT参数的存储过程
    DELIMITER $$
    CREATE PROCEDURE sp3(IN p_id INT UNSIGNED,OUT userNums INT UNSIGNED)
    BEGIN
	    DELETE FROM users WHERE users.id = p_id;
	    SELECT COUNT(id)FROM users.id INTO userNums;
    END
    DELIMITER ;
    
    CALL sp3(11,@nums);
    SELECT @nums;
    
  注意:declare定义的变量只在begin...end内有效;
        类似 SET @ID = 7;是用户变量,
        用户变量是和mysql的客户端绑定的,只对当前用户使用的客户端生效;
        
  带有多个OUT参数的存储过程
    DELIMITER $$
    CREATE PROCEDURE sp3 (IN p_age SMALLINT UNSIGNED,OUT delNum INT UNSIGNED,OUT userCount INT UNSIGNED)
    BEGIN
	    DELETE FROM users WHERE users.age = p_age;
	    SELECT ROW_COUNT() INTO delNum;
	    SELECT COUNT(id) FROM users INTO userCount;
    END
    DELIMITER ;
52)-MySQL管理工具
  PHPMyAdmin
  Navicat
  MySQL Workbench

 

你可能感兴趣的:(MySQL)