MySQL必知必会——语句总结

来自《Mysql必知必会》总结与“Mysql官网”总结

Mysql使用:
图形界面
C/S模式使用Mysql:
    连接Mysql服务器:
        mysql -h hostname/host_IP   -p port             -u username -p 
               指定主机             指定端口,默认3306    登录的用户   输入密码
    退出:exit
————————————————————————————————————————————————————————————————————————————————————


数据库
show databases;
show table status from db_name \G
create database test;
use test;
drop database test;
-- create schema education authorization John;
-- drop schema education cascade/restrict;

show engines;
show variables like 'have_%';


————————————————————————————————————————————————————————————————————————————————————


表
show tables;
create table students;
create table students(
	id not null auto_increment,
	class_id int,
	average double not null,
	primary key(id),
	check (id between 10 and 20)
);
create table students select * from classes where id =1; 嵌套,复制表
alter table s add address carchar(30);	增加列
alter table s add primaty key(SC);		增加主键
alter table students change column origin_name new_name;
alter table s drop primaty key(SC);
alter table students drop column_name;
drop table students;
exit;


————————————————————————————————————————————————————————————————————————————————————


索引		非显示类型,查询时自动发挥作用
create unique/clustered index  s on studnets(id);
drop index s;

————————————————————————————————————————————————————————————————————————————————————

触发器
创建触发器:
create trigger trigger_name
    before/after insert/delete/update
        on table_name for each row
            insert into table_t2 values(1,"123");

例子:多操作触发器
    create trigger tri_d
        after insert
            on t_dept for each row
                begin
                    insert into t_diary2 values(NULL,"123");
                    insert into t_diary3 values(NULL,"123");
                end

查看触发器:show triggers;
    或者查看系统表:
            use information_schema;
            select * from triggers;

删除触发器:drop trigger trigger_name;

注:对一张表操作后,触发器只能对本表update.insert\delete\create只能对其他表,否则会造成循环触发。

————————————————————————————————————————————————————————————————————————————————————



视图(虚表) 
create view s(sn,sd,sa,g) 
as select * from students where sd='cs' 	创建全计算机系学生视图
with check option;
drop view s;
show tables;
alter view s as select name from students;
select * from s; 视图查询,最终仍转化为对基本表的查询
//来源于多个基本表,不可添加删除数据。
//来源于单个表,添加删除直接影响基本表
insert into s values(...);
delete fron s where name="asd";
update s set price=3.5 where name="asd";


————————————————————————————————————————————————————————————————————————————————————

查询:

1)单表查询:
    select id,name from student;
    select * from student where score>=60;
        //条件语句:四则运算,比较运算>/</=/!=,逻辑运算 and/or/xor/not/between
    select * from student where id in(1,3,5,7,9);
        //条件语句:is null , is not null , in , not in
    select name from student where name like'_a%';
        //like模糊查询,'_'表示一个字符,'%'表示任意个字符 , like 和 not like
    select * from students order by id asc/desc;
    select * from students order by id asc,age desc;
        //排序,多排序(按照先后顺序,前者排完后者排)
    select distinct name from student; 
        //筛选出无重复的
    select * from student limit 5; 
        //选择数量为5
    select * from student limit 0,5;
        //从第一条开始选择,选5条,第一个参数从0开始表示第一条
    统计函数:count() avg() sum() max() min()
        select max(age) from students;
    select salary*2 from employee;	//加减乘除四则运算
    select concat(name,'的年薪为:',salary*12) year_salary from employee;
    select * from students group by class_id;
        //按照id分类,每个分组随机选出一条显示,意义不大
    select group_concat(name) from student group by class;
        //按分组,把同组名字一块显示
    select name from student group by class,age;
        //按照班级分组,同班按照年龄分组
    select depno,avg(sal) average from employee group by depno having avg(sal)>2000;
        //group by 配合having条件
2)多表查询
    union:并,两个字段相同的表合并,再去重
        select * from t1
        union
        select * from t2;
    笛卡尔积:m*n
    连接:
        自然连接:筛选出两表间某字段名相同&&字段值相等
                select * from t1 natural join t2;
        内连接:
            内连接基本与自然连接相同,不同之处在于自然连接的是同名属性列的连接,而内连接则不要求两属性列同名,可以用using或on来指定某两列字段相同的连接条件。
                select f1,f2,f3 from t1 inner join t2 on t1.id=t1.id;
                select f1,f2 from test t1 inner join test t2 on t1.id=t2.id2;
                    //自连接
            不等连接:筛选出笛卡尔积中某两字段值不相等
                select f1,f2,f3 from t1 inner join t2 on t1.age>=t2.age;
        外连接:必须要用using或者on
            左外连接:相同属性名字段值右表等于左表或者右表中为null
                t1 left join t2 on...
            右外连接:相同属性名字段值左表等于右表或者左表中为null
                t1 right join t2 on...
            全外连接:相同属性名字段值两表相等或者左表/右表为null
                full outer join
        交叉连接:
    嵌套查询(子查询):any / all / exists / not exists
        select * from any (select * from t);

————————————————————————————————————————————————————————————————————————————————————

运算符:

+ - * / %
> >= = != < <=
between .. and ..
is null
in 
    where id in (1,2,3);
like
    where name like "xiao%" ;
regexp
    正则表达式
and or not xor
& | ~ ^ << >> 
    位运算

————————————————————————————————————————————————————————————————————————————————————

常用函数:

    字符串函数:
        concat(s1,s2,s3,..,sn) //连接字符串
        concat_ws('-',s1,s2,...,sn)    //用'-'连接字符串
        insert(str,x,y,str2)   //str第x位置长为y的子串替换为str2,字符串从1开始
        lower(str)             //str全变为小写
        upper(str)             //str全变为大写
        left(str,x)            //str最左边x个字符
        right(str,x)           //str最右边x个字符
        lpad(str,n,str2)       //用str2在str左边扩充,直到长度为n
        rpad(str,n,str2)       //用str2在str右边扩充,直到长度为n
        ltrim(str)             //去掉左边空格
        rtrim(str)             //去掉右边空格
        trim(str)              //去掉首尾空格
        repeat(str,x)          //str重复x次
        replace(str,a,b)       //str中字符串a全部替换为字符串b
        strcmp(str1,str2)      //比较str1 str2,s1>s2返回1,s1=s2返回0,s1<s2返回-1
        substring(str,x,y)     //返回str从x开始长度为y的字符串,字符串从1开始
        length(str)            //返回str长度
        char_length(str)       //返回str所占字节数,中文一个字占两个字节
        locate(str1,str)       //返回str1在str中的开始位置

    数值函数:
        abs(x)
        ceil(x)         //向上取整
        floor(x)        //向下取整
        mod(x,y)        //返回x%y
        rand()          //返回0~1内的随机数
        round(x,y)      //返回x四舍五入后有y个小数
        truncate(x,y)   //返回x截断为y位小数
            truncate(903.53567,2)  ---> 903.53
            truncate(903.53567,-1) ---> 900

    时间/日期函数
        curdate()        //返回年月日
        curtime()        //返回小时分钟秒
        now()            //返回年月日时分秒
        week(now())      //返回第几周
        year(now()) hour(now()) minute(now()) monthname(now()) 
        weekday(now())   //返回0~6 周一到周日
        adddate(now(),interval 3 year) //3年后的日期
            year , month , day , hour , minute , second
        subdate(now(),interval '1,2' day_hour) //1天2小时前的日期
        datediff(now(),'2012-12-01') //相隔天数

    系统类函数:
        version()
        database()
        user()
        last_insert_id()

————————————————————————————————————————————————————————————————————————————————————


数据更新:

插入:
    insert into students (class_id,name) values(2,'mike'),(3,'jack'); //可以指定字段插入
    插入查询结果:insert 和 select 嵌套
更新:
    update students set name='mike',score=66 where id=1;
    update students set score=score+10 where score<60;
删除:
    delete from students where id=1 or score<60;
    truncate table; //删除表所有行,成为空表




————————————————————————————————————————————————————————————————————————————————————


数据控制
grant select/insert/update/delete/alter/create index/create table/all privileges on table s to user;
grant all privileges on s,sc to user2;

revoke all privileges/select/... on tale s from user/public;


————————————————————————————————————————————————————————————————————————————————————


事务数据库:innoDB引擎支持
    begin;//开始
    update test set name="a" where id=1;
    rollback;//回滚,撤销上一条更新
    commit;//结束
    
    隔离级别:
    set transaction isolation level read uncommitted; 
        //未提交可读,事务A更新还未提交时,事务B即可读
    set transaction isolation level read committed;
        //提交读,事务A更新并提交后,事务B可读,但同一事务B中读的前后不一样,即不可重复读。
    set transaction isolation level repeatable read;
        //可重复读,默认事务隔离级别
        //InnoDB含有隐藏值,每行的创建/过期时间、存储时的版本号
        //每有新事务版本号+1,每个查询根据版本号查询
    set transaction isolation level serializable;
        //可串行化,不推荐

    begin;
    update students set name='bob' where id=1;
    rollback;		脏读:其他mysql服务器易产生脏数据

    set transaction isolation level read committed;
    begin;
    update students set name='bob' where id=1;
    commit;			不可重复读:同一事务中读的两次不同

    set transaction isolation level repeatable read;
    幻读:原本为空一个服务器插入了一条,而另一服务器查询不到(状态等同初始时),但可以更新此条。
    alter table, truncate table, drop table等部分DDL语言会隐式提交事务

    InnoDB锁机制:
        共享锁(对行/元组加锁):多个事务可获得
        排他锁(对行/元组枷锁):仅一个事务可获得,对数据进行操作
        意向锁(对表):分为意向共享锁、意向排他锁
    InnoDB锁为间隙锁


————————————————————————————————————————————————————————————————————————————————————

用户操作

    mysql -u root -ppassword  
        //登录root用户
    create user 'wesley'@'localhost' identified by '123'  
        //创建名字为welsey,密码为123的用户
    grant select,insert,delete on database.tablename to 'wesley'@'localhost' identified by '123';
    grant create,drop on *.* to 'test'@'localhost' identified by '12345';
    mysqladmin -u root -p old_password "new_password"
        //修改root密码
    set password for 'wesley'@'localhost'=password("123456";
        //root下修改普通用户密码
    drop user 'wesley'@'localhost';
    


————————————————————————————————————————————————————————————————————————————————————

日志文件:
    二进制日志:二进制形式记录数据库各种操作,不记录查询语句
        启动
            设置配置文件mysql.ini,默认每次启动服务器产生一个filename.number日志文件,
            每次启动number自动增加,产生新日志文件
            [mysqld]
            log-bin
        mysqlbinlog filename.number //查看二进制日志文件
        set sql_log_bin=0    //暂停日志功能
        set sql_log_bin=1    //重启日志功能
        reset master;    //删除所有日志文件
        purge master logs to filename.number;    //删除编号小于number的日志文件
        purge master logs before 'yyyy-mm-dd hh:MM:ss'    //删除指定时间之前的日志文件

    错误日志:记录错误
        my.ini配置文件,默认保存到数据文件中,localhost.error文件
            [musqld]
            error-bin
        删除日志
            mysqladmin -u root -p flush-logs

    通用查询日志:记录mysql服务器启动关闭、客户端连接、更新、查询记录
    慢查询日志:记录执行时间超过指定时间的操作
        启动:自动生成filename-slow.log
            [mysqld]
            log-slow-queries
            long_query_time=n
        分析:
            mysqldumpslow.pl -s at -t 5
            //mysqldumpslow.pl分析慢查询日志,-s排序参数,at平均查询时间,-t 符合条件的行数
        删除日志
            mysqladmin -u root -p flush-logs



————————————————————————————————————————————————————————————————————————————————————

数据备份:
    mysqldump -u username -p dbname table1 table2 > D:/backup.sql
    //把username用户的dbname数据库的表1表2备份到backup.sql ,无表参数就备份整个数据库
    mysqldump -u username -p --databases db1 db2 >backup.sql
    //备份多个数据库

数据还原:
    mysqldump -u username -p dbname < backup.sql
    //还原指定数据库,若不指定dbname则还原所有数据库
    
导出到文本文件:
    select * from table into outfile 'D:/file_name.txt'; //不指定格式
    select * from table into outfile 'D:/file_name.txt'    
    fields terminated by '\、'
    optionally enclosed by '\"';
    lines starting by '\>'
    terminated by '\n';
    //指定格式导出到文本,
      字段用、分开,每行用\n分开,每行开头> , 每个值用""括起来

文本导入:
    load data infile 'D:/file_name.txt'
    fields terminated by '\、'
    optionally enclosed by '\"';
    lines starting by '\>'
    terminated by '\n';


————————————————————————————————————————————————————————————————————————————————————

同其他语言结合
JDBC















 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值