mysql 基础和进阶知识总结


##mysql中常见的关键字及其用法

1、select * from tablename;
2、select function() 执行打印函数结果
3、use 切换数据库
4、select distinct(elem) from tablename 不重复显示元素elem
5、desc tablename 显示表结构
6、mysql 中 “+” 的作用,进行数学运算
7、select concat(elem1,elem2,elem3,..) from tablename 链接concat中的字符
8、select ifnull(elem,result) from tablename ifnul(elem,result) 表示如果elem为null,则返回result
9、select elem from tablename where 条件 查询出符合条件的
          条件运算符:> , < , = , <> , >= , <=
          逻辑运算符:and(&&) , or(||) , not(!)
          模糊查询:like, between and, in, is null
            like -->> select * from tablename where elem like "%s%"
                like 中的通配符 % 任意多的字符;_任意一个字符,不可以匹配null;
                like中防止转义 : like "_\_" ,like "%\%" 通配符前加"\"后代表"\"或"%"
                like "_$_%" escape "$" 通过escape指定防止转义的符号
            between and -->> select * from tablename where elem between 100 and 200  查询elem的值在100到200之间的数字包含100和200(大于等于左边小于等于右边)
            in  -->> select * from tablename where elem in (item1,item2,item3) 查询出elem中在item1,item2,item3中的数据
                in 中的数据必须统一 ,不支持通配符
            is null -->> elem = null这是错误的表达方式,=或<> 不能判读null 使用is null 或is not null
            安全等于 <=>; 安全等于可以判读null
10、order by column -->> select * from tablename [where 条件] [order by column|express [asc|desc]] desc为降序,asc为升序,默认为asc(express为一个表达式:a + b +c ;亦可以是表达式的别名)
    多个字段排序order by column1 [asc|desc],column2[asc|desc]
    order by 子句中可以支持单个字段,多个字段、表达式、函数、别名
    order by 字句一般是放在查询语句的最后,除limit字句
    使用gbk编码排序
        SELECT distinct(province_name) FROM bw_store order by convert(province_name using gbk) asc
    自定义排序
        ORDER BY FIELD(`id`, 5, 3, 7, 1)
11、show variables like "%char%"

##mysql中常用的function
语法:select function(*args,**kwargs)
函数分为单行函数和分组函数
单行函数:
    字符函数:length(str)、concat(str1,str2)、upper()|lower():返回大小写
            substring()|substr():截取字符串 -->> select substr("dfghjkl",7,3),7为索引位置,3为字符长度
            instr() -->> select instr("qwert","q") 返回子字符串第一回出现的位置,索引是从1开始的。如果找不到返回0
            trim() -->> select trim("     zhupenghui       ") 返回去除前后空格的字符串
                select trim('a' from "aaaaaaaazhuaapengaahuiaaaaaaa") ->> 'zhuaapengaahui'
            lpad() -->> select lpad("zhu",10,"*") 总长度为10,填充字符为"*"
            rpad() -->> 右填充
            replace() -- select replace("eeaabbccddee",'ee','ff') 将"ee"全部替换为"ff"
    数学函数
        round 四舍五入 select round(4.6) -->> 5
            round(1.5656, 2) 四舍五入,保留小数点后两位
         ceil 向上取整 select ceil(1.2) -->> 返回大于等于该参数的最小整数
         floor 向下取整 ,与ceil相反
         truncate 截断 select truncate(2.44,1) 截断保留一个小数
         mod 取余 a-a//b*b

    日期函数
        now() 返回当前系统日期+时间
        curdate() 返回当前系统的日期,不包含时间
        curtime() 返回当前系统的时间,不包含日期
        select year(now()) 返回年 (select year("2018-2-4"))
        select month(now()) 返回年 (select year("2018-2-4"))
        select monthname(now()) 返回月份的英文名
        str_to_date("9-33-2008","%m-%d-%Y)
        date_format(now(),"%y年%m月%d日") 日期转换为字符
            时间格式化说明
                %Y 四位的年份
                %y 两位的年份
                %m 月份 (01,02,...,12)
                %c 月份 (1,2,...,12)
                %d 日 (01,02,...)
                %H 小时(24小时制)
                %h 小时(12小时制)
                %i 分钟(00,01,02,...)
                %s 秒(00,01,02,...)
    其他函数
        select database()
        select version()

    流程控制函数
        if(条件,条件满足返回值,条件不满足返回值)
            select if(10>5,"大","小")
        case 要判断的字段或表达式
        when 常量 then 要显示的值或语句
        ...
        else 要显示的值或语句
        end
            select salary,department_id,
            case department_id
            when 30 then salary*1
            when 50 then salary*2
            else salary
            end as 新工资
            from employees
        ### 如果department_id = 30 工资为1倍,如果department_id = 50 工资为2倍
        case
        when 条件1 then 显示的值1或语句1
        when 条件2 then 显示的值2或语句2
        ...
        else 显示的其他值或语句
        end
        ##此语句相当于if elif else

分组函数 - 聚合函数:
sum()
min()
max()
avg() -- >> 平均值
count() -->> 计数
count(*) 统计行数
MYISAM 储存引擎,count(*) 的效率最高
INNODB  存储引擎,count(*) 和count(1)的效率差不多,比count(字段)要快
和分组函数一同查询的字段要求是group by后的字段

##分组查询
select 分组函数,列(要求出现在group by的后面)
from 表
[where 筛选条件]
group by 分组的列表
[having 筛选条件] -->>> 分组后的筛选
Oder by 字句
select max(salary) ,job_id
from employees
group by job_id;

多个分组
select name, boyName from beauty, boys; 产生笛卡尔乘积现象

分类:sql199 标准

    等值链接
        女生名对应的男生名
        1、select beauty_name, boy_name from boys, beauty
        where beauty.id = boys.id
        2、select
        beauty_name, boy_name from boys b
        inner join beauty
        on beauty.boys_id = b.id
    非等值链接
        select salary, grade_level from employees e ,job_grades g
        where salary between g.lowest and g.highest
        select
            salary, grade_level
        from
            employees e
        inner join
            job_grades g
        on salary between g.lowest and g.highest
    自连接
        select
        e.employee_id,e.last_name, m.employee,m.last_name
        from employees e, employees m
        where e.manage_id = m.employee_id
        2\
        select
        e.employee_id, e.last_name, m.employee_id, m.last_name
        from employees e
        inner join employees m
        on e.manager_id = m.employee_id


    链接语法
        select 查询表
        from 表1 [as] 别名 [链接类型]
        join 表2 [as] 别名
        on 链接条件
        where 筛选条件 (链接后的条件筛选)

    内连接:链接类型 :inner
    外链接
        左连接 :left [outer]
        select
         *
        from
            beauty
        left join
            boys
        on
            beauty.boy_id = boys.id
        where
            bo.id is null
        求补集:属于A但是不属于B
            select select_list
            from A
            left join B
            on A.key = B.key
            where B.key is null
        求补集:属于B但是不属于A
            select select_list
            from B
            left join A
            on A.key = B.key
            where A.key is null


        右链接:right [outer]
        全外链接 full [outer]
        select select_list
        from A
        full join B
        on A.key = B.kye
    交叉链接 cross

##子查询
    查询在其他语句中的select语句中,称为子查询或内查询
    外部的查询为主查询

    分类:
        按查询出现的位置
            1、select后面
                仅仅支持量子查询
            2、from后面
                支持表子查询
            3、where 或 having后面
                标量子查询
                列子查询
                行子查询
            4、exists后面(相关子查询
                表子查询

        按结果集的行列数不同
            1、标量子查询(结果只有一行一列)
            2、列子查询(一列多行)
            3、行子查询(多行多列)
                select *
                from  employees
                where
                    (employee_id , salary) = (
                    select min(employee_id), max(salary)
                    from employees)
                    ##放在where后面
                select d.* ,(
                    select count(*)
                    from employess e
                    where e.departments_id = d.department_id
                    )
                from departments d;
                ##放在select后面
                 select avg(salary), department_id,
                 from employees
                 group by department_id
                 left outer join

            4、表子查询(一般为多行多列)


a in (10,20,) a在any后的列表中返回True
a > any(1,2,3) <=> a> min((1,2,3))
a > all(1,2,3) <=> a> max((1,2,3))
select *
from beauty
left join boys
on beauty.boy_id = boys.id
where beauty.id > 3

select department_id from employees
where last_name = ""

select distinct department_id
from department
where location_id = 1700


##分页查询
    select 查询表
    form 表
    [join type] join 表2
    on 链接条件
    where 筛选条件
    group by 分组字段
    having 分组后的筛选
    order by 排序字段 [asc,desc]
    limit offset,size ##offset 显示要显示的起始索引(从零开始mysql中其他地方的索引从1开始 )size 是显示的个数

##联合查询
union 将多条查询语句合并成一个结果
特点:
    要求多条查询语句的查询列数是一致的
    要求多条查询语句的查询的每一列的类型和顺序是一致的
    使用union 会自动去重
    使用union all不会去重

DML语言
数据操作语言
insert 插入
    语法:
    插入单条  insert into 表名 (列名,...)values (value1,...)
    insert into 表名 set 列名=值,列名=值,...
    insert into 表名 (列名,...) select value1,value2,...
    多行插入  insert into 表名 (列名,...) values (value1,value2,...),
                (value1,value2,...)



update 更新
    语法:
        修改单板的记录
            update table_name
            set column1= value1,column2 = value2, ...
            where 筛选条件;
        修改多表
            update table as new_table
            inner|left|right join table2 as new_table2
            on 链接条件
            set column1 = value1,...
            where 筛选条件

delete 删除
    delete from table1 where 筛选条件
    truncate table 表名 ##删除表

##DDL
1、库的管理
    创建、修改、删除
    创建库:
        create database 库名; create database if not exists 库名
    库的修改:
        rename database 库名 to 新库名 ##重命名
        alter database 库名 character set utf-8
    库的删除:
        drop database 库名



2、表的管理
    创建、修改、删除

创建:create
修改:alter
删除:drop

表的管理
    表的创建
        create table 表名(
            列名 列的类型 [长度 约束],
            列名 列的类型 [长度 约束],
            列名 列的类型 [长度 约束],
            列名 列的类型 [长度 约束],
            ) charset utf-8;

表的修改 alter table 表名 add|drop|modify|change column 列名 列类型
修改列名
    alter table 表名 change column 列名 [新列明 数据类型];

修改列的类型和约束
    alter table 表名 modify column 列名 数据类型;

添加列名
    alter table 表名 add column 列名 数据类型;

删除列
    alter table 表名 drop column [if exists] 列名;

修改表名
    alter table 表名 rename to 新表名

表的删除
    drop table [if exists] 表名

##创建的数据类型
数值型
    整型:Tinyint(1字节)、Smallint(2字节)、Mediumint(3字节)、Int/integer(4字节)、Bigint(8字节)
        如何设置有符号和无符号
            t1 int unsigned
        零填存
            t3 int(11) zerofill
    小数:
        浮点数:float 4 、double 8;写法float/double(M,D)  M整数部位加小数部位 D为小数部位
        定点数:decimal,默认M为10,D为0
    **选择原则:所选择的类型越简单越好,能保存数值的类型越小越好

字符型
    较短的文本:char 、varchar
        char(M) M为0~255之间的数值,char固定字符,省略默认M等于1
        varchar(M) M为0~65535之间的数值,可变字符,M步不可省略
        enum("a","b","c"),enum 可以控制插入的值只能是enum中其中的一个不区分大小写,保存枚举
        set("a","b","c"),控输入的值为"a","b","c"或"a","b","c"之间的组合,保存集合
        binary 和 varbinary 用于保存较短的二进制





    较长的文本:text、blob(较长的二进制数据)

日期型

date 只保存日期 4字节 时间范围 1000-01-01 ~ 9999-12-31
time 只保存时间 3字节 -838:59:59 ~ 838:59:59
year 只保存年 1字节 1901 ~ 2155
datetime 保存时间和日期 8个字节 1000-01-01 00:00:00 ~ 9999- 12- 31 23:59:59
timestamp 4字节 最大为2038年,随时区变化 保存日期加时间

##常见约束
not null :非空,必填
default 默认 设置默认值
primary key 主键,保证数据唯一性,且非空
unique 保证数据的唯一性,但是可以为空
check 检查约束【mysql中不支持,只是做了与其他数据库数据做兼容】
foreign key 外键 用余限定两个表的关系

index 索引 主键、外键、unique都自带索引

列级约束:都支持,但是外键和check无效果
create table students(
    id int primary key auot_increment,
    student_name varchar(20) not null,
    gender char(1) check(gender="man" or gender="woman"),
    seat int unique,
    age int default 18,
    major_id int references major(id)
);

create table major(
    id int primary key,
    major_name varchar(20)
);

表级约束
语法:
    constraint [约束名] 约束类型 (字段)
create table students(
    id int auot_increment,
    student_name varchar(20) not null,
    gender char(1),
    seat int,
    age int default 18,
    major_id int,
    constraint pk primary key(id),
    constraint uq unique(seat),
    constraint ck check(gender="man" or gender="woman")
    constraint fk foreign key (major_id) references major(id)
);

create table major(
    id int primary key,
    major_name varchar(20)
);

约束通用写法:
create table if not exists stuinfo(
    id int primary key,
    stuname varchar(20) not null,
    age int default 18,
    seat int unique,
    majorid int,
    constraint fk_stuinfo_majorid foreign key (majorid) references major(id)
);

主键和唯一
           唯一    是否为空   个数
    主键   Y           Y        1
    唯一   Y           N        n
外键
    主表的关联键必须是一个主键
    插入数据时,必须先插入主表数据再插入从表
    删除数据时先删除从表再删除主表

修改表的约束
    alter table stuinfo modify column stuname varchar(20) not null

添加外键
    alter table add foreign key (majorid) references major(id)

删除主键:
    alter table stuinfo drop primary key
删除唯一键
    alter table sruinfo drop index column
删除外键:
    alter table stuinfo drop foreign key

##标识列
1、auto_increment



##TCL 事务控制语言
事务:由单独单元的一个或多个sql语句组成,在这个单元中,每一个mysql语句是相互依赖的,整个单独单元作为一个
    不可分割的整体,如果单元中的某条sql语句一且执行失败,整个单元将会回滚,所有受影响的数据将会返回到事
    务开始以前的状态,如果单元中的所有sql语句均执行成功,则事务被顺利执行。
查看数据库引擎:show engines

常见的数据库引擎有,Innodb、myisam、memory,其中只有innodb支持事务

事务的ACID
1、原子性,事务是一个不可分割的工作单位,事务中的操作要么都发生要么不发生
2、一致性,事务必须使数据库从一个一致性状态变换为另一个一致性状态
3、隔离性,一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰
4、持久性,事务提交后是不可返回的

事务的创建
    隐式事务:事务没有明显的开启和结束标记
    比如insert update delete
    查看是否自动提交
        show variable like "autocommit%" ## ON 表示自动提交
        set autocommit = 0; 设置为不自动提交
    显示事务,事务具有明显的开启和结束标记
    前提必须先设置自动提交功能未禁用
    实例:
        set autocommit = 0;(只针对当前事务有效) -->> 开启事务
        start transaction;##可选的
        select insert update delete
        commit:提交事务
        rollback;事务回滚
        savepoint;设置保存点
            delete from column where id = "**"
            savepoint a
            delete from column where id ="***"
            rollback to a
            ##会将第一条删除

如果没用采用必要的隔离机制,回导致的并发问题

事务的并发问题
1、脏读:对于两个事务T1,T2,T1读取了已经被T2更新的但是还没有被提交的字段,之后如T2回滚,T1读取的内容就是临时且无效的
2、不可重复读:对于两个事务T1,T2,T1读取一个字段,然后T2更新了该字段,之后 ,T1再次读取同一字段,值就不同了
3、幻读:对于两个事务T1,T2,T1从一个表中读取一个字段,然后T2在该表中插入一些新的行,之后,如果T1再是读取同一表,就会多出几行


小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。
    解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

所有的级别
1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决
2)read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的
3)repeatable read:重读读取:可以解决脏读 和 不可重复读 ---mysql默认的
4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读---相当于锁表

事务隔离级别	                脏读	不可重复读	幻读
读未提交(read-uncommitted)	是	        是	     是
不可重复读(read-committed)	否	        是	     是
可重复读(repeatable-read)	    否	        否	     是
串行化(serializable)	        否	        否	     否


解决以上问题就涉及事务隔离级别
    Oracle支持两种事务隔离级别:read commited、serializable,默认的为read commited
    mysql支持四种事务隔离级别,默认的事务隔离级别为repeatable read
        还有
    查看数据库隔离级别:select @@tx_isolation(8.0以前)|SELECT @@transaction_isolation;(8.0级8.0以后)

    修改事务隔离级别:
        set session transaction isolation level read uncommitted| read committed |repeatable read |serializable
索引:

查看索引
    show index from table_name


##视图,支持mysql5.1及5.1以上的版本

    视图,可理解为一张虚拟表,视图是临时表

    视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。
    当对通过视图看到的数据进行修改时,相应的基本表中的数据也要发生变化;同时,若基本表的数据发生变化,那么这种变化也自动地反映到视图中。

    create view v1
    as
    select column1 ,column2
    from table1
    inner join table2
    on table.id = table2.table1_name.id
##创建视图

create view 视图名
as
查询语句


##视图的修改
1、
create or replace view 视图名
as
查询语句

2、
alter view 视图名
as
查询语句

#删除视图
    drop view 视图名,视图名,...;

#查看视图
select * from 视图名;

##视图中数据插入
    与表的插入一致  insert into view values

##修改
    update view set column1 = "**" where id = "**"

##删除
    delete from view where id ="**"

注意:
    对视图进行增删改会影响原表中的数据,视图不占用物理数据存储空间(只保存sql逻辑)

##存在以下情况视图不可以更新
    1、包含以下关键字的sql语句:聚合函数(group by)、去重(distinct)、having、union、union all
    2、常量视图
    3、select中包含子查询
    4、from 一个不能更新的视图
    5、where子句的子查询引用了from子句的表

##delete 和 truncate在事务使用时的区别
1、truncate 不支持回滚
2、delete 删除后auto_increment的起始数字不会变为0,truncate会置为0



实例:
update beauty b
inner join boys bo
on b.boyfriend_id = bo.id
set b.phone = "114"
where bo.boyname = "jacks"

create table Book(
bid int primary key,
bname varchar(32) not null unique,
price float default 10,
btype int,
foreign key (btype) references to BookType(id)
)

create view myview
as
select b.name,t.type
from Book b
inner join
type t
on b.btype = t.id
where price >= 100


set autocommit = 0;
insert into Book(bid,bname,price,btype) values(1,"人性的弱点")
commit


##变量
    系统变量
        全局变量
            查看系统变量
                show global  variables

            回话变量
                show session variables
                作用域,仅仅针对当前会话(链接)有效
            加条件
                show variables like "%char%"
            查看指定的某个系统值
                select @@global | session .系统变量
            系统变量赋值
                1、set global | session 变量名 = 值
                2、set @@global | session.变量名 = 值

    自定义变量
        使用步骤:声明、赋值、使用
        用户变量
            作用于:针对于当前会话有效
            1、声明并初始化
                set @用户变量名 = 值
                set @ 用户变量名 := 值
                select @ 用户变量名 := 值
            2、赋值(更新用户变量)
                方式一
                set @用户变量名 = 值
                set @ 用户变量名 := 值
                select @ 用户变量名 := 值

                方式二:
                    select 字段 into  @变量名
                    from 表
                    将字段值赋值给用户变量

            3、查看
                  select @用户变量
        局部变量
            作用域:仅仅在定义它的begin end中有效
             1、声明
                declare 变量名 类型
                declare 变量名 类型 default 值
             2、赋值
                方式一:
                    set 局部变量名 = 值
                    set 局部变量名 := 值
                    select @局部变量名 := 值
                方式二:
                    select 字段 into 局部变量名
                    from 表;
             3、查看
                select 局部变量名


##存储过程和函数
    类似方法

    存储过程:一组预先编译好的sql语句的集合
        创建:
            create procedure 存储过程名(参数列表)
            begin
                存储过程体(一组合法的sql语句)

             end
        注意:
            1、参数列表包括三部分
                参数模式 参数名 参数类型
                举例:
                in stuname varchar(20)

                参数模式:
                    IN 该参数可以作为传入参数
                    OUT 该参数可以作为返回值
                    INOUT 该参数既可以作为传入参数又可以作为返回参数

            2、如果存储过程体只有一句语句,begin end可以省略
                存储过程体中的每一条sql语句的结尾要求必须加分号
                存储过程的结尾可以使用 delimiter 重新设定
                   delimiter 结束标记 delimiter $
    调用:
        call 存储过程名(形式参数)$

    实例:
        ##无参数
        delimiter $
        create procedure myp1()
        begin
            insert into admin (username,password)
            values ("rose",1234456),("rose1",1234456)
        end $

        call myp1()$

        ##in
        delimiter $
        create procedure myp2(in beautyname varchar(20))
        begin
            select bo.*
            from boys bo
            right join beauty b
            on bo.id = b.boyfriend_id
            where b.name = beautyname;
        end $

        call myp2("rose")$

        delimiter $
        create procedure myp2(in username varchar(20),in password varchar(20))
        begin
            declare result varchar(20) default "";
            select count(*) into result
            from admin
            where admin.username = username
            and admin.password = password
            select if(result,"登录成功","登录失败")
        end $

        call myp2("rose")$


       ##out
       delimiter $
       create procedure myp5 (in beautyname varchar(20),out boyname varchar(20))
       begin
            select bo.boyname
            from boys bo
            inner join beauty b on bo.id = b.boyfriend_id
            where b.name = beautyname
       end $

       delimiter $
       create procedure myp6 (in beautyname varchar(20),out boyname varchar(20),out userCP int)
       begin
            select bo.boy,bo.userCP into boyname,userCP
            from boys bo
            inner join beauty b on bo.id = b.boyfriend_id
            where b.name = beautyname;
       end $
    ##inout
        delimiter $
        create procedure myp7(inout a int ,inout b int)
        begin
           set a= a*2;
           set b = b*2;
        end $
    删除存储过程
        drop procedure 存储过程名

##函数
    函数,有且只有一个返回值
    ##创建
    语法:
        create func 函数名(参数) return 返回类型
        begin
            函数体
        end

        注意:
            参数列表包含两部分
                参数名 参数类型
            函数体:肯定会有返回值(return),如果没有回保错
            使用 delimiter 设置语句的结束标记

    ##调用
    select 函数名(参数列表)

    create function myf1() return int
    begin
        declare c int default 0;
        select count(*) into c
        from employees;
        return c;
    end$

    create funtion myfun2(empname varchar(20), return double)
    begin
        set @sal = 0;
        select salary into @sal
        from employees
        where last_name = empname;
        return @sal;
    end$
    ##查看函数
        show create function 函数名

    ##删除函数
        drop function 函数名






其他补充
    set names gbk; ## 设置当前session的客户端显示编码

##流程控制结构
   1、顺序结构
   2、分支结构
        if函数
            select if(表达式1,表达式2,表达式3)如果表达式1成立,则返回表达式2的值否则返回表达式3的值

            if 条件1 then 语句1;##(只能放入begin end中)
            elseif 条件2 then 语句2;
            ...
            else 语句n
            end if

        case 等值判断或区间字段(语句只能放在begin end中)
            1、select *
            case 变量|表达式|字段
            when 要判断的case后的值 then 返回值1|(语句1;)
            when 要判断的case后的值 then 返回值2|(语句2;)
            ...
            else 要返回的值n|(语句n;)
            end case
        2、select *
            case
            when 要判断的条件 then 返回值1|(语句1;)
            when 要判断的条件 then 返回值2(语句2;)
            ...
            else 要返回的值n|(语句2;)
            end case



   3、循环结构
        while、loop、repeat

        循环控制
            iterate 类似continue
            leave 类似于break
        语法:
            【标签:】while 循环条件 do
                循环体
            end while【标签】

            【标签:】loop
                循环体
            end loop【标签】##实现简单的死循环

            repeat
            【标签:】repeat
                循环体
            until 循环结束条件
            end repeat【标签】##实现简单的死循环

    实例:
        delimiter $
        create procedure pro_while(in insertcount int)
        begin
            declare i int default 1;
            A:while i <= insertcount do
                if i > 20
                then leave A
                end if;
                insert into tablename(column1,column2,...)
                values ("admin"+i,password,...);
                set i = i+1
            end while A;
        end$

##经典实例
    drop table if exists stringcontent;
create table stringcontent(
    id int primary key auto_increment,
    content varchar(20)
)charset = utf8

create procedure test_randstr_insert(in insertcount int)
begin
    declare i int default 1;
    declare startindex int default 1;
    declare len int default 1;
    declare str varchar(20) default "dfghjklrubnmghjksdbnmghjkl";
    while i <= insertcount do
        set startindex = floor(rand()*26+1);
        set len = floor(rand()*20+1);
        insert into stringcontent(content) values (substr(str,startindex,len));
        set i = i+1;
    end while;
end


mysql查看存储过程函数
查询数据库中的存储过程和函数

       select `name` from mysql.proc where db = 'xx' and `type` = 'PROCEDURE'   //存储过程
       select `name` from mysql.proc where db = 'xx' and `type` = 'FUNCTION'   //函数

       show procedure status; //存储过程
       show function status;     //函数

查看存储过程或函数的创建代码

  show create procedure proc_name;
  show create function func_name;

查看视图
  SELECT * from information_schema.VIEWS   //视图
  SELECT * from information_schema.TABLES   //表

查看触发器
  SHOW TRIGGERS [FROM db_name] [LIKE expr]
  SELECT * FROM triggers T WHERE trigger_name=”mytrigger” \G


Mysql创建、删除用户
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束):

1.新建用户

登录MYSQL:
  @>mysql -u root -p

  @>密码

创建用户:
  mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234"));

  这样就创建了一个名为:test 密码为:1234 的用户。

  注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。

然后登录一下:
  mysql>exit;

  @>mysql -u test -p

  @>输入密码

  mysql>登录成功

2.为用户授权

  授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 

登录MYSQL(有ROOT权限),这里以ROOT身份登录:
  @>mysql -u root -p

  @>密码

首先为用户创建一个数据库(testDB):
  mysql>create database testDB;

授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限):
   mysql>grant all privileges on testDB.* to test@localhost identified by '1234';

   mysql>flush privileges;//刷新系统权限表

  格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 

如果想指定部分权限给一用户,可以这样来写:
  mysql>grant select,update on testDB.* to test@localhost identified by '1234';

  mysql>flush privileges; //刷新系统权限表

授权test用户拥有所有数据库的某些权限:   
  mysql>grant select,delete,update,create,drop on *.* to test@"%" identified by "1234";

     //test用户对所有数据库都有select,delete,update,create,drop 权限。

  //@"%" 表示对所有非本地主机授权,不包括localhost。(localhost地址设为127.0.0.1,如果设为真实的本地地址,不知道是否可以,没有验证。)

//对localhost授权:加上一句grant all privileges on testDB.* to test@localhost identified by '1234';即可。

3.删除用户

 @>mysql -u root -p

 @>密码

 mysql>Delete FROM user Where User='test' and Host='localhost';

 mysql>flush privileges;

 mysql>drop database testDB; //删除用户的数据库

删除账户及权限:>drop user 用户名@'%';

        >drop user 用户名@ localhost; 

4.修改指定用户密码

  @>mysql -u root -p

  @>密码

  mysql>update mysql.user set password=password('新密码') where User="test" and Host="localhost";

  mysql>flush privileges;

本文较为详细的介绍了mysql的基本使用语法,希望能帮助大家复习

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值