概述
SQL(国际标准化,结构查询语言)
1. mysql结构
mysql=国际标准化+自定义
a. mysql逻辑结构:
mysqld(process+threads)-->库-->表-->记录(由行与列组成)
b. 物理结构:
mysql软件+mysql数据文件+配置文件
c. 整体结构:
物理+逻辑(实例)=mysql
数据库 --理解为磁盘上面的文件
实例 --运行中mysqld
d. mysql中是一个实例对应多个物理库
2. 关系型数据库
表与表发生关系,叫关系型
例如:
部门表(部门ID、部门名称)
雇员表(员工ID、员工姓名、部门ID)
3. mysql数据库对应的语言编码配置文件
相应数据库对应目录下面的db.opt 文件
如:
# cat /d1/db2/db.opt --库对应的语言编码的配置文件
default-character-set=utf8
default-collation=utf8_general_ci
4. mysql表对应的文件
例如:
# ls /d1/db03/t1* -l --表(myisam)在磁盘上的表现形式
-rw-rw---- 1 mysql mysql 8652 Mar 23 10:41 /d1/db03/t1.frm 表结构
-rw-rw---- 1 mysql mysql 0 Mar 23 10:41 /d1/db03/t1.MYD 表中的数据
-rw-rw---- 1 mysql mysql 1024 Mar 23 10:41 /d1/db03/t1.MYI 索引
5.刷新权限表flush和查看信息show
a. flush
mysql> flush privileges; --刷新权限表
b. show
6. mysql如何验证:
client(192.168.0.1)-->root@192.168.0.1-->mysqld(192.168.0.2)
1、先验证客户端的地址是否被允许登录192.168.0.2的mysqld
2、最后验证账号和密码
7. 数据类型
http://www.runoob.com/mysql/mysql-data-types.html
8. SQL的种类:
a. 数据定义语言:DDL create drop alter
1) create --创建库,表,用户
帮助信息:
mysql> ? create
库:
mysql> create database test01;
mysql> create database db2 default charset utf8;
# cat /d1/db2/db.opt --库对应的语言编码的配置文件
default-character-set=utf8
default-collation=utf8_general_ci
mysql>create database IF NOT EXISTS test02 default charset gbk;
mysql>show warnings;
mysql>show databases;
表:
mysql> use db03;
mysql> create table t1(id tinyint, name varchar(20), math tinyint, english tinyint);
# ls /d1/db03/t1* -l --表(使用myisam)在磁盘上的表现形式
-rw-rw---- 1 mysql mysql 8652 Mar 23 10:41 /d1/db03/t1.frm 表结构
-rw-rw---- 1 mysql mysql 0 Mar 23 10:41 /d1/db03/t1.MYD 表中的数据
-rw-rw---- 1 mysql mysql 1024 Mar 23 10:41 /d1/db03/t1.MYI 索引
mysql [db03]>show create table t1; --查看表是如何创建的
| t1 | CREATE TABLE `t1` (
`id` tinyint(4) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL,
`math` tinyint(4) DEFAULT NULL,
`english` tinyint(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 | --可以查出此使用何种存储引擎及语言编码
mysql> DESCRIBE t1; --查看表结构
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | tinyint(4) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| math | tinyint(4) | YES | | NULL | |
| english | tinyint(4) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.06 sec)
用户:
mysql> create user user01; --创建一个用户,密码为空
mysql> set password for user01=password('123'); --设置用户的密码
mysql> set password for user01=password('123'); --设置用户的密码
mysql> select user from mysql.user where user='user01'; --验证用户是否创建成功
+--------+
| user |
+--------+
| user01 |
+--------+
mysql> flush privileges; --刷新权限表
2) drop --删除库,表,用户
帮助信息:
mysql> ? drop
库:
mysql> drop database test1; --删除库
mysql> show databases; --验证库是否删除成功
表:
mysql> use db03
mysql> drop table t1; --删除表
mysql> show tables --验证表是否删除成功
用户
mysql> drop user user01; --删除用户
mysql> select user from mysql.user where user='user01'; --验证用户是否删除成功
3) alter --修改已经存在数据库对象(库/表/列)的属性,并不是其内部数据而是属性
帮助信息:
mysql> ? alter
库:
mysql> ALTER DATABASE DB1 DEFAULT CHARACTER SET latin1; --修改数据库语言编码
mysql> show create database DB1; --验证修改是否成功
表:
mysql> ALTER DATABASE DB1 DEFAULT CHARACTER SET latin1; --修改数据库语言编码
mysql> show create database DB1; --验证修改是否成功
b. 数据操作语言:DML insert delete update select
1) insert --插入数据
mysql> ? insert
插入单行记录多列数据
mysql> insert into t20 set id=1, name=.'zhansan'; --向指定列插入数据
mysql> insert into t20 set id=100;
mysql>insert into t20 select math,english from t02; --通过查询另一表的值来完数据的插入
mysql> insert into t20(id,name) values(2,'lisi');
插入多行记录多行数据
mysql> insert into t20(id,name) values(2,'lisi'),(3,'wangwu') ; --插入多条记录
mysql> insert into t20 values(4,'name04'),(5,'name05'); --不写列名,需要填写表中没列的内容
2) update --更新/修改记录
mysql> ? update
mysql> update t1 set math=81,english=91 where id=1 and name='zhang3';
更改root用户对应在localhost登录的密码
mysql> update mysql.user set password=password('123') where user='root' and host='localhost';
mysql> flush privileges; --刷新权限表(把内存数据写回磁盘)
mysql> update mysql.user set password=password('123') where user='root';
3) delete/truncate
mysql> ? delete/truncate
delete 会将操作记录到日志,写的效率低
truncate 是直接删除物理和实例的链接关系,速度快,但是不记录日志,不可以修复
删除用户:
mysql> delete from mysql.user where user=''; --删除mysql中的匿名用户
mysql> flush privileges;
删除表内内容:
mysql> delete from imptest where id=1; --指定条件删除
mysql> delete from imptest where id < 4; --指定区间删除
mysql> delete from imptest; --删除整个表,一行一行删除,所有的操作都会被记录至事务日志中
mysql> delete from imptest where name like 'test%';
mysql> truncate imptest; --一次性全部删除,不会被记录至事务日志中.
4)select:(% _= ^) --查询
(1) 通配符:
% 匹配单个或任意多个字符
_ 匹配一个字符
= 精确匹配
like 模糊匹配
regex(^ . .* .....) 使用正则表达式来匹配
mysql> select host as 主机名,password as 密码,user as 用户名 from mysql.user; --给列取别名,增加可读性
mysql> select user,password,host from mysql.user where host like 'localhos_'; --模糊匹配
mysql> select user,password,host from mysql.user where host regexp '^l'; --支持正则表达式
mysql> select * from mysql.user where user='root' --精确匹配
(2)排序:
order by 排序
asc 升序排列结果
desc 降序排列结果
group by 聚合,排除重复的,可以统计数量
mysql> select * from t1 order by id asc;
+------+--------+------+---------+
| id | name | math | english |
+------+--------+------+---------+
| 1 | zhang3 | 80 | 90 |
| 2 | li4 | 50 | 60 |
| 3 | wang5 | 77 | 88 |
| 3 | a02 | 55 | 66 |
| 4 | a01 | 70 | 67 |
| 4 | a03 | 99 | 88 |
+------+--------+------+---------+
6 rows in set (0.00 sec)
mysql> select * from t1 order by math desc;
+------+--------+------+---------+
| id | name | math | english |
+------+--------+------+---------+
| 4 | a03 | 99 | 88 |
| 1 | zhang3 | 80 | 90 |
| 3 | wang5 | 77 | 88 |
| 4 | a01 | 70 | 67 |
| 3 | a02 | 55 | 66 |
| 2 | li4 | 50 | 60 |
+------+--------+------+---------+
6 rows in set (0.00 sec)
mysql> select distinct user from mysql.user where user='root'; --去除一模一样的行
mysql> select user,host from mysql.user where user='root' group by user; 根据某列把相同值的记录聚合成一条记录
mysql> select user from mysql.user where user regexp 'r..t' group by user having user='root';
--group by聚合函数中的条件语句不能用where,需要使用having
(3)查看mysql支持字符转换函数:
select password('123'); --常用
select md5('123');
select sha1('123'); --常用
select encrypt('123'); --很旧的东西,基本上不用了
(4)使用select来调度mysql中的常见函数:
mysql> select current_user();
mysql> select current_time();
mysql> select current_date();
mysql> select count(*) from t1; --计算表中有多少条记录
mysql> select now();
(5)合并列:
mysql> select concat(user,' ',password) as 用户名和密码 from mysql.user;
mysql> select concat(user,' ',password) as 用户名和密码 from mysql.user order by 用户名和密码 asc; --按照升序来排列结果
mysql> select concat(user,' ',password) as 用户名和密码 from mysql.user order by 用户名和密码 desc; --降序排列
(6)分页函数:
mysql> select * from t1 limit 10; --显示前10行
mysql> select * from t1 limit 10,10; --显示11至20行
mysql> select * from t1 order by english desc limit 3
mysql> select * from db1.t1 order by english asc limit 1,2; 显示第二名和第三名
mysql> select * from db1.t1 where math >= 60 or english >=60 ;
(7) + - * / mysql运算符
mysql> select 1 + 1, (10-1)/3, 2*2/2; ---以1 + 1, (10-1)/3, 2*2/2为列明,各列的值为表达式计算出的值
+-----+-----+-----+
| 1+1 | (10-1)/3 | 2*2/2|
+-----+-----+-----+
| 2 | 4 | 6 |
+-----+-----+-----+
mysql> select 1 + '10a'; ---带有字符的以前面的数字做其值计算
+-----------+
| 1 + '10a' |
+-----------+
| 11 |
+-----------+
1 row in set, 1 warning (0.00 sec)
mysql> select 1 + 'a10'; --以字符开头的计算时不处理
+-----------+
| 1 + 'a10' |
+-----------+
| 1 |
+-----------+
1 row in set, 1 warning (0.00 sec)
mysql> select 1 = 2; ---条件表达式的值
+-------+
| 1 = 2 |
+-------+
| 0 |
+-------+
1 row in set (0.00 sec)
mysql> select 1 = 1; ---条件表达式的值
+-------+
| 1 = 1 |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
mysql> select 1 + 1 from dual; --dual表,俗称万能表
(8) and or not 逻辑运算
and
mysql> select * from t1 where id > 2 and name like 'li%';
not
mysql> select * from t1 where not name='lisi' ;
mysql> select * from t1 where not name like 'lisi%' ;
or
mysql> select * from t1 where id > 2 or name like 'li%';
(9) 列的相加:
mysql> select name as 学生名字,math+english as 总分 from t1;
mysql> select name as 学生名字,(math+english)/2 as 平均分 from t1;
(10) sum() avg() max() min() count()
mysql> select name,sum(math),sum(english) from t1; ---以sum(math),sum(english)为列明显示平均值
+----------+-----------+--------------+
| name | sum(math) | sum(english) |
+----------+-----------+--------------+
| zhangsan | 215 | 252 |
+----------+-----------+--------------+
1 row in set (0.00 sec)
mysql> select name,avg(math),avg(english) from t1; ---以 name,avg(math),avg(english)为列明显示平均值
+----------+-----------+--------------+
| name | avg(math) | avg(english) |
+----------+-----------+--------------+
| zhangsan | 53.7500 | 63.0000 |
+----------+-----------+--------------+
1 row in set (0.00 sec)
mysql> select name,max(english) from t1;
mysql> select name,min(english) from t1;
mysql> select count(*) from t1; ---计算记录数量
+----------+
| count(*) |
+----------+
| 4 |
+----------+
1 row in set (0.00 sec)
mysql> select max(english) - min(math) from t1; --英语的最高分与数学最低的差距
(11) 表结构的复制
mysql> create table t3 like t1; --复制表结构
mysql> insert into t3 select * from t1; --复制记录
mysql> select * from t3;
(12) 表的连接 ----纵向连接/内连接/左连接/右连接
[1] 数据准备:
mysql> create table t1(id int,name varchar(50));
mysql> create table t2(id int,socre int);
mysql> insert into t1 set id=1,name='lee';
mysql> insert into t1 set id=2,name='zhang';
mysql> insert into t1 set id=4,name='wang';
mysql> insert into t2 set id=1,socre='90';
mysql> insert into t2 set id=2,socre='100';
mysql> insert into t2 set id=3,socre='90';
[2] 常规查表: ----有重复的列
mysql> select * from t1,t2;
mysql> select * from t1,t2 where t1.id=t2.id;
+------+-------+------+-------+
| id | name | id | socre |
+------+-------+------+-------+
| 1 | lee | 1 | 90 |
| 2 | zhang | 2 | 100 |
+------+-------+------+-------+
[3]左连接: ----以左表为标准,连接
letft join=left [outer] join
mysql> select * from t1 left join t2 ON t1.id=t2.id;
+------+-------+------+-------+
| id | name | id | socre |
+------+-------+------+-------+
| 1 | lee | 1 | 90 |
| 2 | zhang | 2 | 100 |
| 4 | wang | NULL | NULL |
+------+-------+------+-------+
3 rows in set (0.00 sec)
[4]右连接: ----以右表为标准,连接
right join= right outer join
mysql> select * from t1 right join t2 ON t1.id=t2.id;
+------+-------+------+-------+
| id | name | id | socre |
+------+-------+------+-------+
| 1 | lee | 1 | 90 |
| 2 | zhang | 2 | 100 |
| NULL | NULL | 3 | 90 |
+------+-------+------+-------+
3 rows in set (0.00 sec)
[5]内连接: -----取多表之间的交集
mysql> select * from t1 join t2 on t1.id=t2.id;
+------+-------+------+-------+
| id | name | id | socre |
+------+-------+------+-------+
| 1 | lee | 1 | 90 |
| 2 | zhang | 2 | 100 |
+------+-------+------+-------+
2 rows in set (0.00 sec)
[6]纵向连接: ---- 取表的并集,重向合并
mysql> select * from t1 union select * from t2;
+------+-------+
| id | name |
+------+-------+
| 1 | lee |
| 2 | zhang |
| 4 | wang |
| 1 | 90 |
| 2 | 100 |
| 3 | 90 |
+------+-------+
6 rows in set (0.00 sec)
(13) 子查询: ----select的嵌套使用
mysql> select * from emp where id in (select id from emp_id where id=1);
mysql> select * from emp where id in (select id from emp_id where id>=1);
c. 数据控制语言:DCL grant revoke ---用户权限控制
1) 权限分类:
USAGE --无权限,只有登录数据库,只可以使用test数据库
ALL --所有权限
select/update/delete/super/slave/reload --指定的权限
with grant option --允许把自己的权限授予其它用户
2) 权限级别:
*.* --全库、全表
mysql.* --mysql库下所有表(某库中的所有表)
mysql.user --mysql库中user表(单表)
mysql.user.host --mysql库中user表的host列
3) 用户权限:
对于用户username@localhost的含义
username --确定你被授予了什么权限
username/password --确定你登录时需要的账号密码,
localhost --表示你可以在哪里登录(这里表示只能本机通过socket登录)
用户定义的格式:
user@localhost --表示user只能在本地通过socket登录服务器
user@192.168.0.1 --表示user用户只能在192.168.0.1登录数据库服务器
user@192.168.0.0/255.555.255.0
--指定某个子网的主机可以登录数据库
user@% --表示user用户能在所有的机器上通过ip登录数据库服务器
4)查看权限:
mysql> show grants; --查看自己的权限
mysql> show grants for user02@'%'; --查看指定用户的权限
5)权限的作用范围(*.* database.* database.table)
mysql> grant select,update on DB.t3 to user04@'localhost' identified by '123';
6)列的授权:
mysql> grant update (user) on mysql.user to user03@'%';
mysql> grant update (user,host,password) on mysql.user to user03@'%';
7)权限的保存位置:
mysql.user --所有mysql用户的账号和密码,以及对用户对全库全表权限(*.*)
mysql.db --非mysql库的授权都保存在此(db.*)
mysql.table_priv --某库某表的授权(db.table)
mysql.columns_priv --某库某表某列的授权(db.table.col1)
mysql.procs_priv --某库存储过程的授权
8) 撤销权限 ---revoke,drop
REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost'; --撤消指定的INSERT权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ... --撤消所有权限
mysql> drop user user02; --撤消所有权限后把用户一并删除
9)实例
新建user02用户, 要求user02只能在本机登录而且对DB这个库的所有表拥有完全控制的权限:
mysql> grant all on DB.* to user02@'localhost' identified by '123';
mysql> select user,password,host from mysql.user; --查看用户创建是否成功
更改user02在所有机器上都能登录数据库.
mysql> update mysql.user set host='%' where user='user02';
mysql> flush privileges;
让user02可以把自己的权限授予其它用户:
mysql> grant ALL on DB.* to user02@'%' with grant option;
7. 触发器 -----在执行相应SQL语句操作前或者后触发相应动作
create trigger <trigger_name>
{before | after}
{insert | update | delete}
ON table_name
for each row
<触发的sql语句>
a. 查看当前mysql中有哪些触发器
mysql> show triggers; --查看当前mysql中有哪些触发器
b. 创建触发器
mysql> create trigger tr_test ---在插入表一的时候,同时插入到表2
> after insert on testbb.t1
> for each row
> insert into testbb.t2 set time=now();
c. 删除触发器:
mysql> drop trigger tr_test;
8. 数据库数据的导入和导出
a. 导出数据:
mysql> select * from testbb.t1 into outfile '/tmp/testbb.t1';
b. load data 导入数据:
mysql> delete from testbb.t1;
mysql> load data infile '/tmp/testbb.t1' into table testbb.t1;
c. mysqlimport导入数据:
# mv /tmp/testbb.t1 /tmp/t1.txt
# mysqlimport -uroot -p123 testbb /tmp/t1.txt
# mysqlimport -S /d1/mysql.sock -uroot -p123 testbb /tmp/t1.txt
testbb.t1: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
9. 索引 -----提升查询速度
# seq 1000000 >> /tmp/t2.txt
mysql> load data infile '/tmp/t2.txt' into table t1; --导入数据
a. 新建索引
mysql> create index index_test on t1(id); --新建索引
mysql> select * from t1 where id=123684; --测试索引的速度
+--------+
| id |
+--------+
| 123684 |
+--------+
1 row in set (0.00 sec)
b. 查看索引
mysql> SHOW INDEX FROM t1; --查看表的索引
c. 删除索引
mysql> drop index index_test on t1; --删除索引
10 .视图 -用数据库数据拼凑成的假表,在数据库里面并不存在
a. 创建视图
mysql> create view view_test as select user,password,host from mysql.user;
b. 引用视图:
mysql> select * from view_test;
c. 查看视图的定义内容:
mysql> show create view view_test;
mysql> show create table view_test;
11. 主键的操作(一个表唯有一个主键,可以使用多列组合成一个主键):
--- 前步骤见雇员表的创建实例
a. 创建主键:
root db001>alter table emp add primary key(id,emp_name); ----添加不存在的列为主键
root db001>alter table emp modify `id` int(10) unsigned NOT NULL auto_increment COMMENT '员工编号';
---修改已经存在的列为主键
b. 删除主键:
root db001>alter table emp modify `id` int(10) unsigned NOT NULL COMMENT '员工编号';
---修改主键列的主键属性
root db001>alter table emp drop PRIMARY KEY; ---删除主键列
c. 主键/自动增长列:
主键自动增长:
mysql> create table t1(id int primary key not null auto_increment, name varchar(20));
普通列自动增长:
mysql> create table t1(id int not null auto_increment, name varchar(20),primary key(id));
# for i in `seq 100`; do mysql -uroot -p147258369 -e "insert into testbb.t1 set name='test$i'"; done
12. 修改表的名字
mysql> RENAME TABLE t1 to t2;
13. 忘记root密码的操作:
a. mysql的用户验证逻辑:
mysqluser-->mysqld(3306/scoket)-->(user/password/host)-->mysql.user
b.修改root密码
1)关闭正在运行的mysql服务器
2)重新启mysql,但启动的过程让mysql跳过用户验证(mysql.user)--skip-grant-tables ,然后改密码
3)安全关闭mysql,然后再启动,这样密码就被重置了。
# pkill -9 mysql
# cd /opt/mysql-glibc
# /opt/mysql-glibc/bin/mysqld_safe --defaults-file=/data2/my.cnf --skip-grant-tables &
mysql> update mysql.user set password=password('147258369') where user='root'; --修改密码
# mysqladmin shutdown
# /opt/mysql-glibc/bin/mysqld_safe --defaults-file=/data2/my.cnf &
最后
以上就是拉长乐曲为你收集整理的Mysql&SQL笔记的全部内容,希望文章能够帮你解决Mysql&SQL笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复