mysql笔记

MAC 的环境变量有多个  其中两个是系统级 一般我们修改 
三个用户级 

设置的方法 终端是输入 vim ~/.bash_profile
如果提示该文件已经存在 就再输入E 强行编辑
如果不存则会创建并打开 

打开以后 添加新的一行 内容为
export PATH=$PATH:/usr/local/mysql/bin
表示在 新建了一个path 指向了mysql的可执行文件夹
编辑结束后 按ESC 输入:wq  表示保存并退出
重启终端  输入mysql  只要没提示 Command not found 就代表成功了


MySql常用命令
注意:一行指令输入完一定要加分号
#
登录Mysql服务器 
需要两个参数 -u加用户名 -p加密码

#
修改密码
set password for 用户名@服务器主机名(localhost) = password('新密码');

#
退出 exit

#
查看数据库
show databases;    查看所有
show create database db_name;    查看某个数据库属性

#
修改数据库属性
alter database db_name 属性 值;

#
查看当前选中的数据库
SELECT database();

#选中一个数据库
USE db_name;

#删除一个数据库
DROP DATABASE IF EXISTS db_name;

#创建表
create table 表名(类名 类型,...);

#修改表
1.新增列
alter table tableName add(columnName dataType.....);
2.修改某列数据类型
alter table tableName modify columnName dxataType;
3.删除某一列
alter table tableName drop columnName;
4.修改字符集
alter table  tableName character set  newSet;
5.修改某一列的名称
alter table tableName change oldColumn newColumn dataType;
6.修改表名
rename table tableName to newTableName

#查看当前数据库中所有表
SHOW TABLES;

#查表创建语句
SHOW CREATE TABLE tab_name;

#查看表结构
DESC table_name;

#
1.删除表
DROP TABLE[IF EXISTS] table_name;
2.重建表
TRUNCATE TABLE table_name;

#主键约束 用于唯一确定一条数据(主键必须是非空且唯一的)
CREATE TABALE table_name (列名 类型 PRIMARY KEY,列名2 类型,...);

#多字段组合主键
CREATE TABLE table_name(列名1 类型,列名2 类型,类名3 类型,PRIMARY KEY(列名1,列名2));

#唯一约束
CREATE TABLE 表名(列名1 类型 UNIQUE,列名2 类型);

#默认值约束
CREATE TABLE 表名(列名1 类型,列名2 类型,列名3 类型 DEFALUT 列名3的默认值);

#添加数据
insert into 表名 values("值①","值②"...);
注意:值的顺序与类型必须与表的字段一致,且每一个字段都需要赋值。

#同时添加多条数据
INSERT INTO table_name VALUES(value1,value2,..),(value1,value2,..),..;

#为表中指定字段添加数据
INSERT INTO table_name (column1,column2,..) VALUES(value1,value2,…..);
注意:使用这种方式,values中值的顺序和个数必须与前面小括号中声明的字段一致。

#更新数据
UPDATE table_name set column1 = value1,[column2 = value2]  [WHERE where_definition];
注意:SET 子句指明要修改哪些列以及新的值。
WHERE子句指定要更新哪些行,如果没有WHERE子句则更新所有行。例如where id = 1;则更新id为1的一行

#删除数据
delete from table_name [WHERE where_definition];
注意:
* 如果不使用where子句将删除表中所有数据。
* delete语句不能删除一列的值。
* delete删除的是表中的记录,不删除表,删除表使用drop table。
* 如果要删除所有数据 可以使用truncate table 。
* 同insert和update一样,删除记录应该考虑参照完整性问题,也就是外键约束。

#显示某表中的所有数据
select *from 表名;

#在创建表的同时创建索引
CREATE TABLE tab_name(column1 dataType,column2. .,[UNIQUE|FULLTEXT|SPATIAL] INDEX index_name (column [(length)][ASC|DESC])) [ENGING=指定引擎名];

#查看某索引的执行过程
explain select *from 表名 where 列名 = 值;

#查看某索引的结果
select *from 表名 where 列名 = 值;

#给某表添加一个普通索引
CREATE INDEX 自定义索引名 ON 表名(列名);

#用ALTER给某表添加索引
ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX 自定义索引名(列名);

#删除索引
ALTER TABLE table_name DROP INDEX index_name;

#
存储引擎指的是文件最终存放的方式和数据结构,不同的数据结构有不同的优缺点。(有的存取快,有的查找快)默认为InnoDB。

#
空间数据类型(SPATIAL),用来存放一些空间数据,例如:一个点,一条线,一个形状,坐标等等。如果我们自己单独保存这样的数据,会花费很大的代价,所以提供了专门用于表示空间的数据类型。

#简单查询语句
SELECT [DISTINCT] 列名称1,列名称2,... FROM 表名称;
注意:Distinct表示过滤掉重复内容

#查询某表中的全部内容
SELECT * FROM 表名称

#备份数据(使用mysqldump这个工具,与mysql一样,它包含在安装目录下的bin文件夹中,如果设置了环境变量,可以直接在终端调用它)
mysqldump -u -h -p 数据库名 > [可以用绝对路径,也可以不写,直接导出到终端当前的执行路径]导出文件名.sql;

#备份数据的常用可选参数
·-d 不备表中的任何数据,只备份表结构
·-t 不备份表结构(即不添加建表语句)
·-c 在insert语句中加入字段名
·--skip-add-drop-talbe 不添加drop语句
·--add-locks 添加表锁,防止在恢复中被并发修改(默认是添加的)
·--skip-add-locks 取消表锁

#数据的恢复
1、使用mysql工具    例如:mysql -uroot -p newDB < 导入的文件路径
注:不会自动创建newDB,需要在恢复前手动创建
2、登录到mysql后,先选择一个数据库,再使用“source 导入的文件路径”

#在select语句中可使用表达式对查询的列进行运算
SELECT *|{column1|expression, column2|expression,..}FROM tablename;

#在select语句中可使用as语句为列(或运算后的列)取别名
SELECT columnname as 别名 from table_name;

#WHERE 子句中可用的运算符
·比较运算符
    ·>   <   <=   >=   =    !=  :大于、小于、大于(小于)等于、不等于
    ·BETWEEN  ...AND... :显示在某一区间的值
    ·IN(set) :显示在in列表中的值,例:in(100,200)
    ·LIKE ‘张pattern’ :模糊查询  %代表零个或多个任意字符,_ 代表一个字符,例first_name like ‘_a%’;
    ·IS NULL :判断是否为空
·逻辑运算符
    ·and :多个条件同时成立
    ·or :多个条件任一成立
    ·not :不成立,例:where not(salary>100);

#Count(列名)返回某一列,行的总数
Select count(*)|count(列名) from tablename[WHERE where_definition];

#Sum函数返回满足where条件的行的和
Select sum(列名)[,sum(列名)] from tablename[WHERE where_definition];

#AVG函数返回满足where条件的一列的平均值
Select avg(列名)[,avg(列名)…] from tablename[WHERE where_definition];

#Max/min函数返回满足where条件的一列的最大/最小值
Select max|min(列名) from tablename[WHERE where_definition];

#使用order by 子句排序查询结果
SELECT column1, column2. column3..FROM    table order by column asc|desc;    
注: Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。Asc 升序、Desc 降序。ORDER BY 子句应位于SELECT语句的结尾。

#GROUP BY:作用: 把行按照字段分组
SELECT column, . FROM table_name group by column1,column2;
使用场景:常见于统计场合,如计算平均分,统计数据量等

#使用having 语句对GROUP BY的结果进行分组
SELECT column1,column2,. . FROM table_name group by column having column=[或者其他条件]'[某值]';
having 用于对分组结果继续过滤。
where和having的区别:where用于在原始数据中进行查询。
having用于在结果集中进行过滤。
当一个语句中既有where 又有having时 先执行where 后执行having
where条件中不能出现聚合函数,having中可以。

#
·分组函数与聚合函数一起使用才有意义;
·group by 后面的列必须出现在select后面;
·如果在select 语句中同时包含有group by ,having ,order by 那么他们的顺序是group by , having , order by。

#使用limit关键字来查询指定位置和指定数量的数据。
SELECT *|column. . from table_name limit [offset,] count;
offset可选用于指定从什么位置开始获取。
count指定要查询数据的条数。

#可以用SELECT来查看函数的返回结果
例如:SELECT CURRENT_DATE (  );

#流程控制函数
IF(expr1,expr2,expr3)    如果expr1为True ,则返回 expr2 否则返回 expr3
IFNULL(expr1,expr2)    如果expr1不为空NULL,则返回expr1,否则返回expr2
"SELECT CASE WHEN expr1 THEN expr2 ELSE expr3 END; [也可以多重分支.]"    如果expr1 为TRUE,则返回expr2,否则返回expr3(多重分支的时候,有几个CASE,就要有几个END)

#字符相关函数
CHARSET(str)    返回字串字符集
CONCAT (string2  [,... ])    连接字串
INSTR (string ,substring )    返回substring在string中出现的位置,没有返回0
UCASE (string2 )    转换成大写
LCASE (string2 )    转换成小写
LEFT (string2 ,length )    从string2中的左边起取length个字符
LENGTH (string )    string长度
REPLACE (str ,search_str ,replace_str )    在str中用replace_str替换search_str
STRCMP (string1 ,string2 )    逐字符比较两字串大小,
SUBSTRING (str , position  [,length ])    从str的position开始,取length个字符
LTRIM (string2 ) RTRIM (string2 )  trim    去除前端空格或后端空格

#数学相关函数
ABS (number2 )    绝对值
BIN (decimal_number )    十进制转二进制
CEILING (number2 )    向上取整
CONV(number2,from_base,to_base)    进制转换
FLOOR (number2 )    向下取整
FORMAT (number,decimal_places )    保留小数位数
HEX (DecimalNumber )    转十六进制
LEAST (number , number2  [,..])    求最小值
MOD (numerator ,denominator )    求余
RAND([seed])    RAND([seed])

#日期相关函数
CURRENT_DATE (  )    当前日期
CURRENT_TIME (  )    当前时间
CURRENT_TIMESTAMP (  )    "当前时间戳"
DATE_ADD (date2 , INTERVAL d_value d_type )    在date2中加上日期或时间
DATE_SUB (date2 , INTERVAL d_value d_type )    在date2上减去一个时间
DATEDIFF (date1 ,date2 )    两个日期差(结果是天)
TIMEDIFF(date1,date2)    两个时间差(多少小时多少分钟多少秒)
NOW (  )    当前时间
YEAR|Month|DATE (datetime )    返回datetime的某个部分

#其他函数
USER()    查询用户
DATABASE()    数据库名称
MD5(str)    为字符串算出一个 MD5 128比特检查和,通常用于对应用程序使用到的表的某个字段(比如用户密码)加密(其实是计算数据的特征码)
PASSWORD(str)    从原文密码str 计算并返回密码字符串,通常用于对mysql数据库的用户密码加密

#在创建表的同时添加自动增长
例如:create table student (id int primary key auto_increment,name char(30),age int);

#已经存在的表 添加自动增长
例如:alter table student3 modify id int auto_increment;

#外键约束
·是一种保证数据完整性的约束,具体表现是:在从表中保存主表的主键(逻辑上先有哪张表,哪张就是主表)
alter table [从表名] add foreign key([关联列名]) references 主表名([关联列名]);
·添加约束之后的变化:
    ·如果从表中有数据参照着主表的某个主键,那么这个主键对应的数据将不能直接删除(若一定要删除,则需先把从表对应的数据删除,再删除该主键)。
    ·如果在从表中插入一个新的数据,那么这个新数据的外键的值必须已经存在于主表中。
    ·外键尽量不添加,有外键,会降低一些性能。

#级联操作的作用:
    ·当主表发生了 update 或 delete 事件时,从表也相应地更新或删除。
    ·相应的动作有:
        ·CASCADE 同步更新或删除
        ·NO ACTION 不允许执行更新或删除
        ·SET NULL 当主表中某个主键被删除时,从表中将外键设为NULL。
        ·RESTRICT 拒绝对父表的删除或更新操作

#数据库的范式:是设计数据库的规范(一共有8种1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF,每一层都更加严格,如果满足了n+1层,则必然满足n层)
    ·基本的1NF,2NF,3NF
    ·1NF:表中的每一列都是原子性的,不可再分的。
    ·2NF:每一列都完全依赖主键(所以每个表都必然有自己的主键)。
        ·在设计时具体表现为不要把不相关的数据放到同一个表中。
        ·依赖:现有两个值 X,Y,若 Y 的值由 X 来决定,此时称为 Y 依赖于 X。
    ·3NF:每一列都与主键直接相关,而不是间接相关。
        ·任何非主键都不依赖于其他非主键。(即一个字段完全不依赖于其他字段,函数依赖也不行)
        ·在设计时具体表现为不要在一个表中保存其他表的非主键字段。
    ·为满足某种商业目标,数据库性能比规范化数据更重要。

#E-R图(Entity-Relation):将数据库中的实体与它们之间的关系用图来描述
    ·矩形代表实体
    ·椭圆代表属性
    ·菱形代表关系

#多表查询:同时在多个表中查询数据
    ·笛卡尔积查询:select *from table1,talbe2;        (此方法会产生大量的无用重复数据,所以用的不是很多)。
    ·内连接查询:select *from table1 inner join table2 on 条件;(在不添加条件的情况下,内连接查询与笛卡尔积查询得到的结果是一样的)
    ·左内连接:select *from table1 left join table2 on 条件; (右内连接与此相反,关键词为right)
    ·全连接:mysql中并不支持,但可以利用union关键字把左右连接合并到一起,实现全连接的效果。

#关键字:union
    ·union --> 合并查询,可将多个表查询结果进行合并(不包括重复行)
    ·union all -->与union不同,此项包括重复行
    ·注:被合并的表的结构必须一样。
    ·例如:select *from table1 union select*from table2;

#视图:
    ·是一张虚拟的表,表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上。
    ·视图中不存放数据,数据存放在视图所引用的原始表中,一个原始表,根据不同用户端的不同需求,可以创建不同的视图。

#创建视图:create view view_name as select语句;

#删除视图:drop view [if exists] view_name;

#查看视图:select 字段1,字段2... from view_name;(其实是先执行了创建视图时的sql语句,然后对这个sql语句的结果进行查询)

#事务:即一组sql语句的集合,具有以下特点
    ·原子性:指这一组sql是不可分割的一个整体,要么都执行成功,要么都失败。
    ·一致性:当事务完成时,数据必须处于一致状态。
    ·隔离性:并发事务之间彼此隔离、独立,即a事务的操作不会受到b事务的影响。(具体的隔离级别可以手动调整)
    ·持久性:当事务执行完成后,事务对数据的修改都是持久性的,不可恢复的。

#事务的使用:
    ·开启一个事务:begin|start transaction;
    ·事务提交:commit;
    ·事务回滚:rollback;(默认回滚到事务开始前的状态)
    ·为事务创建保存点:savepoint point_name;  (可以利用该点,让事务在回滚到指定位置)
    ·回滚事务至指定保存点:rollback to point_name;
    (注:如果有多个保存点,可以不断向前回滚,但无法向后前进,一旦回滚,那么该保存点之后的代码将不复存在。)
    (默认情况下,每一条sql都是一条单独的事务,默认自动提交。可以通过set autocommit=0,关闭自动提交)

#查看当前各变量情况:show variables [like '变量名'];

#事务的隔离级别:
(事务默认是可以并发执行的,可能发生,
脏读:读取到另一个事务未提交的数据;
不可重复读:两次对同一记录的查询结果不一致,即一个事务在查询,另一个事务在更新或修改;
幻读:对同一表中的查询结果数量不一致,即一个事务在查询,另一个事务在添加或删除;)
    ·设置隔离级别分两种:全局 与 会话级
    ·set 变量名=级别;
    ·例如:set global_isolation|isolation read-committed;
    ·查看tx_isolation当前的隔离级别:select @@global.tx_isolation,@@tx_isolation;

#mysql中的变量
    ·全局变量
    ·会话级变量
    ·局部变量

#存储过程:是一组sql语句集,它与java中方法很相似,也有输入参数,输出参数
    ·使用场景:通常情况下,我们需要把业务逻辑放在客户端处理,例如:注册新用户:
        ·首先发起一个请求,将要注册的用户名发给服务器进行查询;
        ·服务器将查询结果返回客户端;
        ·客户端根据结果判断是否可以注册;
        ·如果可以,则再发起请求,向数据库中插入数据;
        ·服务器返回插入结果。
        (此时需要与数据库服务器进行多次通讯,如果网络状态很差,将会需要很长时间,这时候就可以使用“存储过程”来将原本需要在客户端处理的逻辑放在数据库服务器中,服务器只需要返回一个注册成功或失败即可,大大减少了通讯次数。)
    ·缺点:不同数据库的“存储过程”大不相同,即不可移植,重用性太低。
    ·“存储过程”使用方法:
        ·创建:create procedure pro_name(p_type p_name data_type)
                begin
                sql语句
                end + 结束符

            ·p_type 表示参数的输入输出类型 有 in out inout;
            ·p_name 参数名
            ·data_type 数据类型
            ·注:在过程中,一行结束使用“;”
            ·在存储过程中可以插入任意的sql语句。
            ·为变量赋值需要使用 set 关键字;
            ·由于mysql默认结束符就是“;”,而存储过程也使用“;”来表示结束,
            所以需要使用 “delimiter + 结束符” 更换结束符。
        ·调用:使用关键字 call
            ·例如: call pro_name(参数);
            ·如果有返回值,需要用变量接收,定义变量的方式 set @变量名[=默认值];
            ·定义局部变量:declare 变量名 类型 default 值;
            ·定义的变量在断开连接后被释放。
        ·IF语句:
            ·if 条件1 then 语句1;elseif 条件2 then 语句2;else 语句3;end if;
        ·CASE语句:
            ·case 变量名 when 值1 then 语句1;when 值2 then 语句2;when 值3 then 语句3;
            else 语句4; end case;
        ·WHILE语句:        
            ·WHILE 条件 do
            语句。。。
            end WHILE;
        ·LOOP语句:无条件循环,需自己定义结束语句(添加if条件,并执行 “leave 循环名”)
        (可以用iterate 跳过本次循环)
            ·循环名:LOOP
            语句。。。
            end LOOP 循环名;
        ·REPEAT:额,也用于循环,流程与java中的dowhile相似
            ·repeat
            语句。。。
            until 结束条件 end repeat;
    ·存储过程中的条件定义与错误处理:
        ·条件定义:可以给系统已存在的错误指定一个方便记忆的名字。(但该条件定义必须被包含在一个存储过程中)
            ·语法:DECLARE error_name CONDITION FOR 错误码|状态码;
        ·错误处理:在执行存储过程中,发生了某个错误时的处理方法。有三种处理方法:
            ·CONTINUE(跳过错误继续执行)
            ·EXIT(立即退出)
            ·UNDO(回滚 mysql暂不支持)
            ·语法:DECLARE handtype HANDLER FOR condition_name|error_code|error_value 处理语句...

#游标CURSOR
    ·它是一个类似光标的指针,可以在表中行间移动,每次向后移动一行。
    ·作用:可以逐行取出数据,类似Java中的迭代器。
    ·它也是只用于存储过程中的。
    ·创建语法:DECLARE cur_name CURSOR FOR SELECT语句;
    ·游标声明后需要先用OPEN cur_name;来打开。
    ·打开后使用 FETCH 语句来从结果中获取一个数据,可以配合into,将获取到的数据存储至变量中
        ·例如:FETCH myCursor INTO name;
    ·使用完毕后用CLOSE cur_name;来关闭游标。
    ·注:变量要定义在游标定义之前,游标要定义在处理程序定义之前,变量名不要和目的表中的字段名重复。

#触发器:也是一段与表有关的mysql程序,当这个表发生了某种事件时,将会自动执行相应的触发器程序。
    ·支持的事件:UPDATE、INSERT、DELETE
    ·支持的时间点:事件发生前(BEFORE)、事件发生后(AFTER)。
    ·在触发器中可以访问到将被修改的那一行数据,根据事件不同,能访问的数据也不同:
        ·UPDATE 可用OLD访问旧数据,NEW访问新数据;
        ·INSERT 可用NEW访问新数据;
        ·DELETE 可用OLD访问旧数据。
    ·创建语法:
        ·CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt...;
    ·删除某个触发器:
        ·DROP TRIGGER trigger_name;
        ·注意:外键不能触发事件,主表删除了某个主键,从表也会相应删除,但不会执行触发器。
        ·触发器中不能使用事务。
        ·相同时间点的相同事件的触发器不能同时存在。

#定义函数:
    ·CREATE FUNCTION f_name(parameters...)
     returns dataType return value;
    ·说明:parameters 只能是in输入参数,格式: 参数名 类型,且方法必须有返回值(只能返回一个值)。
    ·函数一般不涉及数据的增删改查,就是一个通用的功能。
    ·调用自定义的函数,与调用系统函数的方法一致,使用 select 获得返回值。
    ·函数中不能使用sql语句。

#MySQL用户管理:
    ·创建一个本地用户monty,密码‘some_pass’,并给它所有权限:
        GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
    ·ALL PRIVILEGES:所有权限;
    ·*.*:所有数据库的所有表;
    ·TO 'monty'@'localhost':用户名和主机名;
    ·IDENTIFIED BY 'some_pass':密码设为‘some_pass’;
    ·WITH GRANT OPTION:可以再授权给其他用户(此句不写则不可以再授权)。
    ·创建一个用户u1,密码:admin ,只能对mydb01.sanguo表进行增删改查,且在任何电脑('%')上都可以登录:
        ·GRANT DELETE,UPDATE,INSERT,SELECT ON mydb01.sanguo TO 'u1'@'%' IDENTIFIED BY 'admin';
    ·删除某用户:
        ·DROP user u_name@host;(直接操作系统user表,删除指定用户的记录也可以)。
    ·收回指定的权限:
        ·REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] {tbl_name | * | *.* | db_name.*} FROM user@host [, user] ...;
        REVOKE ALL PRIVILEGES, GRANT OPTION FROM user@host [, user] ...;
        ·priv_type:要收回的权限;
        ·db_name.tbl_name:从哪个数据库的哪个表中,可使用通配符*;
        ·FROM user:从谁的手里收回    
    ·查看某用户的权限:
        ·SHOW GRANTS FOR 用户名@主机;(主机可以使用'%'来表示全部主机)。


关系型数据库 常见优化手段
1.为经常查询的表建立索引
2.分表 
垂直分    当一个表中字段比较多的时候 可以将其拆为多个表 使得单个表中字段减少
水平分    当一个表中的记录行数太多时 可以将数据分散到多个表中
3.sql 语句优化    例如:不要查询你不需要的任何数据 指定需要的列;select name from table

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值