4、 Mysql语句
4.1、 在命令行中使用sql语句
语法:mysql -e ‘sql语句’ –uroot –p密码
执行一条命令
mysql -e 'show databases' -uroot -p123456
执行多条命令
mysql -e 'use db2;show tables' -u root -p123456
4.2、 Mysql数据库的操作
4.2.1、 查show
4.2.1.1、 查看有哪些数据库
查看数据库有3中方式
1,进入数据库查看(交互式)
mysql> show databases;
各个数据库的作用
1:information_schema这个数据库保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型,访问权限等。 [ˈskimə] 存放元数据(描述数据的数据)
2:performance_schema 这是MySQL5.5新增的一个性能优化的引擎:命名PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。MySQL用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表
http://www.cnblogs.com/hzhida/archive/2012/08/08/2628833.html
3:mysql库是系统库,里面保存有账户信息,权限信息等。
4:mysql5.7增加了sys 系统数据库,通过这个库可以快速的了解系统的元数据信息,元数据是关于数据信息的数据,如数据库名或表名,列的数据类型,或访问权限等。
2, 以行的方式查看
mysql> show databases \G
#以行的方式显示
3,在shell中查看
mysql -e后面直接跟sql语句,这种方式一般是在shell脚本中用到(非交互式)
[root@cong11 ~]# mysql -e 'show databases' -uroot -p123456
4.2.1.2、 查看数据库,时间,使用者
mysql> select now(),user(),database();
4.2.2、 选择use
4.2.2.3、 选择要操作的数据库
我们需要使用哪个数据库,就用use进行选择,后面的操作默认都是在被选择的数据库中进行操作。
mysql> use HA-test;
Database changed
4.2.2.4、 在命令行选择默认的数据库
我们也可以在命令行直接选择我们需要进入的数据库
[root@cong11 ~]# mysql -uroot -p123456 HA-test
mysql> select database();
4.2.2.5、 禁止预读表信息
没有禁止前转换数据库会有提示信息
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with –A
解决这个问题可以在登陆mysql的时候添加参数-A
[root@cong11 ~]# mysql -uroot -p123456 -A
mysql> use mysql;
Database changed #发现没有提示信息了
4.2.3、 增create
4.2.3.1、 语法
create database 数据库名;
4.2.3.2、 创建数据库注意事项
1、在文件系统中,MySQL的数据存储区以目录方式表示MySQL数据库。因此,上面命令中的数据库名字必须与操作系统的约束的目录名字一致。例如不允许文件和目录名中有,/,:,*,?,”,<,>,|这些符号,在MySQL数据库名字中这些字母会被自动删除。
[root@cong11 ~]# ls /data/mysql/data/
auto.cnf ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 ibtmp1 mysql performance_schema sys
2、遵从目录的约束
3、数据库的名字不能超过64个字符,包含特殊字符的名字或者是全部由数字或保留字组成的名字必须用反引号``包起来。
4、数据库不能重名
4.2.3.3、 创建一个数据库
mysql> help create database; //查看create database的帮助信息
mysql> create database if not exists db2 character set utf8; //指定字符集
mysql> create database HA;
Query OK, 1 row affected (0.00 sec)
mysql> create database `HA-test`;
Query OK, 1 row affected (0.00 sec)
4.2.3.4、 查看数据库
mysql> show databases;
4.2.3.5、 查看数据库目录
我们可以去数据目录下查看新创建的数据库目录
[root@cong11 ~]# ls /data/mysql/data/
4.2.4、 删drop
4.2.4.6、 命令
mysql> drop database `HA-test`;
Query OK, 0 rows affected (0.01 sec)
4.2.4.7、 移动数据库目录
上面删除数据库的方法,不安全,删除完了,无法恢复,在工作中我们可以移动数据库目录到别的地方,防止删除数据库了想要恢复。
[root@cong11 ~]# mv /data/mysql/data/HA /tmp
[root@cong11 ~]# mysql -uroot -p123456
mysql> show databases; #发现HA数据库已经不见了
4.2.4.8、 使用IF EXISTS 子句以避免删除不存在的数据库时出现的MySQL错误信息(shell脚本时用)
mysql> drop database if exists `HA-test`; #如果存在则删除
Query OK, 0 rows affected, 1 warning (0.00 sec)
也可以在创建数据库时使用
mysql> create database if not exists HA; #if not exists 如果不存在则创建
Query OK, 1 row affected (0.00 sec)
4.3、 关于表的操作
4.3.1、 增create
4.3.1.9、 表create:
语法:create table 数据库名.表名 (字段名 类型, 字段名 类型, 字段名 类型) ENGINE=InnoDB DEFAULT CHARSET=utf8;
类型:[not null|null][primary key][unique][auto_increment][default ‘value’]
解释:
unique:同一列中的数据不能重复,和primary key的作用相似
auto_increment:自动增长
default value:默认值
not null:不允许为空
举例:
create table t2 (id int primary key auto_increment,address varchar(20) unique,age int default ‘10’,name varchar(20) not null);
mysql> use HA;
Database changed
mysql> create table student(id int(20),name char(40),age int);
Query OK, 0 rows affected (0.02 sec)
指定默认存储引擎和字符集
新建一个表,指定默认的存储引擎为InnoDB,编码为utf8
mysql> create table student2(id int(20),name char(40),age int) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)
mysql> show create table student2 \G
4.3.1.10、 字段
在表中添加字段:
语法:alter table 表名 add字段名 字段类型;
enum #枚举类型,比如性别,只能在男女选择,是男非女,是女非难
mysql> alter table students add sex enum('M','W');
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc students;
在表中指定位置添加字段
在第一列添加一个字段
mysql> alter table students add uid int(10) first;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc students;
在age后面添加一个address字段
mysql> alter table students add address char(40) after age;
4.3.2、 查show
4.3.2.11、 查看有哪些表
mysql> use HA;
Database changed
mysql> show tables;
4.3.2.12、 查看表结构(字段)
使用desc 命令来查看表的结构
mysql> desc student;
还可以用以下命令查看表结构,会一种就可以。
mysql> explain mysql.user;
mysql> show columns from mysql.user;
mysql> show fields from mysql.user;
mysql> show columns from mysql.user like '%user';
4.3.2.13、 查看创建表执行了哪些命令:
mysql> show create table student \G
4.3.3、 改alter
4.3.3.14、 修改表名称 alter
语法:alter table 表名 rename 新表名;
修改HA库中student表名为students
mysql> alter table student rename students;
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
4.3.3.15、 修改表中的字段类型
语法:alter table 表名 modify 要修改的字段名 字段类型;
查看students表结构
mysql> desc students;
修改字段id 的int(20)字段类型为int(10)
mysql> alter table students modify id int(10);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看修改完的students表结构
mysql> desc students;
4.3.3.16、 修改表中的字段类型和字段名称
语法:alter table 表名 change 原字段名 新字段名 新字段类型;
mysql> alter table students change name stname char(20);
mysql> desc students;
注:CHANGE 和MODIFY的区别:
CHANGE 对列进行重命名和更改列的类型,需给定旧的列名称和新的列名称、当前的类型。 MODIFY 可以改变列的类型,此时不需要重命名(不需给定新的列名称)
4.3.4、 删除drop
4.3.4.17、 表
语法:drop table [if (not) exists] 表名;
mysql> drop table student2;
Query OK, 0 rows affected (0.01 sec)
4.3.4.18、 字段
语法:alter table 表名 drop 字段名 ;
mysql> alter table students drop address;
mysql> desc students;
发现表中address字段不见了
4.4、 关于表中记录(数据)的操作
4.4.5、 增insert
4.4.5.19、 插入字段<记录>INSERT
语法:insert into 表名values (字段值1,字段值2, 字段值3);
insert [into] 数据表名称 [(字段列表)] values|value (表达式|null|default,…),(表达式|null|default,…)
insert [into] 数据表名称 set 字段名称=值,…
insert与insert…set的区别是后者可以带有子查询。
插入记录时要对应相对的类型
举例:
先删除students表,再创建
mysql> drop tables students;
mysql> create table students(id int(20),name char(40),age int);
mysql> insert into students values(1,'zhangs',21);
4.4.5.20、 同时插入多条记录
mysql> insert into students values(2,'lis',24),(3,'wange',26);
4.4.5.21、 分开插入表记录
mysql> insert into students (id,name)values(4,'hangl');
如果表中有4个字段,插入三个字段(可以通过null指定空值)
mysql>insert into students values(4,’lisi’,null,5)
4.4.6、 查select
语法:
select 字段,字段,…… from {数据库名.}表名称; # 字段,字段可以用*号表示查询表中所有字段(列)
4.4.6.22、 所有字段的数据
mysql>use HA //进入要查看表的数据库
mysql> select * from students;
4.4.6.23、 指定的字段的数据
mysql> select id,name from students;
4.4.6.24、 记录比较多时可以使用\G查看
mysql> select * from student\G
4.4.6.25、 按指定条件查询
mysql>select * from db2.t1 where age is null;
查询某个字段不为空的记录
mysql>select * from db2.t1 where age is not null;
错误示范:
mysql>select * from db2.t1 where age=null; //不符合语法规范
4.4.6.26、 distinct去重
创建测试数据
mysql> create table students(id int(20),name char(40),age int);
mysql>insert into students values (1,'lis',25), (2,'lis',25),(3,'wange',26),(4,'libin',28),(5,'tom',30),(6,'sorry',24);
mysql> select name,age from students; //可以看到表中有重复的数据lis
去重
mysql> select distinct name,age from students; #可以看见重复的行不在了
4.4.6.27、 binary(区分大小写查询·)
Mysql默认查询是不区分大小写的
BINARY是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,因为大小写转换为二进制是不同的,用binary之后,查询数据时查看的是二进制。
插入测试记录
mysql> insert into students values(7,'KILL',32),(8,'kill',32);
不用binary查询
用binary查询
mysql> select name from students where binary name='kill';
mysql> select name from students where binary name='KILL';
4.4.6.28、 group by
分别查询男生和女生的数量
select sex,count(*) from t1 group by sex;
4.4.6.29、 要查看的表不在当前数据库
mysql> select * from HA.students;
4.4.6.30、 mysql-sql语句进阶
导入测试收据book数据库
导入我提供的book数据库,接下来的实验都是基于book数据库进行
[root@cong11 ~]# mysql -e 'create database book' -uroot -p123456
[root@cong11 ~]# mysql -uroot -p123456 book<book_utf8.sql
查看表的内容:
[root@cong11 ~]# mysql -uroot -p123456
mysql> use book;
mysql> show tables;
mysql> select * from category;
mysql> select * from books;
mysql> select * from books\G
查看字段类型:
desc 表名
mysql> desc books;
逻辑运算符:
and 且
特点:and两边的条件需要同时满足
举例:选出价格是50并且出版社是科学出版社的书籍
mysql> select bName,publishing,price from books where price=50 and publishing='科学出版社';
or 或
特点:or两边的条件满足一个即可
举例,选择出书籍价格为(30,40,50,60)的记录,只显示书籍名称,出版社,价格
mysql> select bName,publishing,price from books where price=30 or price=40 or price=50 or price=60;
not 非
特点:对查询结果去反
举例:查询价格不是50并且出版社也不是科学出版社的书
mysql> select bName,publishing,price from books where not(price=50 and publishing='科学出版社');
算术运算符:
= 等于
举例:找出价格等于60的书籍
mysql> select bName,price from books where price=60;
<> 不等于 !=
举例:找出价格不等于60的 书籍
mysql> select bName,price from books where price<>60;
> 大于
举例:找出价格大于60的书籍
mysql> select bName,price from books where price>60;
< 小于
>= 大于等于
<= 小于等于
排序
升序
升序:order by “排序的字段” asc 默认
mysql> select bName,price from books where price in (50,60,70) order by price asc;
降序:oredr by “排序的字段” desc
mysql> select bName,price from books where price in (50,60,70) order by price desc;
多个字段排序
例如:排队时首先按姓名排序,当姓名相同时按照身高排序。
mysql> select bName,price from books where price in (50,60,70) order by price desc,bName desc;
对比单字段的排序
mysql> select bName,price from books where price in (50,60,70) order by price desc;
范围运算:
[not]between …and…
Between and 可以使用大于小于的方式来代替,并且使用大于小于意义表述更明确
查找价格不在30到60之间的书名和价格(不包括30,60)
mysql> select bName,price from books where price not between 30 and 60 order by price desc;
或:
mysql> select bName,price from books where price <30 or price>60 order by price desc;
或:
mysql> select bName,price from books where price >30 and price<60 order by price desc;
in 运算符(集合)
IN 运算符用于 WHERE 表达式中,以列表项的形式支持多个选择,语法如下:
WHERE column IN (value1,value2,…)
WHERE column NOT IN (value1,value2,…)
举例:找出价格是60,50,70的记录
mysql> select bName,price from books where price in (50,60,70);
Not in 与in相反
当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择。
举例:找出价格不是60,50,70的书籍
mysql> select bName,price from books where price not in (50,60,70);
模糊匹配查询:
字段名 [not]like ‘通配符’ ----》% 任意多个字符
查找书名中包括"程序"字样记录
mysql> select bName from books where bName like '%程序%';
查找书名中不包括"程序"字样记录
mysql> select bName from books where bName not like '%程序%';
MYSQL子查询(嵌套查询):
在select 的where条件中又出现了select查询,查询中嵌套着查询,这就是子查询。
查询类型名称是“网络技术”的图书:
我们图书类型保存在category表中,书的名字保存在books表中,他们两个表中都有相同的bTypeId(书的类型)字段。
普通查询:
先查询category表中网络技术类型的bTypeId
mysql> select bTypeId from category where bTypeName='网络技术';
然后在books表中查询bTypeId=7是哪本书
mysql> select bName,bTypeId from books where bTypeId=7;
嵌套查询:
嵌套查询就是把两个select语句结合起来
mysql> select bName,bTypeId from books where bTypeId=(select bTypeId from category where bTypeName='网络技术');
查询类型名称为“黑客”的图书
mysql> select bName,bTypeId from books where bTypeId=(select bTypeId from category where bTypeName='黑客');
LIMIT限定显示的条目:
通常和order by结合使用,比如排序之后取前三行,又比如查询前三名的成绩
概念
语法:
SELECT * FROM table LIMIT [offset,] rows;
偏移量 行数
LIMIT语句可以强制让 SELECT 查询返回我们指定的记录条数。LIMIT 接受一个或两个数字参数。参数必须是一个正整数。如果给定两个参数,第一个参数指定偏移量,偏移量就是我要隔几行显示我需要查询的第一条记录,初始记录行的偏移量是 0(而不是 1),第二个参数指定要显示几行。
比如:
select * from table limit m,n;语句
m是指开始记录行的数值,0表示表中的第一条记录
n是指从第m+1条开始,取n条记录。
查第2行到第6行的记录。
首先2到6行有2,3,4,5,6总共有5个数字,从2开始,偏移量为1
mysql> select * from category limit 1,5;
查第3行到第6行的记录。
首先3到6行有3,4,5,6总共有4个数字,从3开始,偏移量为2
mysql> select * from category limit 2,4;
查价格中最低的三条记录
我们对所有记录排序以升序排列,取出前面3个来
mysql> select bName,price from books order by price asc limit 0,3;
将子查询和限制条目,算术运算结合起来查询
需求:显示字段bName ,price ;条件:找出价格比电子工业出版社出版的书中最便宜还要便宜的书。
针对这种查询,我们一步步的来。
先找出电子工业出版社出版中最便宜的书
mysql> select bName,price from books where publishing="电子工业出版社" order by price asc limit 0,1;
嵌套子查询
mysql> select bName,price from books where price<(select price from books where publishing="电子工业出版社" order by price asc limit 0,1);
还有一种方法:不使用limit
mysql> select bName,price from books where price < all(select price from books where publishing="电子工业出版社");
all表示小于子查询中返回全部值中的最小值
多表连接查询:
以一个共同的字段,求两张表当中符合条件的并集。 通过共同字段把这两张表连接起来。
测试:
创建两个表
mysql> create database xuesheng;
mysql> use xuesheng;
mysql> create table stu_info(id int,name varchar(20),sex enum('M','W'));
mysql> create table stu_scope(id int,shuxue float,yingyu float);
插入数据:
mysql> insert into stu_info values (1,'jerry','M'),(2,'zhangsan','W'),(3,'lisi','M');
mysql> insert into stu_scope values(1,45.1,34.2),(2,34.3,34.3),(4,34.4,45.5);
常用的连接:
内连接:根据表中的共同字段进行匹配
外连接:左外连接、右外链接。
内连接 (显示左边表和右边表字段值相同的行)
语法:
select 字段 from 表1 inner join 表2 on 表1.字段=表2.字段
内连接:根据表中的共同字段的值进行匹配
举例:
mysql> select i.id,i.name,s.shuxue,s.yingyu from stu_info i inner join stu_scope s on i.id=s.id;
其中i.id字段中的i是表stu_info的别名,需要在后面定义,别名可以随意书写,s.shuxue字段前的s是stu_scope表定义的别名。
实际使用中inner可省略掉,使用where子句代替。
mysql> select i.id,i.name,s.shuxue,s.yingyu from stu_info i,stu_scope s where i.id=s.id;
外连接 (分为左外连接;右外连接)
左外连接:
select 字段 from a表 left join b表 on 连接条件
a表是主表,显示所有行。
b表从表,只显示符合条件的行,不符合条件的显示null
举例:显示每个学生的id,name和各科成绩,没成绩的用null填充
mysql> select i.id,i.name,s.shuxue,s.yingyu from stu_info i left join stu_scope s on i.id=s.id;
右外连接:
select 字段 from a表 right join b表 on 连接条件
a表是从表:只显示符合条件的行,不符合的用null条填充
b表主表:显示所有行。
举例:
mysql> select i.id,i.name,s.shuxue,s.yingyu from stu_info i right join stu_scope s on i.id=s.id;
多表连接(不常用)
多表连接就是在原有两个表连接语句上继续添加字段和条件
书写格式:
mysql>select article.aid,article.title,user.username,type.typename from article INNER JOIN user ON article.uid=user.uid INNER JOIN type ON article.tid=type.tid;
聚合函数
函数:执行特定功能的代码块。
算数运算函数:
Sum()求和
显示所有图书单价的总和
mysql> select sum(price) from books;
as给字段设置别名
select sum(price) as 图书总价 from books;
avg()平均值:
求书籍Id小于3的所有书籍的平均价格
mysql> select avg(price) from books where bId<=3;
max() 最大值:
求所有图书中价格最贵的书籍
mysql> select bName,price from books where price=(select max(price) from books);
min()最小值:
求所有图书中价格便宜的书籍
mysql> select bName,price from books where price=(select min(price) from books);
count()统计记录数:
举例:查询男生的数量:
统计价格大于40的书籍数量
mysql> select count(*) from books where price>40;
Count()中还可以增加你需要的内容,比如增加distinct来配合使用
mysql> select count(distinct price) from books where price>40; #指定价格
算数运算:
+ - * /
不建议用的语句:
mysql> select * from stu_scope where shuxue+5=60;
原因:这条语句会从第一条开始加+5然后判断是否等于60,会非常消耗资源,因为加法消耗cpu资源
给所有价格小于40元的书籍,涨价5元
mysql> update books set price=price+5 where price<40;
给所有价格高于70元的书籍打8折
mysql> update books set price=price*0.8 where price>70;
字符串函数:
截取substr(string ,start,len):从start开始,截取len长.start 从1开始算起。
正常查询
mysql> select bTypeName from category where bTypeId=10;
举例:
从第一个字符串开始截取
mysql> select substr(bTypeName,1,7) from category where bTypeId=10;
从第二个字符串截取
mysql> select substr(bTypeName,2,7) from category where bTypeId=10;
拼接concat(str1,str2,str3…)。 把多个字段拼成一个字段输出
mysql> select concat(bName,"-----",publishing) from books;
大小写转换
upper()大写 : 转为大写输出
mysql> select upper(bname) from books where bId=9;
lower()小写:转为小写输出
mysql> select lower(bName) from books where bId=10;
4.4.7、 改(update)
语法:update 表名 set 字段名称=值,… [where 条件]
如果省略WHERE条件将更新全部记录。
4.4.7.31、 把表中id为2的记录age更新为25
mysql> update students set age='25' where id=2;
mysql> select * from students;
±-----±-------±-----+
| id | name | age |
±-----±-------±-----+
| 1 | zhangs | 21 |
| 2 | lis | 25 |
±-----±-------±-----+
2 rows in set (0.01 sec)
4.4.7.32、 所有的id都更新为2
mysql> update students set id=2;
mysql> select * from students;
4.4.7.33、 同时更新多条记录,请使用逗号隔开
mysql> update students set id=1,name='zhangsan' where age=21
;
mysql> select * from students;
4.4.8、 删(delete)
语法:delete from 数据表名称 [where 条件]
如果省略where条件,将删除全部记录
4.4.8.34、 删除students表中id为3的行
mysql> delete from students where id=3;
mysql> select * from students; #发现表中id为3的记录不见了
±-----±-------±-----+
| id | name | age |
±-----±-------±-----+
| 1 | zhangs | 21 |
| 2 | lis | 24 |
| 4 | hangl | NULL |
±-----±-------±-----+
3 rows in set (0.00 sec)
4.4.8.35、 删除age为空的行
mysql> delete from students where age is null;
mysql> select * from students;
±-----±-------±-----+
| id | name | age |
±-----±-------±-----+
| 1 | zhangs | 21 |
| 2 | lis | 24 |
±-----±-------±-----+
2 rows in set (0.00 sec)
4.4.8.36、 清除表中的所有记录
方法一:DELETE
DELETE :删除表的所有记录。
不会清零auto_increment 值,新插入的记录从用过的的最大值向后增加。
可以加where条件。
记录到binlog日志中,可以恢复。
mysql> delete from items;
mysql> select * from items;
Empty set (0.00 sec) #表里没有内容了
mysql> insert into items (label) values ("aaaa");
mysql> select * from items;
发现不能清空AUTO_INCREMENT 值
方法二:truncate
truncate :
作用: 删除表的所有记录。
并清零auto_increment 值,新插入的记录从1开始。
不可以加where条件。
不记录到binlog日志中,无法恢复。
语法: truncate table name;
mysql> truncate table items;
mysql> select * from items; #清空表中的数据
Empty set (0.00 sec)
mysql> insert into items values(null,'abv');
mysql> select * from items;
mysql> insert into items(label)values('hkuyb');
mysql> select * from items;