您的位置:首页 > 数据库 > MySQL

mysql基本语法及使用

2016-11-09 00:00 351 查看
环境:centos6.8

软件:mysaql 5.6.20

1.mysql交互式基本指令
;mysql交互式默认的语句结束符,
如果没有结束会出现‘->’这个符号来告知你语句没有结束
show databases;查看有那些数据库存在
use db_name;选择使用那个数据库
show tables;查看db_name下的表有那些
?,\?,help:查看帮助信息
\q,quit推出mysql交换环境
\c;提前结束语句,如果前面有分号的将提前结束失败
\d,设置语句结束符
\G,显示方式设置
\.,source 执行sql脚本
\s,查看mysql系统相关信息

存储引擎:
非事务:
MyISAM
对于读性能有要求,中小型企业使用
事务:
innodb
默认所有表共享一个表空间
innodb_file_per_table| ON 最好把新建一个表就分配一个表空间的功能打开
事务提交:
commit
事务回滚:
rollback
具体选择需要根据业务情况决定
存储引擎是针对于表来说的

mysql> show variables like '%eng%';查看系统默认存储引擎
mysql> show variables like '%innodb%';查看innodb参数
mysql> show table status like 'user'\G;查看表的属性
mysql> desc user;查看表结构
mysql> set global innodb_file_per_table=1 设置变量的开启或关闭情况

DBA:
开发DBA:
数据库设计,sql语句,存储过程,触发器
管理DBA:
安装,升级,备份,恢复,用户管理,权限管理,监控,性能分析,基准测试

数据类型:
数值型:
int
decimal
float,double,real
字符型:
char
varchar
text
blob
时间类型:
date
time
datetime
字符集:
utf8国际标准,对于有国外信息的存储的时候可以使用
gbk中国标准

mysql> show character set;查看mysql支持的字符集和排序规则
mysql> show collation;查看排序规则

查看当前选择了什么数据库
mysql> select database();
+------------+
| database() |
+------------+
| uplooking |
+------------+
1 row in set (0.00 sec)
查看最后一条insert语句的id
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)

SQL:
DML:数据修改语句
update
insert
delete
select
DDL:数据定义语句
create:
创建数据库
CREATE DATABASE db_name;
CREATE DATABASE db_name CHARACTER SET [=] charset_name COLLATE [=] collation_name;
创建表
CREATE TABLE up01(id int not null primary key,name varchar(20));创建表并自定义表的字段(结构)
CREATE TABLE up02 select * from up01;创建表,并把up01的数据也一并复制到新表当中,但是表的属性复制可能会有遗漏(key键遗漏);
CREATE TABLE up03 like up01;创建新表,并把up01的表的属性也一并复制过来,但是数据不会进行复制
engine = Myisam|innodb 创建表的时候可以选择存储引擎
auto_increment创建字段的时候可以使用自动增长规则(字段必须primary key(非空唯一字段))
SHOW CREATE DATABASE db_name打印创建数据库的指令
SHOW CREATE TABLE table_name 打印创建表的指令
alter:修改表属性
alter database db_name character set gbk collate gbk_chinese_ci;修改数据库的字符集(gbk)和排序规则(gbk_chinese_ci)
alter table up06 add(age int);给表添加一个字段
alter table up06 change age age2 varchar(20);修改表字段的名字和属性
alter table up06 modify age int(16);修改表字段的属性
alter table up06 drop age;删除表的字段
alter table up06 rename up111;给表重命名
drop:删除
drop database db_name删除数据库
drop table table_name删除表

2.mysql安装总结:
源码
需要依赖cmake的指令
cmake . 编译参数
make
make install
cd $MYSQL_BASE
scripts/mysql_install_db --user=mysql --datadir=path
cp support-files/my-default.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld56
chkconfig --add mysqld56
chkconfig --list mysqld56
service mysqld56 start

rpm
下载rpm包直接使用rpm进行安装
注意:rpm包安装的话会默认生成一个root用户的随机密码,在~/.mysql_secret文件中

修改root用户密码
源码:mysqladmin -uroot password 'new_pass'
mysql交互式中:update user set Password=password('new_pass') where User='root'
rpm:由于默认有一个随机密码所以使用mysqladmin的时候需要加上密码
mysqladmin -uroot -pxxxxxx password 'new_pass'
他无法在修改密码之前在mysql交互环境中使用update指令
mysql存储引擎:
Myisam:非事务
innodb:事务

mysql客户端链接指令
mysql
mysql -uroot -p
mysql -uroot -pxxxx
mysql -uroot -pxxxxx -h host
mysql -uroot -pxxxxx -h host -D db_name -P port
设置了用户的密码但是在使用mysql链接的时候又不想输入密码
在家目录下创建.my.cnf的文件
vim ~/.my.cnf
[client]
user=root
password=123456
host=127.0.0.1

mysql交互基本指令
\?,?,help获取帮助
\c提前结束语句
\d设置语句结束符
\G对查询结果进行显示设置
\s查看mysql服务器状态信息
\q推出mysql交互环境
\#,rehash可以补全指令,但是不推荐使用,消耗不必要的资源
\!执行shell命令
show databases;查看数据库
show tables;查看表
show variables like '%eng%' 查看存储引擎
show variables like '%innodb%'查看innodb参数
show character set查看mysql支持的字符集
show collation查看mysql支持的排序规则的

sql DDL语句
create database db_name #创建数据库
create database db_name character set utf8 collate utf8_generic_ci #创建数据库并设置字符集为utf8 设置排序规则为utf8_generic_ci 。

create table tb_name(col_name col_type col_CONSTRAINT) #创建表并设置相关条件
create table test(id int not null unique primary key auto_increment,name varchar(20)) 创建Test表并设置表格的id号 数值型为int,非空的 键值为key 内性为varchar(20)如下图:



create table test1(id int,name varchar(20)) engine Myisam #创建表设置参数并选择引擎为:Myisam

create table tb_name2 select * from tb_name1 #创建tb_name2 像tb_name1 那样,注意复制时表属性会有遗失。
create table tb_name3 like tb_name1#创建tb_name2 像tb_name1 那样 说白了就是复制tb_name1表格属性但是tb_name1内的数据是不会复制过来的。

create index index_name on table_name(col) #创建索引

alter database tb_name character set gbk collate gbk_chinese_ci #修改表的字符集和排序规则。
alter table tb_name add col_name col_type #给表添加一个字段
alter table tb_name change old_col_name new_col_name col_type #修改表字段的名字和属性
alter table tb_name modify col_name col_type #修改表字段的属性
alter table tb_name rename new_tb_name #给表重命名
alter table tb_name drop col_name #删除表的字段

drop database db_name # 删除数据库
drop table tb_name #删除表

变量:
全局变量show global variables
会话变量show [session] variables

DML:
select
select * from tb_emp;查询表中所有的字段和记录
select empno,ename,deptno from tb_emp;查询表中特定字段的所有记录
select empno,ename,deptno from tb_emp limit 3显示前三条查询记录
select empno,ename,deptno from tb_emp limit 2,3;跳到第二条记录之后,然后显示三条
select distinct(job) from tb_emp;去重
select * from tb_emp where sal >= 3000;按照条件查询记录
where col (<|>|<=|>=|=|!=)

select * from tb_emp where sal >= 3000 or deptno=30; #or: 满足一个条件
where (and|or|not)

select * from tb_emp where sal between 2000 and 3000; #and:满足2个条件才行
where between.....and....

select ename from tb_emp where ename like '%a%';表示包含至少一个字母是a的
select ename from tb_emp where ename like 'a_';表示两个长度以a打头
where col_name like (%|_)

select ename from tb_emp where ename rlike '.*a.*';
也支持正则

select ename from tb_emp where ename in ('eddy','peter'); 只搜索'eddy','peter'。
select ename from tb_emp where ename not in ('eddy','peter');
where col_name (in|not in) (内容范围)

where col_name is null|is not null

排序
select * from tb_emp order by empno asc;升序mysql默认的
select * from tb_emp order by empno desc;降序

聚合
select sal from tb_emp group by sal;
过滤
select sal from tb_emp group by sal having sal > 2000;
使用having对聚合之后记录进行过滤
函数:
avg(),distinct(),sum(),max(),min(),abs(),count()
lower(),upper(),length()

连接:
交叉连接,也叫笛卡尔积
连接的作用:更丰富的显示查询记录
自然连接,内连接
查询相同字段的具有相同值记录
select * from tb_name1,tb_name2 where tb_name1.deptno = tb_name2.deptno

外连接:
左外连接
left...join...on
select e.ename,d.dname from tb_emp as e left join tb_dept as d on e.deptno=d.deptno;
右外连接
right..join...on
select e.ename,d.dname from tb_emp as e right join tb_dept as d on e.deptno=d.deptno;
左和右:写在前面的表就是左表,写在后面的就是右表
左外连接:就是以左表为标准,只要左表存在的记录都要显示出来,右表类似

子查询:
select * from tb_emp where sal = (select sal from tb_emp sal=1000)
select * from tb_emp where sal in (select sal from tb_emp sal >1000)

联合查询:
select clo1,col2 from tb_name1 union select col1,col2 from tb_name2
注意:联合的两边字段数要一样,最好具有相同意义

insert
insert into up01(id,name) values (1,'name');
insert into up01 values (2,'name');
insert into up01(name) values ('name');
insert into up01 set id=4,name='name';
insert into up01 select empno,ename from tb_emp;

insert into up select * from up01

有大量数据查询的时候要记住加上索引(字段值唯一,最好选择有数值)
解析sql语句
explain(SQL语句)

delete
delete from tb_emp;删除表中的所有记录
delete from tb_emp where condition

truncate
truncate table_name清空整张表,并把相应计数器也清空

update
update up01 set name='linux1';更新表中字段为name的值都为linux1
update up01 set name='linux1' where id=1;更新表中字段为name的且id=1的记录为linux1

注意:以上delete,update,truncate使用的时候一定要注意加上限制条件,除非你明确知道这个表所全表清空

视图:
create view
create view view_name as select SQL
用来做select语句的缓存表也叫虚表
drop view view_name
drop view sct

隔离:
并发控制
多个回话去修改数据库中的数据的时候,那一个回话是最终生效的这需要数据库提供并发解决方案
从行为上分析:
读锁:
共享锁
写锁:
独占锁|排他锁
从颗粒度上分析:
表级锁:mysql当中默认的锁机制(Myisam)
行级锁:需要存储引擎支持(innodb)

存储引擎:
mysql默认存储引擎:myisam
不支持事务
表锁
innodb:
支持事务
行锁

手动锁表
lock tables tb_name lock_type(read|write)
手动解锁
unlock tables 会解除数据库中所有锁住的表

隔离级别:
RDBMS:都应支持事务型,必须要满足acid要求测试
ACID:
原子性:事务所引起的数据库操作要么全部执行,要么全部都不执行
一致性:总的和一样A:2000 B:3000====>b-1000-->a a+b=5000
隔离性:靠数据库本身的事务调度来实现
持久性:服务器出现故障当机等情况放生,重启服务器之后,数据库中的数据也不会丢失

事务日志:
重做日志:redo log
撤销日志:undo log
有一个事务正在做删除操作,其实实际存储的数据并没有被真实删除而只是在事务日志中标记了,当事务提交之后在进行实际数据的删除操作

隔离级别
1.read uncommitted读未提交
2.read committed 读提交
3.repeatable read 可重读 mysql默认的隔离级别
4.seriableizable 可串行
1--->4隔离级别逐次提高
级别越高性能越差
查看隔离级别:
show variables like '%iso%';
设置隔离级别:
set tx_isolation='read-uncommitted'
set tx_isolation='read-committed'
set tx_isolation='repeatable-read'
set tx_isolation='serializable'

事务开始:
start transaction
SQL
事务结束 commit 提交事务
rollback 回滚事务

savepoint #在实际工作中在对数据库进行操作时候必须建立一个食物开始这样的好处是给每一条记录创建一个savepoint (保存点) 防止在操作中出现错误,可以利用rollback回滚到某一个事物存点,防止例误操作。
步骤:1。 start transaction;
2. savepoint a1
insert1 ....

savepoint a2
insert2 ....
savepoint a3
rollback to a2 回滚到inser1后的数据
rollback to a1 回滚到未插入数据的时候
autocommit(自动提交)
show variables like '%autocommit%'
set autocommit=0|OFF

建议实际工作当中关闭自动提交功能
明确指明开始事务

创建用户和授权
参照官网学习: http://dev.mysql.com/doc/refman/5.6/en/grant.html create user eddy@'%' identified by '123456'
flush privileges手动刷新授权表
创建用户之后自带USEAGE权限只能连接不能创建库或表等其他操作

grant all privileges on db.* to user@'%'
授权给一个用户所有的权限

grant execute on function db.abc@ user@'%'
授权给一个用户在db库中abc这个函数拥有执行权限

show grants for user@'host'
查看用户具体授权信息

grant insert,select on db.* to eddy@'%'
授权db下所有表的插入,查询权限给一个用户
gratn alter on db.* to eddy@'%'
授权db下所有表的修改表属性权限给一个用户
grant update(age) on db.abc to edd@'%'
授权db下abc表的age字段的更新权限给一个用户

grant super on *.* to eddy@'%'
授权CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL,

with grant option可以给授权人授予权限
一般不是用,也不建议使用特别生产环境

使用技巧
创建用户和授权在一条语句中搞定
grant all on *.* to eddy@'%' identified by '123456';

dorp user username@'%'

重命名用户和主机
rename user old new
rename user up02@'%' to up03@'127.0.0.1';

回收权限
revoke select on db.* from user@'%'
revoke update(age) on up01.up02 from up03@'127.0.0.1';
revoke all privileges on *.* from up03@'127.0.0.1';

忘记root密码解决方法:

源码安装时可以在/usr/local/mysql/my.cnf或者 /etc/my.cnf增加如下内容:

--skip-grant-tables
--skip-networking

传哦能

注意:授权之后最好让会话重新链接一次以便让权限生效

图形化工具:
navicat for mysql
mysql-workbench
主要有SQL语法高亮,关键字补全,语法帮助,快速备份,快速恢复。。。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: