当前位置:Gxlcms > 数据库问题 > mysql基础

mysql基础

时间:2021-07-01 10:21:17 帮助过:4人阅读

单表
查询表中所有字段
select*from 表名;
or
查询指定字段
select id,age,sex from 表名;

查询指定记录
select id,age,sex from 表名 where 表达式;
例如 :select id,age from p1_2 where id>1 and id>3;
查询条件
比较 > < = <= => != <> !> !<
范围 netween and not netween and
集合 in not in
匹配字符 like not like
是否为空 is null is not null
多个查询 and or

带in/not in关键字查询
in可以用来判断某个字符的值是否在指定集合中,如果在集合中,则满足此条件,就会被记录查询出来
,反之不会被查询到,语法如下
[not] in(元素1,元素2,....,元素n)
not是可选 参数,表示条件为假
select id,age from p1_2 where id in(1,2,3,4);
带between and范围查它可以判读某个字段的值是否在指定范围内,如果是在指定范围内,则满足条件
,就会被记录查询出来,反之不会被查询到,语法如下
[not] between 值1 and 值2
例如: select*from p1_2 where age between 20 and 25;


带like的字符匹配查询:匹配字符串是否相同,如果字段值与指定匹配字段值相等,则满足查询条件,
就会被记录下来,反之不会被记录下来,语法如下:
[not]like ‘字符串‘
例子:SELECT id,NAME,sex,addre FROM p1_1 WHERE NAME LIKE ‘python‘;
SELECT id,NAME,sex,addre FROM p1_1 WHERE NAME LIKE ‘java%‘;
SELECT id,NAME,sex,addre FROM p1_1 WHERE NAME LIKE ‘java‘;
字符串参数的值可以是一个完整的字符串,也可以包含百分号:% 和下划线_符
%和_区别
%:可以表示任意{长度},长度也可以表示为0,比如b%k,表示以字母b开头,以字母k结尾的任意长度字
符串,可以是bk,buk,bcdk....
_表示单个字符串,比如b_k,表示以字母b开头,以字母k结尾,可以是bck,bak等

查询空值
is null关键字可以用来判断字符串的值是否为空,如果满足为空条件,记录则被查询出来,返回不会
被查询出来,语法:
[not] is null
例如:SELECT id,NAME,sex,addre FROM p1_1 WHERE addre IS NULL;

带含有and/or多条件查询
and和or的区别
and用来联合多个条件时进行查询,可以满足多个满足的条件记录会被查出来,
and表示多个条件为真时,会会被触发
or也是用于联合查询时使用,但与and不同,or关键字只要多条查询语句中(满足其中某一个条件即可
),
2者语法相同,and语法:条件1 and条件2 [...and 条件n]
or语法: 条件1 or条件2 [...or 条件n]
SELECT
id,
NAME,
sex,
addre
FROM
p1_1
WHERE id!=1 AND id>2 AND NAME!=‘python‘;

说明:and与or关键字可以连接条件表达式,在and和or里面也可以使用> < =还可以使用between and
like等关键字,进行复杂的查询

查询结果不重复
如果某个字段上没有唯一性约束,这些字段可能存在重复的值,它的语法如下:
select distnct 属性名
id age occupation gamename
1 25 杀手 梦幻西游
2 25 杀
手 梦幻西游
3 112 杀手 英雄联盟
4 1 杀手 英雄联盟
5 12
杀手 英雄联盟
6 45 杀手 英雄联盟
7 10 杀手 英雄联盟
8 23
杀手 英雄联盟
9 15 杀手 英雄联盟
上面出现年龄有相同的值,所以需要把重复的值进行选择不重复的即可
如下:SELECT DISTINCT age FROM p1_2;

对查询结果进行排序
语法如下
order by 属性名[asc|desc]
asc升序(默认)
desc降序


分组查询:可以将查询的结果按照某个字段或者多个字段进行分组,字段中相同的为一组
语法如下:
group by 属性名[having 表达式][with rollup]
属性名:按照该字段值进行分组
having表达式 进行限制用来分组后显示,满足条件表达式结果会被显示,with rollup关键字将会在所
有记录的最后加上一条记录,该记录是上面所有记录的总和
gruop by关键字可以和gruop_concat()函数一起使用,
gruop by还可以和集合函数一起使用,包含;count(),sum(),avg(),max(),min()
当gruop by不与上面的集合函数和gruop_concat()函数一起使用时,那么查询结果就是字段值分组情况
,字段中取值相同的记录为一组,但只显示该第一条记录组;

例子;
单独使用GROUP by关键字进行分组
SELECT*FROM p1_2 GROUP BY occupation;这样只会查询到当前数据库表中p1_2中第一条数据
GROUP by与group_concat()函数一起使用
例子:SELECT id,GROUP_CONCAT(NAME),sex,addre,dates FROM p1_1 GROUP BY id;

GROUP by与集合函数一起使用
例子:SELECT COUNT(age),AVG(age),SUM(age) FROM p1_2 GROUP BY occupation;
GROUP by与with rollup一起使用
SELECT sex,COUNT(sex) FROM p1_1 GROUP BY sex WITH ROLLUP;


使用limit限制查询结果数量
1不指定初始位置的查询
limit关键字可以不指定初始值:记录从第一条记录开始显示,显示记录条数与limit关键字有关,它的
语法如下:limit 记录数(它是整形)
其中<记录数>参数表示显示记录的条数,如果记录数的值小于查询结果的总记录数,将会从第一条记录
开始,显示指定条记录,如果记录数的值大于查询结果的总记录数,数据库系统直接会显示查询出所有 :

记录;
例如 :不指定初始值位置:SELECT*FROM p1_1 LIMIT 3;
SELECT*FROM p1_1 LIMIT 30;因为我数据库中只有7条记录,所以会全部显示出来

指定初始值位置,语法如下:
limit 初始位置,记录数

如下:SELECT*FROM p1_1 LIMIT 1,4;
注意:记录如果上 1 limit 4这样,会显示是从2到5的位置,因为第一条记录是从0开始查询的,第二
条记录是1,第三条是2,后面的记录是依次类似,因为长度要-1,比如有1000条记录,它是从0开始的,
所以显示是0到999

集合函数
count()统计记录个数
sum()求和
avg()求平均
max()/min()最大/最小值
例子(合在一直)
写一个不存在的表,但方式是一样的
select id,count(name),sum(gongzi),avg(chengji),max(year),min(year1) from infort;

注意在mysql中a最小z最大,在ascii中a(97)最小
max()函数进行比较时,会先对第一个字母进行比较,如果第一个字母相同,再继续下一个字母比较,
依次类推(其他语言中也是一样的方式)

 

查询(重点部分):几大查询(连接查询)
注意:如果连接查询需要2个或者以上的表按某个条件进行连接起来查询,从中选取需要的数据,连接查询时同时查询的2个或者以上的表使用,当不同的表中存在相同意义的字段时,可以通过该字段来连接这几个表

1:内连接查询
内连接可以查询2个或者以上的表(最基本的查询之一)
说明:2个或者以上的表示相同意义的字段可以是指父表的主键和子表的外键
内连接语法: select 列1,列2,...,列n from 父表名 inner join 子表名 父表名.属性=子表名.属性
例子
SELECT num,NAME,exr1.d_id,age,sex,d_name,FUNCTION FROM exr1 INNER JOIN exr2 WHERE exr1.d_id=exr2.d_d1;
如图:

部分说明:请看(http://www.cnblogs.com/rollenholt/archive/2012/05/15/2502551.html)
--------------
外连接
说明:可以查询2个或者以上的表,它是需要通过指定字段来进行连接的,当字段相等时,查询出该记录,而且,该字段不相等的也可以查询出来,它包括:左连接和右连接查询
语法:select属性名 from 表1 left(左)|right(右) join 表2 on 表1.属性名=表2.属性名;*[这里on后面的表达式,不一定为=,也可以>,<等算术、逻辑运算符]【连接完成后,可以当成一张新表来看待,运用where等查询】
以左表为准,去右表找数据,如果没有匹配的数据,则以null补空位,所以输出结果数>=左表原数据数
例如:SELECT num,NAME,exr1.d_id,age,sex,d_name,FUNCTION FROM exr1 LEFT JOIN exr2 ON exr1.d_id=exr2.d_d1 WHERE age=26;
右连接
a left join b 等价于 b right join a
推荐使用左连接代替右连接
例子:SELECT num,NAME,exr1.d_id,age,sex,d_name,FUNCTION FROM exr1 RIGHT JOIN exr2 ON exr1.d_id=exr2.d_d1 WHERE age=26;
mysql目前还不支持 外连接(即左右连接结果的并集,不去除null项)

------------
复合条件连接查询
SELECT num,NAME,exr1.d_id,age,sex,d_name,FUNCTION FROM exr1 RIGHT JOIN exr2 ON exr1.d_id=exr2.d_d1 WHERE age>12 AND NAME=‘张三‘;和*一样

 

子查询
它是将一个查询语句嵌套在另一个查询语句中,内层查询语句的查询结果,可以为外层查询提供查询条
件,因为在特定情况下,一个查询语句的条件需要另一个查询语句来获取,子查询可能包括了[not] in
any all [not]exists等关键字

1:带[not]in关键字子查询
一个查询语句的条件可能落在另一个select语句查询中,可以通过in关键字来判断
例子:SELECT*FROM exr1 WHERE exr1.`name` IN(SELECT exr2.`d_name` FROM exr2);
2:带比较运算符的子查询
(>,<,!=,<>,>=,<=等),一般用于查询分数,年龄,价格和收入等

例子:SELECT*FROM exr1 WHERE exr1.`d_id`>=(SELECT exr2.`d_d1` FROM exr2 WHERE
exr2.`d_name`);

3:带[not] exists关键字的子查询
exists表示存在,使用exists关键字时,内层查询语句不返回查询记录,而是返回一个布尔值,如果内
层查询语句条件满足,则返回true,否则返回false,当条件为true时,外层查询语句将进行查询,当返
回为false时,外层查询不进行查询或者查询不出任何记录
例子:SELECT*FROM exr1 WHERE EXISTS(SELECT d_name FROM exr2 WHERE d_d1=1004);这样则查询不出

SELECT
*
FROM
exr1
WHERE exr1.`age`>20 AND EXISTS
(SELECT
d_name
FROM
exr2
WHERE d_d1 = 1004);

4:带any关键字的子查询:满足其中任一条件,使用any关键字时,只要满足内层查询语句返回结果中任
何一个,就可能通过该条件来执行外层查询语句
例子:SELECT*FROM exr1 WHERE exr1.`age`>ANY(SELECT exr2.`d_name`=‘王五‘ FROM exr2 );

5:带all(and)关键字子查询,它是满足所有条件(用法与any(or)一样)

合并查询结果
关键字union 和union all
使用union时,数据库系统会将所有查询结果合并在一直,然后把相同记录清除,而union all则只是简
单的合并到一起,语法如下:
select 语句1 union|union all
select 语句2 union|union all
;;;;;
select 语句n union|union all

例子:union例子
SELECT exr1.`d_id` FROM exr1
UNION
SELECT exr2.`d_d1` FROM exr2;

union all
SELECT exr1.`d_id` FROM exr1
UNION ALL
SELECT exr2.`d_d1` FROM exr2;

注意:union 和union all有一点区别:union关键字合并查询时,需要将相同的记录去掉,而union all
关键字刚刚相反,它不会消除相同记录,而是将所有记录进行合并了;

为表和字符取别名
语法如下:
表名 表的别名
SELECT*FROM exr1 e1 WHERE e1.`d_id`;
为字段取别名
语法如下
属性名 [as]别名
SELECT exr1.`d_id` AS dd FROM exr1;

mysql基础

标签:

人气教程排行