mysql 用法合集
条目很多,主要是提供模板以及部分注意点,并无具体例子,作为学习笔记。
create database databaseName;
新建库create user userName@host identified by password;
创建用户并指定密码限制登陆ipgrant xxx on databaseName.xxx to userName@host;
赋予某个用户某个库的某些权限Revoke xxx on dbName.xxx from user;
撤销权限show databases;
展示该用户下所有的库select database();
查询当前使用的库select user();
查询当前用户show tables
展示该库所有的表desc tableName/show columns from tableName;
展示表的字段结构Rename user userName to userName2;
用户重命名Drop user userName;
删除用户Set password for userName = password(xxxx)
Set password = password(xxx)
//默认修改当前用户
查询语句
基础模板:
select xxx from xxx where xxx group by xxx having xxx order by xxx limit xx;
去重查询:
distinct
:select distinct xxx from xxx
where过滤查询
包含等于(=),不等于(!=,<>),大于小于(>,<),大于等于(>=),小于等于(<=),between(包头包尾)等条件操作符,IS NULL(空值检查),and/or/not 关键字。还有就是like与通配符,正则的使用等。
其中条件操作符就是对某个列的值做对应的比较where columnName 条件操作符 value
,注意下between包头包尾(between x and y
)即可。其他的主要讲下注意点。
NULL 指的是不包含值而不是零值。TIP!在涉及到不匹配的时候需要注意。
ex:select xxx from xxx where columnName != y
这里columnName如果是null,他是不会检索返回的。我测试的时候是使用的mysql5.7.10 社区版
IN 指的是某列的值在一个集合里,类似于or的功能,但是执行效率高一点:where column in (x,y,z)
AND 与操作,OR或操作。用于多个条件的拼接。AND优先级高于OR,为了防止歧义,可以使用括号
NOT 非操作。否定后面的操作。
like 配合通配符使用:where xxx like "%xx
。%
表示n个字符(n >= 0)where xxx like "_xx
。_
表示1个字符
不过不推荐使用,如果使用的话推荐放在检索条件的最后。原因是效率问题
这里where后面还可以跟正则搜索regexp
这里是不区分大小写的,如果需要对匹配的值注意大小写,使用binary:where columnName regexp binary 'A'
常规使用可以参考正则使用,举个简单例子
select * from spider_user where username regexp '^a[a-z\\-]*[0-9]+$'
这里匹配a开头中间包含(0或者多个)(小写字母或者-符号)并且数字结尾的值
限制查询:
limit
select xx from xxx limit index,nums
orselect xxx from xxx limit nums offset index
//mysql5开始支持
从index 开始查询nums条记录,index是从0开始的
分组查询:
Group by这时候的聚集函数(下面有讲)就是针对分组数据生效的.除了计算聚合函数外,select后的每一个都必须出现在group by 中:select vacation,count(*) as nums from spider_user where sex in('0','1') group by vacation having nums>=2 order by vacation
联结查询:
join(inner join),left join,right join
使用等值联结/内联结:select a.x,b.y from a,b where a.xxx = b.xxx
orselect a.x,...,b.y,... from a inner join b on a.aaa = b.bbb
左联结:select xxx,...yyyy from a left join b on a.username = b.username;
右联结:select xxx,...yyyy from a right join b on a.username = b.username;
通常什么联结哪边的表数据就是全的假设称为主表,另外一个没有数据的用null代替。对于on后面的过滤条件,如果条件不符合则null填充,主表例外。
组合查询:
Union/Union all:用于结果集的组合,后者不去重复
全文本搜索等需要数据引擎的支持。
函数
concat():拼接对象:select concat(username,'(',name,')') from user
//结果以username,name的值以username(name)
的形式显示
upper()
:转换为大写lower()
:转换为小写length()
:返回长度locate(substr,str)
:返回str中substring第一次出现的位置,位置是从1开始数的。ltrim()
:去掉左边的空格rtrim()
:去掉右边的空格trim()
:去掉两边的空格substring(target,pos,len)
:在target中从pos位置开始取len长度的子串。pos为负数代表从尾部倒数第几个开始。计算pos依旧是从1开始数位置left(target,len)
:代表从左边开始取len长度right(target,len)
:代表从右边开始取len长度
这里还有个比较好玩的:soundex(xxx)
代表发音:ex:select * from spider_user where soundex(name) = soundex('quite')
这里检索到了name为quiet的数据
部分聚集函数:AVG()
:求平均值MIN()
:求最小值MAX()
:求最大值SUM()
:求总和COUNT()
:求数量。这里同样需要注意null值是不计入的
其他还有部分例如时间处理函数,数学方面的比如Mod()取余数:Abs()
:绝对值Cos()
:余弦值Exp()
:返回一个数的指数值Mod(x,y)
:返回x处于y的余数Pi()
:返回圆周率Rand()
:返回随机数Sin()
:返回正弦值Sqrt()
:返回一个数的平方根Tan()
:返回正切AddDate()
:增加一个日期:adddate(order_date,interval 2 day)
order_date加两天返回CurDate()
:返回当前日期CurTime()
:返回当前时间Date()
:返回一个datetime的日期部分Time()
:返回一个datetime的时间部分Day()
:返回一个日期的天数部分DayOfWeek()
:返回一个日期对应的是周几Month()
:返回一个日期的月份Year()
:返回一个日期的年份
…
数据操作语句部分
insert into xxx(columnName[,columnName...])values(.....)[,(...)]
:插入数据update xxx set columnName = value where xxxxx
更新数据delete from xxxx where aaa = bbbb
删除数据
这里有个关于mysql安全模式的问题,在安全模式下是不能做一些敏感操作的,就比如说上面的delete后面不接where啥的。可以通过set sql_safe_updates = 0
(关闭)/set sql_safe_updates = 1
(开启)设置
数据定义语句部分
create可以创建表,视图,包括后面的存储过程等。
建表:
其中constraint_name可以是not null ,auto_increment等使用primary key创建主键。外键类似。
这里auto_increment是设定自增长(一张表只能一个,且必须是索引,比如给主键)。一般默认是1,可以通过SHOW VARIABLES LIKE 'AUTO_INC%';
查看,SET auto_increment_increment = 3
修改步长为3同样可以修改初始值,不过通过语句修改重启失效,推荐修改配置文件my.ini在服务端配置下([mysqld])写auto_increment_increment = 10
设置。
可以通过select last_insert_id()
获取自增值
创建视图:CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW [db_name.]view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
drop删除
drop table if exists tableName
视图一类的同理drop index index_name on tableName
//删除指定的索引
通过alter修改表结构
alter table tableName add columnName dataType[constraint_name]
//增加列alter table tableName modify columnName xxxx
//修改列alter table tableName drop column columnName
//删除列alter table tableName add index index_name(columnName list)
orrcreate index indexName on tableName(columnList)
//新增索引drop index indexName on tableName
oralter table tableName drop index indexName
//删除索引ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(columnList)
//新增主键或者可以通过modify的形式新增Alter table tableName add constraint 外键名字 foreign key (columnName) references tableName(columnName)
新增外键alter table tableName drop primary key
//删除主键alter talbe tableName drop foreign key key_name
//删除外键
重命名表
rename table tableNameOld to tableNameNew
清空表
truncate table tableName
事务
Transaction 事务//set autocommit = 0(1)是否自动提交
Commit 提交事务
Rollback 回滚//无法回退create and drop
Savepoint 保留点,可以创建多个保留点,rollback to savepointName ;回滚到指定保留点
Start transaction ;开始事务一旦rollback或者commit事务自动结束
存储过程
这里举一个例子来解释下.这是mysql必知必会中的一个例子
call ordertotalWithTax(20005,false,@total)
调用的时候变量一定要带@符号。select @total;
查询出结果。
游标
游标主要用在存储过程之中。declare ordernumbers cursor for select order_num from orders;
这里就是创建了名为ordernumbers的游标,他指向后面select的结果集open ordernumbers
打开close ordernumbers
关闭fetch ordernumbers to xx
将读取的一行数据给xx,游标指向下一条数据
这里对于declare有个队形,声明顺序满足局部变量,游标,句柄(handler)否则出错
触发器
Update ,delete,insert语句触发触发器(其规定同表同一类型的触发器只有一个也就是说最多六个3x2,且没有组合触发器,insert,update就得两个,不能合在一起写)
创建触发器:唯一的触发器名,关联的表,响应的操作,何时执行
Create trigger triggerName after(就是when: after/before) insert(操作类型:insert,update,delete) on tableName(关联的表) xxxx执行
Insert 触发器
在insert 触发器中可以引用一个名为new的虚拟表,访问被插入的行在before insert触发器中,new的值可以被更新,也就是修改插入的值.对于auto_increment.new在insert执行之前包含0,在insert之后包含新的自动生成值
Delete触发器可以引用一个old的虚拟表,访问被删除的行,但是是readonly
这里就是将删除的数据放到一个其他表里
update触发器可以引用一个old的虚拟表,访问被更新的值,new访问更新的值。old只读,new可以修改,也就是说before可以修改更新的值
这就是在更新前保证vend_state大写