目录
1.select 列名1,列名2... from 表名 [where 条件]
2.修改查询结果中的字段名(原来表中的字段名没变,只是查询结果中显示了一个别名)
3.select concat(列名1,列名2) from 表名;
4.select concat_ws("分隔符",列名1,列名2) from 表名;
5.select distinct 列名 from 表名 不显示重复的数据
0x01 DQL 数据查询语言
1.select 列名1,列名2... from 表名 [where 条件]
查询所有字段用* 不带where条件 把表的所有记录查出来
例如:
select * from user where age between 30 and 37;
select * from user where age in (36,33); 和or作用差不多,将年龄是36或者年龄是33的查出来。
select * from user where age not in (36,33);查找既不是36也不是33的
select * from user where user_name like '%n%'; 模糊查询
查询user_name中含有n的数据,其中%是通配符(可有可无,看需求),表示一个或者多个字符。
2.修改查询结果中的字段名(原来表中的字段名没变,只是查询结果中显示了一个别名)
select 原字段名 as 别名 from 表名;
select user_name as username,user_email from user;
通常,在联合查询时,如果两张表中有字段重名,那么在显示查询结果的时候,就应该起一个别名。
3.select concat(列名1,列名2) from 表名;
select concat(username,user_email) from user;
将两列并成一列显示。
concat是MySQL的一个函数。
例如还可以这样:
select concat(username,user_email) as name_email from user;
例如做收件地址的时候,一般是省一个字段,市一个字段,县一个字段,街道门牌号一个字段,但是当我们展示的时候,一定是这些字段连接在一块的。
4.select concat_ws("分隔符",列名1,列名2) from 表名;
例如:select concat_ws("==",username,user_email) from user;
5.select distinct 列名 from 表名 不显示重复的数据
6.limit查询 限制查询条数
select*from 表名 limit 条数;
select*from 表名 limit 开始,条数; 从第多少条开始(不包括)查多少条
在分页的时候就是应用limit查询的
7.排序
select*from 表名 order by 字段名 asc ;(升序 默认的 可以不加)
select* from 表名 order by 字段名 desc;(降序显示)
8.聚合函数
(1).select count(*) from 表名; 查询表的记录数。例如:在统计博客文章数的时候就可以用这个函数。
(2)select sum(列名) from 表名; 查询此列的和,如果列中没有数字,则为0,如果有数字,则是所有数字之和。
(3)select avg(列名) from 表名; 求列的平均值
(4)select max(列名) from 表名;求此列的最大值
(5)select min(列名) from 表名;求此列的最小值
9.分组查询(聚合查询)
select count(*) ,分组中的列 from 表名 group by sex
例如:select sex from user group by sex; 按照sex分组,按照谁分组,select后面必须跟上谁。
select count(id),sex from user group by sex;加上count可以显示每组的数量
select count(id),sex from user group by sex having count(id)>2;只显示count(id)>2的
10.连表查询(至少有两个表)
(1)连接查询:
内连接:
如果直接select*from 表1,表2;得到将是两个表的笛卡尔积;
所以必须在后面加上where条件;
例如:
因为两个表中都有id字段,所以最好在字段名前加上表名:
select student.id,student.name,mark.mark from student,mark where student.id = mark.stu_id;
但是这样语句就太长了,所以可以在from部分给每张表起个别名
select s.id,s.name,m.mark from student as s,mark as m where s.id = m.stu_id;
以上是隐式的内连接查询。只要将 ,替换成 inner join (或者join)便是显式的内连接查询了
select s.id,s.name,m.mark from student as s inner join mark as m where s.id = m.stu_id;
也可以将where替换成on。
外连接:
左连接:以左边的表中的数据为主,即左边的表有多少条数据,最后合成的表就有多少条数据。如果右边的表数据条数少于左边的表,那么缺少的地方补NULL。
select s.id,s.name,m.mark from student as s left join mark as m on s.id = m.stu_id;
必须用on,不能用where!
右连接:和左连接相反
select s.id,s.name,m.mark from student as s right join mark as m on s.id = m.stu_id;
全连接:
(2)联合查询
union操作符用于联合两个或多个select查询的结果集,联合查询是将查询结果竖着拼起来,连接查询则是将查询结果横着拼起来。
例如:
select id,name from php union select id,name from java; union两边的查询语句必须具有相同数量的列。这样才能竖着拼起来。
(3)子查询
例如:
select * from student where id in (select id from student where id>1);
相当于:
select * from student where id in (2,3,4);
因为 select id from student where id>1的结果就是2,3,4
如果错位了,就会导致下面这样的后果
如果两个表,对应字段的内容全部相同,union会自动去掉重复的内容,只显示一次。如果想全部显示,可以使用union all来代替union
0x02 字符集/字符集校对
如果数据库字段插入中文有问题,说明默认字符集设置的有问题。
show create table 表名;可以查看创建表的语句。其中便有表的字符集
show create database 数据库名;可以查看创建数据库的语句,其中便有数据库的字符集
修改表的默认字符集为utf8:
alter table 表名 default charset=utf8;但是这样只能修改表的默认字符集,不能修改字段的默认字符集,所以不建议这样用。建议直接:
alter table 表名 convert to character set utf8;将表和字段的默认字符集都修改为utf-8;
只要表的默认字符整对了,其实这张表就可以存中文了。不用管数据库的默认字符集也可以。
修改数据库的默认字符集为utf8
alter database 数据库名 default character set utf8;
只要将数据库的字符集整对,那么以后建新表的时候,新表的默认字符集就会跟着数据库的默认字符集走。
也可在创建新表时指定表的字符集,例如:
create table user3(
id int unsigned not null primary key auto_increment,
name varchar(30) not null
)default charset=utf8;
其实,最好的解决方案是直接修改配置文件my.ini
在mysqld下添加:
charset_set_server=utf8;
然后重启MySQL
0x03 mysql 存储引擎
存储引擎负责MySQL中数据向磁盘中的存取,是数据库中非常重要的部分。
数据库的存储引擎有:
Blackhole CSV MEMORY ARCHIVE
MylSAM innoDB
0.两者的区别:
MyISAM 不支持事务,支持表级锁,即当多人向同一张表插入时,只有一个人能插入,这个人插入的时候,整张表就锁了,只有这个人插入完后,其他人才能够插入。崩溃恢复支持不好。在存储短数据的时候性能好,但是很少用。
innoDB 支持事务,行级锁,崩溃恢复支持
5.6开始默认的数据库引擎就是innoDB
1.查看数据库支持的引擎
show engines\G;当表中字段很多时,加一个\G显示效果会更清晰一些
2.查看表的引擎
show table status;
3.查看某一个表的引擎
show create table 表名
4.修改引擎
alter table 表名 engine = 引擎名
5.建表时不指定的话默认用配置文件中的
mysqld 添加default-storage-engine=MyISAMs
0x04 关于int(n)
int(n) n表示显示长度,且只有当在创建表时添加了zerofill 属性,才能看出来区别。
例如:int(6)如果你存了一个111且添加了zerofill的话,select的时候就会显示000111
0x05 关于char(n)和varchar(n)
n:表示字符长度,即有多少个字符,不是字节,例如3个汉字,也是长度为3
char 存的是定长,如果没有达到长度,仍然占用空间,但是因为定长,所以存取速度快,适合存密码
varchar存的是变长,存取速度稍微慢一点,根据字符串的长度来占用空间。适合存用户名。
如果在存取时超过最大长度n,则插入失败。
0x06 mysql反引号
当表名,字段名等需要用到mysql的保留字时,需要用反引号将保留字引起来。
0x07 MySQL的管理工具
navicate 客户端管理工具
phpMyadmin管理工具