Maison > Article > base de données > Compréhension sophistiquée --- Requête multi-tables MySQL
1. Utilisez la clause SELECT pour les requêtes multi-tables
SELECT 字段名 FROM 表1,表2 … WHERE 表1.字段 = 表2.字段 AND 其它查询条件
SELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a.id=b.id
Remarque : dans le code ci-dessus, l'association entre les deux tables est établie à la condition que les informations du champ d'identification des deux tables soient les mêmes. Cependant, elles ne doivent pas être utilisées de cette manière dans le développement réel. Il est préférable d'utiliser des contraintes de clé primaire et étrangère pour atteindre
2. Utiliser des alias de table pour les requêtes multi-tables
Par exemple :
SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065 a,tb_demo065_tel b WHERE a.id=b.id AND b.id='$_POST[textid]'
In. Langage SQL, vous pouvez spécifier des alias pour les tables de deux manières
La première consiste à le spécifier via le mot-clé AS, tel que
SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065 AS a,tb_demo065_tel AS b WHERE a.id=b.id
La seconde consiste à ajouter l'alias de la table directement après le nom de la table pour obtenir
SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065 a,tb_demo065_tel b WHERE a.id=b.id
en utilisant l'alias de la table Notez quelques points
(1) Un alias est généralement un nom de table raccourci, utilisé pour référencer des colonnes spécifiques dans une table dans un connexion. Si des colonnes portant le même nom existent dans plusieurs tables de la connexion, elles doivent être utilisées. Les noms de table ou les alias de table qualifient les noms de colonnes
(2) Si un alias de table est défini, le nom de la table ne peut pas être utilisé
3. Fusionner plusieurs ensembles de résultats
En langage SQL, les résultats de requête de plusieurs instructions SELECT peuvent être combinés et affichés via UNION ou ALL Les instructions d'utilisation de ces deux mots-clés sont. comme suit :
UNION : ce mot-clé peut être utilisé pour combiner les résultats de requête de plusieurs instructions SELECT et supprimer les lignes en double.
ALL : utilisez ce mot-clé pour fusionner les résultats de requête de plusieurs instructions SELECT pour la sortie, mais les lignes en double ne seront pas supprimées
Utilisez le mot-clé UNION ou ALL pour fusionner plusieurs tables pour la sortie. Lors de l'utilisation de UNION, les résultats de la requête doivent avoir la même structure et les types de données doivent être compatibles. De plus, lors de l'utilisation de UNION, le nombre. Les champs des deux tables doivent également être identiques, sinon une erreur dans l'instruction SQL sera générée.
e.x:SELECT id,name,pwd FROM tb_demo067 UNION SELECT uid,price,date FROM tb_demo067_tel
4. Requête imbriquée simple
Sous-requête : une sous-requête est une requête SELECT qui renvoie une valeur unique et est imbriquée dans les instructions SELECT, INSERT, UPDATE et DELETE. ou d'autres instructions de requête, les sous-requêtes peuvent être utilisées partout où des expressions peuvent être utilisées
SELECT id,name,sex,date FROM tb_demo068 WHERE id in(SELECT id FROM tb_demo068 WHERE id='$_POST[test]')
Jointure interne : l'utilisation des résultats de la requête comme conditions de requête de la clause WHERE est appelée une jointure interne
<.>
5. Requêtes imbriquées complexes Les requêtes imbriquées entre plusieurs tables peuvent être implémentées via le prédicat IN Le format de syntaxe est le suivant : test_expression[NOT] IN{. <br> sous-requête<code>test_expression[NOT] IN{<br> subquery<br>}
}
Description du paramètre : test_expression fait référence à l'expression SQL, la sous-requête contient la sous-requête d'un certain jeu de résultats
Le principe de la requête imbriquée multi-tables : peu importe le nombre il y a des tables Pour imbriquer, il doit y avoir une certaine corrélation entre les tables. Cette corrélation est établie via la clause WHERE pour implémenter la requête
6. Application de la requête imbriquée dans les statistiques de requête
Quand En implémentant des requêtes multi-tables, vous pouvez utiliser les prédicats ANY, SOME et ALL en même temps. Ces prédicats sont appelés prédicats de comparaison quantitative et peuvent être utilisés conjointement avec des opérateurs de comparaison pour déterminer si toutes les valeurs de retour satisfont aux conditions de recherche. . Les prédicats SOME et ANY existent Quantitatif, il se concentre uniquement sur la question de savoir s'il existe une valeur de retour qui répond aux conditions de recherche. Les deux prédicats ont la même signification et peuvent être utilisés de manière interchangeable. Le prédicat ALL est appelé prédicat universel, et c'est uniquement le cas. se soucie de savoir s'il existe un prédicat qui répond aux exigences de recherche.
SELECT * FROM tb_demo069_people WHERE uid IN(SELECT deptID FROM tb_demo069_dept WHERE deptName='$_POST[select]') SELECT a.id,a.name FROM tb_demo067 AS a WHERE id<3)
>ANY est supérieur à une certaine valeur dans la sous-requête
>=ANY est supérieur ou égal à une certaine valeur dans la sous-requête
518c2f24fe2f91acb17b81c8eed71b4a ANY n'est pas égal à une valeur de la sous-requête
>ALL est supérieur à toutes les valeurs de la sous-requête
> =ALL est supérieur ou égal à toutes les valeurs de la sous-requête
2a33a254a7fb5afb2c849835fc2f4d5bALL n'est pas égal à toutes les valeurs de la sous-requête
7. Utiliser la sous-requête comme table dérivée
Dans le processus de développement de projet réel, elle est souvent utilisée pour comparer les informations à partir d'un Une table d'informations contenant seulement quelques champs clés est dérivée de la table complète. Cet objectif peut être atteint grâce à des sous-requêtes, telles que
SELECT people.name,people.chinese,people.math,people.english FROM (SELECT name,chinese,math,english FROM tb_demo071) AS people
Remarque : les sous-requêtes doivent suivre les règles suivantes :
(1) La sous-requête interne introduite par l'opérateur de comparaison ne contient qu'une seule expression ou nom de colonne. La colonne nommée dans la clause WHERE dans l'instruction externe doit être compatible avec la colonne nommée par la sous-requête interne
( 2) Sous-requêtes introduites par. les opérateurs de comparaison immuables (l'opérateur de comparaison n'est pas suivi du mot-clé ANY ou ALL) n'incluent pas de clause GROUP BY ou HAVING sauf si les valeurs de groupe ou individuelles sont prédéterminées
(3) La liste SELECT introduite avec EXISTS consiste généralement de *, et il n'est pas nécessaire de spécifier les noms de colonnes
(4) Les sous-requêtes ne peuvent pas traiter leurs résultats en interne
8. Utiliser des sous-requêtes pour l'expression Formule
SELECT (SELECT AVG(chinese)FROM tb_demo071),(SELECT AVG(english)FROM tb_demo071),(SELECT AVG(math)FROM tb_demo071) FROM tb_demo071
Remarque : il est préférable de donner un alias aux éléments de la liste lors de l'utilisation d'une sous-requête. Cela permettra aux utilisateurs d'attribuer plus facilement des valeurs aux éléments de la table lors de l'utilisation de la fonction mysql_fetch_array(), telle que <.>
SELECT (SELECT AVG(chinese) FROM tb_demo071) AS yuwen ,(SELECT AVG(english) FROM tb_demo071) AS yingyu,(SELECT AVG(math) FROM tb_demo071) AS shuxue FROM tb_demo071
9. Utilisez des sous-requêtes pour associer des données
SELECT * FROM tb_demo072_student WHERE id=(SELECT id FROM tb_demo072_class WHERE className = '$_POST[text]')
10. Utilisez la requête conjointe multi-tables Utilisez la requête conjointe multi-tables
L'instruction SQL UNION peut afficher des informations de données qualifiées dans différentes tables de la même colonne.
e.x:SELECT * FROM tb_demo074_student UNION SELECT * FROM tb_demo074_fasten
注:使用UNION时应注意以下两点:
(1)在使用UNION运算符组合的语句中,所有选择列表的表达式数目必须相同,如列名、算术表达式及聚合函数等
(2)在每个查询表中,对应列的数据结构必须一样。
十一、对联合后的结果进行排序
为了UNION的运算兼容,要求所有SELECT语句都不能有ORDER BY语句,但有一种情况例外,那就是在最后一个SELECT语句中放置ORDER BY 子句实现结果的最终排序输出。
e.x:SELECT * FROM tb_demo074_student UNION SELECT * FROM tb_demo074_fasten ORDER BY id
使用UNION条件上相对比较苛刻,所以使用此语句时一定要注意两个表项数目和字段类型是否相同
十二、条件联合语句
SELECT * FROM tb_demo076_BEIJING GROUP BY name HAVING name='人民邮电出版社' OR name='机械工业出版社' UNION SELECT * FROM tb_demo076_BEIJING GROUP BY name HAVING name <>'人民邮电出版社' AND name <>'机械工业再版社' ORDER BY id
上面语句应用了GROUP BY分组语句和HAVING语句实现条件联合查询。其实现目的是先保证将'人民邮电出版社'和'机械工业出版社'始终位于名单最前列,然后再输出其它的出版社
十三、简单内连接查询
SELECT filedlist FROM table1 [INNER] JOIN table2 ON table1.column1 = table2.column1
其中,filedlist是要显示的字段,INNER表示表之间的连接方式为内连接,table1.column1=table2.column1用于指明两表间的连接条件,如:
SELECT a.name,a.address,a.date,b.chinese,b.math,b.english FROM tb_demo065 AS a INNER JOIN tb_demo065_tel AS b on a.id=b.id
十四、复杂内连接查询
复杂的内连接查询是在基本的内连接查询的基础上再附加一些查询条件,如:
SELECT a.name,a.address,a.date,b.chinese,b.math,b.english FROM tb_demo065 AS a INNER JOIN tb_demo065_tel AS b on a.id=b.id WHERE b.id=(SELECT id FROM tb_demo065 WHERE tb_demo065.name='$_POST[text]')
总之,实现表与表之间的关联的本质是两表之间存在共同的数据项或者相同的数据项,通过WHERE 子句或内连接INNER JOIN … ON 语句将两表连接起来,实现查询
十五、使用外连接实现多表联合查询
(1)LEFT OUTER JOIN表示表之间通过左连接方式相互连接,也可简写成LEFT JOIN,它是以左侧的表为基准故称左连接,左侧表中所有信息将被全部输出,而右侧表信息则只会输出符合条件的信息,对不符合条件的信息则返回NULL
e.x:SELECT a.name,a.address,b.math,b.english FROM tb_demo065 AS A LEFT OUTER JOIN tb_demo065_tel AS b ON a.id=b.id
(2)RIGHT OUTER JOIN表示表之间通过右连接方式相互连接,也可简写成RIGHT JOIN,它是以右侧的表为基准故称右连接,右侧表中所有信息将被全部输出,而左侧表信息则只会输出符合条件的信息,对不符合条件的信息则返回NULL
E.X:SELECT a.name,a.address,b.math,b.english FROM tb_demo065 AS A RIGHT OUTER JOIN tb_demo065_tel AS b ON a.id=b.id
十六、利用IN或NOTIN关键字限定范围
e.x:SELECT * FROM tb_demo083 WHERE code IN(SELECT code FROM tb_demo083 WHERE code BETWEEN '$_POST[text1]' AND '$_POST[text2]')
利用IN可指定在范围内查询,若要求在某范围外查询可以用NOT IN代替它
十七、由IN引入的关联子查询
e.x:SELECT * FROM tb_demo083 WHERE code IN(SELECT code FROM tb_demo083 WHERE code = '$_POST[text]')
十八、利用HAVING语句过滤分组数据
HAVING子句用于指定组或聚合的搜索条件,HAVING通常与GROUP BY 语句一起使用,如果SQL语句中不含GROUP BY子句,则HAVING的行为与WHERE子句一样.
e.x:SELECT name,math FROM tb_demo083 GROUP BY id HAVING math > '95'
推荐学习:mysql教程
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!