Maison > base de données > tutoriel mysql > Résumé détaillé de la syntaxe MYSQL (avec exemples)

Résumé détaillé de la syntaxe MYSQL (avec exemples)

不言
Libérer: 2019-02-15 14:30:51
avant
3318 Les gens l'ont consulté

Cet article vous apporte un résumé détaillé de la syntaxe MYSQL (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Gestion des utilisateurs

Créer un nouvel utilisateur et un mot de passe : foo est le nom, 123 est le mot de passe, locahost est la connexion à l'adresse fixe

# 以下为两种创建方式
CREATE USER foo@localhost IDENTIFIED BY ‘123’ 
insert into mysql.user(Host,User,Password) values("localhost","test",password("1234"));
#只要更改了用户及密码
flush privileges
Copier après la connexion

Définir et modifier le mot de passe de l'utilisateur : <br/>

#以下为三种更改方式
SET PASSWORD FOR &#39;username&#39;@&#39;host&#39; = PASSWORD(&#39;newpassword&#39;)
#若果是当前登录用户
SET PASSWORD = PASSWORD(&#39;newpassword&#39;)
update mysql.user set password=password(&#39;newpassword&#39;) where User=&#39;username&#39; and Host=&#39;host&#39;
#只要更改了用户及密码
flush privileges
Copier après la connexion

Supprimer l'utilisateur : <br/>

Delete FROM user Where User=&#39;test&#39; and Host=&#39;localhost&#39;;
flush privileges;
# 删除用户的数据库
drop database testDB; 
# 删除账户及权限
drop user 用户名@ localhost;
Copier après la connexion

Autorisation :

GRANT INSERT,DELETE,UPDATE,SELECT ON databasename.tablename TO &#39;username&#39;
@&#39;host&#39;
flush privileges
Copier après la connexion

Description :

(1) privilèges autorisations d'opération de l'utilisateur, telles que SELECT, INSERT, UPDATE <br/> (2) nom de base de données - nom de base de données, nom de table - nom de table Si vous souhaitez accorder à l'utilisateur les autorisations d'opération correspondantes sur toutes les bases de données et tables, vous pouvez utiliser <🎜. > pour l'exprimer, comme .* (3) Après avoir configuré un nouvel utilisateur ou modifié le mot de passe, vous devez utiliser les privilèges de vidage pour actualiser la table associée aux autorisations système MySQL, sinon l'accès sera refusé. Une autre méthode consiste à redémarrer le serveur MySQL pour que les nouveaux paramètres prennent effet.

Afficher les autorisations :

show grants for root@localhost;
Copier après la connexion
  • Supprimer les autorisations :

# GRANT的反操作,去除权限
 REVOKE SELECT ON db_name.* TO name;
Copier après la connexion
Connectez-vous à MySQL distant (ubuntu) : mysql - h -P port distant -u utilisateur - p mot de passe

# 需远程ip和端口:10.10.101.111:30061  远程mysql的用户及密码
mysql -h 10.10.101.111 -P 30061 -u root -p 123456
Copier après la connexion

Type de données MYSQL

Référence : http://www.php.cn/mysql-tutorials-415213.html

Base de données

  • Voir la base de données : AFFICHER BASES DE DONNÉES ;

  • Créer une base de données : CREATE DATABASES nom_base ;

  • Utiliser la base de données : UTILISER nom_base ;

  • Supprimer la base de données : DROP DATABASE db_name ;

  • Définir

    l'encodage de la base de données  : définir les noms utf8 ; Définir

    l'encodage de la table
  •  : créer le nom de la table ; (…) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Copier la table : CREATE TABLE tb_name2 SELECT * FROM tb_name

CREATE TABLE table_name(
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(60) NOT NULL,
score TINYINT UNSIGNED NOT NULL DEFAULT 0,PRIMARY KEY(id)
)ENGINE=InnoDB;//设置表的存储引擎,一般常用InnoDB和MyISAM;InnoDB可靠,支持事务;MyISAM高效不支持全文检索
Copier après la connexion
  • Copie partielle : CREATE TABLE tb_names SELECT id,name FROM tb_namr;

    Créer une table temporaire : CREATE TEMPORARY TABLE tb_name
  • Table temporaire : utilisée dans les sessions client-serveur pour traiter des transactions spécifiques, économisant ainsi de l'espace et de la confidentialité.
  • Afficher les tables disponibles dans la base de données : SHOW TABLES ;
  • Afficher la structure des tables : DESCRIBE tb_name ou SHOW COLUMNS FROM tb_name ;

  • Supprimer la table : DROP [ TEMPORARY ] TABLE [ IF EXISTS ] tb_name[ ,tb_name2…….];
  • Alias ​​de table : SELECT a.title,a.content,u.username FROM article AS a, user AS u où a.aid=1 et a.uid =u.uid

  • Renommer la table
  •  : RENAME TABLE name_old TO name_new ; ou ALTER TABLE name_old RENAME name_new ;
DROP TABLE IF EXISTS `db_school`,`Student`;
Copier après la connexion
  • Modifier la structure de la table : ALTER TABLE tb_name ADD[CHANGE, RENAME, DROP]

  • Données

  • Insérer les données :
  • INSERT INTO tb_name(id,name,score) VALUES(NULL,'Zhang San ',140),(NULL,'Zhang Si',178),(NULL,'Zhang Wu',134);

    Remarque
  •  : Insérez plusieurs données directement suivies d'une virgule
ALTER TABLE tb_name ADD COLUMN address varchar(80) NOT NULL;
ALTER TABLE tb_name DROP address;
ALTER TABLE tb_name CHANGE score score SMALLINT(4) NOT NULL;
Copier après la connexion

Insérer les données récupérées :
    INSERT INTO tb_name(name,score) SELECT name score FROM tb_name2;


  • Mettre à jour les donnéesUPDATE tb_name SET score=180 WHERE id=2; UPDATE tablename SET columnName=NewValue[WHERE condition]

  • Supprimer les données : <br/>DELETE FROM tb_name WHERE id=3;

  • Contrôle conditionnel

    instruction Where :

  • Grouper par <br/>Grouper par explication

    GROUP BY et WHERE joint requête :
  • sélectionnez la colonne a, fonction d'agrégation à partir du nom de la table où la condition de filtre groupe par colonne a ayant la condition de filtre
Lorsqu'ils sont combinés, où vient en premier, le groupe par vient en dernier. Autrement dit, utilisez d'abordwhere pour filtrer le jeu d'enregistrements de select xx from xx, puis utilisez group by pour regrouper les résultats filtrés et utilisez la clause have pour filtrer les résultats groupés

Instruction HAVING :


SELECT * FROM tb_name WHERE id=3;
Copier après la connexion
Avoir une utilisation



*Pratique des trois ci-dessus
 : <br/>

Réimpression : groupe MySQL par analyse d'utilisation (détaillée)


Caractères de contrôle de condition associés :
SELECT * FROM tb_name GROUP BY score HAVING count(*)>2;
Copier après la connexion

Requête multi-conditions :


Requête de groupe : la requête de regroupement peut être regroupée en fonction de la colonne spécifiée
 =、>、<、<>、IN(1,2,3......)、BETWEEN a AND b、NOT
 AND 、OR
 Like()用法中      %  为匹配任意、  _  匹配一个字符(可以是汉字)
 IS NULL 空值检测 IS NOT NULL 
 IN   NOT IN  // 
 limit [offset,] N #如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1) : SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
Copier après la connexion
SELECT COUNT(
    ) FROM tb_name GROUP BY score HAVING COUNT(
  • )>1

    Remarque : les conditions ci-dessus utilisent HAVING, GROUP BY par colonne Trier

SELECT * FROM tb_name 
WHERE id=1003 AND price<=10 
# WHERE id=1003 OR price<=10 
# WHERE id IN(1002,1003)
# WHERE id NOT IN(1002,1003)
# WHERE name like &#39;%huxx&#39;
Copier après la connexion
Trier : ORDER BY nom_colonne DESC|ASC ; // Trier par ordre décroissant et croissant des données

  • Opérateurs communs MySQL <br/>

  • Expressions régulières

     :

    SELECT * FROM tb_name WHERE REGEXP '^[A-D]'
  • Explication : utilisez "^" pour faire correspondre les noms Commencez par trouver le nom commençant par A-D
* Pratique des expressions régulières :
 SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;
Copier après la connexion
Blog de référence : MYSQL utilise des expressions régulières pour filtrer les données

Sous-requête

où tapez sous-requête : ( Traitez le résultat de la requête interne comme la condition de comparaison de la requête externe)

#不用order by 来查询最新的商品
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);
#取出每个栏目下最新的产品(goods_id唯一)
select cat_id,goods_id,goods_name from goods where goods_id in(select max(goods_id) from goods group by cat_id);
Copier après la connexion
  • from型子查询: (把内层的查询结果供外层再次查询)

#先查出哪些同学挂科两门以上
select name,count(*) as gk from stu where score < 60 having gk >=2;
#以上查询结果,我们只要名字就可以了,所以再取一次名字
select name from (select name,count(*) as gk from stu having gk >=2) as t;
#找出这些同学了,那么再计算他们的平均分
select name,avg(score) from stu where name in (select name from (select name,count(*) as gk from stu having gk >=2) as t) group by name;
Copier après la connexion
  • exists型子查询:(把外层查询结果拿到内层,看内层的查询是否成立)

#查询哪些栏目下有商品,栏目表category,商品表goods
select cat_id,cat_name from category where exists(select * from goods where goods.cat_id = category.cat_id);
Copier après la connexion

MySQL函数

  • distinct : 去重 Select player_id,distinct(task_id) from task; <br/>distinct去除重复样本(多个字段)

  • select distinct Student.Sno,Sname from Student (另一种方式)

  • 字符串连接——CONCAT() <br/>SELECT CONCAT(name,”==>”,score) FRON tb_name;

  • 数学函数: <br/>AVG、SUM、MAX、MIN、COUNT

  • 文本处理函数: <br/>TRIM、LOCATE、UPPER、LOWER、SUNSTRING

  • 运算符: <br/>+、-、*、\

  • 时间函数: <br/>DATE()、CURTIME()、DAY()、YEAR()、NOW()…..

JOIN详解

join 用于多表中字段之间的联系

... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona
Copier après la connexion

JOIN 按照功能大致分为如下三类: <br/>* INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录 <br/>* LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录 <br/>* RIGHT JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录

注意:mysql不支持Full join,不过可以通过UNION 关键字来合并 LEFT JOIN 与 RIGHT JOIN来模拟FULL join. <br/>具体参考博客Mysql Join语法解析与性能分析

UNION规则

UNION 用于把来自多个 SELECT 语句的结果组合到一个结果集合中:在多个 SELECT 语句中,对应的列应该具有相同的字段属性

SELECT column,... FROM table1  UNION [ALL] SELECT column,... FROM table2 ...
Copier après la connexion
  • UNION 与 UNION ALL 的区别: <br/>使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION <br/>具体参考博客MySQL UNION 与 UNION ALL 语法与用法

视图

视图是从一个或多个表中导出来的表,是一种虚拟存在的表。数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。 <br/>背景:安全性、查询性能提高 <br/> - 使操作简单化,可以对经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件 <br/> - 增加数据的安全性,通过视图,用户只能查询和修改指定的数据。 <br/> - 节省空间,内容是总是一致的话,那么我们不需要维护视图的内容,维护好真实表的内容,就可以保证视图的完整性了 <br/> - 提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响 <br/>工作机制:当调用视图的时候,才会执行视图中的sql,进行取数据操作。视图的内容没有存储,而是在视图被引用的时候才派生出数据。这样不会占用空间,由于是即时引用,视图的内容总是与真实表的内容是一致的。更新视图可以更新真实表。 <br/>视图与数据库:

视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。 <br/>视图的建立和删除只影响视图本身,不影响对应的基本表 <br/>某些视图是可更新的。也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的。 <br/>视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。

索引

  • 10W条数据,检索nickname=’css’ <br/>

    • 一般:SELECT * FROM award WHERE nickname = ‘css’ :mysql需要扫描全表及扫描10W条数据找这条数据

    • 索引: 在nickname上建立索引,那么mysql只需要扫描一行数据

  • 索引分为单列索引(主键索引,唯索引,普通索引)和组合索引 <br/>

    • 单列索引:一个索引只包含一个列,一个表可以有多个单列索引.

    • 组合索引:一个组合索引包含两个或两个以上的列

单列索引:

  • 普通索引,这个是最基本的索引 <br/>ALTER table SC ADD INDEX Sno_Index(Sno); //注意符号,不是单引号 <br/>注意: 字段:CHAR,VARCHAR,类型,索引:length可以小于字段的实际长度,如果是BLOB和TEXT类型就必须指定长度

  • 唯一索引: 唯一索引要求所有的类的值是唯一的,这一点和主键索引一样.但是它允许有空值 <br/>create UNIQUE INDEX sname ON Student(Sname);

  • 主键索引,不允许有空值: <br/>规则:int优于varchar,一般在建表的时候创建,最好是与表的其他字段不相关的列或者是业务不相关的列.一般会设为 int 而且是 AUTO_INCREMENT自增类型的

组合索引

一个表中含有多个单列索引不代表是组合索引,通俗一点讲 组合索引是:包含多个字段但是只有索引名称 <br/>创建:CREATE INDEX Tno_Tname_index ON Teacher(Tno,Tname);

全文索引

文本字段上(text)如果建立的是普通索引,那么只有对文本的字段内容前面的字符进行索引,其字符大小根据索引建立索引时申明的大小来规定. <br/>建立: ALTER TABLE tablename ADD FULLTEXT(column1, column2)

删除索引

DORP INDEX IndexName ON TableName

查看索引

show index from tblname;

这块参考博客细说mysql索引 ,写的很详细。 <br/>索引原理:索引原理

存储

一组为了完成特定功能的SQL语句集,经过编译后存储在数据库中。当希望在不同应用程序或者平台上执行相同函数时,或封装特定功能时,存储过程是非常有用的。存储过程类似一个可编程函数。MySQL 中,单个 Store Procedure(SP) 不是原子操作,要使整个存储过程成为一个原子操作的办法是:在存储过程主体开始部分。 <br/>注意:非事务导致存储过程没有原子性即过程有的成功有的失败,变为事务增加原子性,即使执行过程出错,出错前的操作将不会真正执行。http://www.cnblogs.com/fnlingnzb-learner/p/6861376.html

优点: <br/>1. 执行速度快:存储过程会预编译,查询优化器会对其优化。 <br/>2. 可多次调用及修改 <br/>3. 功能灵活:可用流程控制语句编写,完成复杂运算 <br/>4. 安全:设置存储过程权限,保证数据安全 <br/>5. 减少流量:调用存储过程时,网络只传输此调用语句即可

语法

  • 结构: <br/>CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过程体

DELIMITER //
  CREATE PROCEDURE myproc(OUT s int)
    BEGIN
      SELECT COUNT(*) INTO s FROM students;
    END
    //DELIMITER ;
Copier après la connexion

解释: <br/>(1)分隔符:mysql默认“;”,“DELIMITER //”声明分隔符 ,最后“DELIMITER ;”还原分隔符 <br/>(2)参数:输入、输出、输入输出参数{IN,OUT,INOUT} 具体参考mysql存储

  • 变量 <br/>

    1. DECLARE局部变量: DECLARE var_name[,…] type [DEFAULT value] <br/>要给变量提供一个默认值,请包含一个DEFAULT子句。值可以被指定为一个表达式,不需要为一个常数。如果没有DEFAULT子句,初始值为NULL。 局部变量的作用范围在它被声明的BEGIN … END块内

    2. 变量SET语句:SET var_name = expr [, var_name = expr] <br/>被参考变量可能是子程序内声明的变量,或者是全局服务器变量

    3. SELECT … INTO 语句:SELECT col_name[,…] INTO var_name[,…] table_expr <br/>把选定的列直接存储到变量

  • 基本常用函数:参考博客:Mysql存储过程 <br/>

字符串类:默认第一个字符下标为1,即参数position必须大于等于1 <br/> <br/>

CHARSET(str) //返回字串字符集 
CONCAT (string2 [,... ]) //连接字串 
INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0 
LCASE (string2 ) //转换成小写 
LEFT (string2 ,length ) //从string2中的左边起取length个字符 
LENGTH (string ) //string长度 
LOAD_FILE (file_name ) //从文件读取内容 
LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定开始位置 
LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为length 
LTRIM (string2 ) //去除前端空格 
REPEAT (string2 ,count ) //重复count次 
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str 
RPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length 
RTRIM (string2 ) //去除后端空格 
STRCMP (string1 ,string2 ) //逐字符比较两字串大小, 
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符, 
TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符 
UCASE (string2 ) //转换成大写 
RIGHT(string2,length) //取string2最后length个字符 
SPACE(count) //生成count个空格
Copier après la connexion

<span style="font-family: "Microsoft Yahei", "Hiragino Sans GB", Helvetica, "Helvetica Neue", 微软雅黑, Tahoma, Arial, sans-serif;">数学类 </span><br/>

ABS (number2 ) //绝对值 
BIN (decimal_number ) //十进制转二进制 
CEILING (number2 ) //向上取整 
CONV(number2,from_base,to_base) //进制转换 
FLOOR (number2 ) //向下取整 
FORMAT (number,decimal_places ) //保留小数位数 
HEX (DecimalNumber ) //转十六进制 
注:HEX()中可传入字符串,则返回其ASC-11码,如HEX(&#39;DEF&#39;)返回4142143 
也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19 
LEAST (number , number2 [,..]) //求最小值 
MOD (numerator ,denominator ) //求余 
POWER (number ,power ) //求指数 
RAND([seed]) //随机数 
ROUND (number [,decimals ]) //四舍五入,decimals为小数位数] 
注:返回类型并非均为整数,如下文: 
SIGN (number2 ) //
Copier après la connexion

日期时间类 <br/>

ADDTIME (date2 ,time_interval ) //将time_interval加到date2 
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区 
CURRENT_DATE ( ) //当前日期 
CURRENT_TIME ( ) //当前时间 
CURRENT_TIMESTAMP ( ) //当前时间戳 
DATE (datetime ) //返回datetime的日期部分 
DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间 
DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime 
DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间 
DATEDIFF (date1 ,date2 ) //两个日期差 
DAY (date ) //返回日期的天 
DAYNAME (date ) //英文星期 
DAYOFWEEK (date ) //星期(1-7) ,1为星期天 
DAYOFYEAR (date ) //一年中的第几天 
EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分 
MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串 
MAKETIME (hour ,minute ,second ) //生成时间串 
MONTHNAME (date ) //英文月份名 
NOW ( ) //当前时间 
SEC_TO_TIME (seconds ) //秒数转成时间 
STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示 
TIMEDIFF (datetime1 ,datetime2 ) //两个时间差 
TIME_TO_SEC (time ) //时间转秒数] 
WEEK (date_time [,start_of_week ]) //第几周 
YEAR (datetime ) //年份 
DAYOFMONTH(datetime) //月的第几天 
HOUR(datetime) //小时 
LAST_DAY(date) //date的月的最后日期 
MICROSECOND(datetime) //微秒 
MONTH(datetime) //月 
MINUTE(datetime) //分返回符号,正负或0 
SQRT(number2) //开平方
Copier après la connexion

游标

定义:游动的标识,相对于普通的一次性查询给出所有结果;游标的作用就是对数据样本中一条一条分析处理,像个指针。 <br/>使用: <br/>1. 声明: declare 游标名 cursor for select_statement; <br/>2. 打开: open 游标名 <br/>3. 取值: fetch 游标名 into var1,var2[,…] <br/>4. 关闭:close 游标名;

事务

Mysql事务主要用于处理操作量大,复杂度高的数据。例如:当你删除一样东西时,你得把它自身及所依赖的东西都要删除。所有这些操作行为形成一个事务。 <br/>注意: <br/> - MYSQL中:只有Innodb数据库引擎的数据库或表才支持事务 <br/> - 事务处理用来维护数据库完整性即保证批量SQL语句全部执行或者全部不执行 <br/> - 事务用来管理insert,update,delete语句 <br/> 事务满足4个条件: <br/> 1. 事务的原子性:要么成功,要么失败 <br/> 2. 稳定性: 有非法数据,事务撤回 <br/> 3. 隔离性: 事务独立运行 <br/> 4. 可靠性:当发生奔溃,InnoDB数据表驱动会利用日志文件重构修改 <br/> 参考博客事务

导入导出

  • 导出整个数据库:mysqldump -u 用户名 -p 数据库名 > 导出的文件名

  • 导出一个表: mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

  • 导出一个数据结构: mysqldump -u dbuser -p -d –add-drop-table dbname >d:/dbname_db.sql (-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table)

  • 导入数据库:

use 数据库;
source d:/dbname.sql;
Copier après la connexion

性能优化

查询实例

数据库题:学生表,选课表,课程表 设教学数据库中有三个基本表: <br/>学生表 Student(Sno,Sname,Age,Sex),其属性表示学生的学号、姓名、年龄和性别; <br/>选课表 SC(Sno,Cno,score),其属性表示学生的学号、所学课程的课程号和成绩; <br/>课程表 Course(Cno,Cname,Tho),其属性表示课程号、课程名称和任课教师姓名; <br/>教师表 Teacher (Tno,Tname),其属性表示教师号、教师名称; <br/>下面的题目都是针对上述三个基本表操作的。 <br/>*导入sql文件:source course.sql; sql文件编码格式:无BOM的UTF-8

drop database IF EXISTS db_school;
CREATE database db_school;
use db_school;
DROP TABLE IF EXISTS `db_school`.`Student`; 
create table Student  
(  
    Sno varchar(20),  
    Sname varchar(50), 
    Age smallint,
    Sex varchar(5),
    primary key (Sno)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

DROP TABLE IF EXISTS `db_school`.`Course`;  
create table Course  
(  
    Cno varchar(20),  
    Cname varchar(50),    
    Tno varchar(20),  
    primary key (Cno)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
DROP TABLE IF EXISTS `db_school`.`SC`;  
create table SC  
(  
    Sno varchar(20),  
    Cno varchar(20),      
    score int,  
    primary key (Sno,Cno)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

DROP TABLE IF EXISTS `db_school`.`Teacher`;  
create table Teacher  
(  
    Tno varchar(20),  
    Tname varchar(50),    
    primary key (Tno)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
INSERT INTO `Student`(Sno,Sname,Age,Sex) VALUES (&#39;001&#39;,&#39;陈一&#39;,25,&#39;nan&#39;);  
INSERT INTO `Student`(Sno,Sname,Age,Sex) VALUES (&#39;002&#39;,&#39;郭二&#39;,20,&#39;nv&#39;);  
INSERT INTO `Student`(Sno,Sname,Age,Sex) VALUES (&#39;003&#39;,&#39;张三&#39;,25,&#39;nv&#39;);  
INSERT INTO `Student`(Sno,Sname,Age,Sex) VALUES (&#39;004&#39;,&#39;李四&#39;,22,&#39;nan&#39;);  
INSERT INTO `Student`(Sno,Sname,Age,Sex) VALUES (&#39;005&#39;,&#39;王五&#39;,23,&#39;nan&#39;);  
INSERT INTO `Teacher`(Tno,Tname) VALUES (&#39;001&#39;,&#39;张老师&#39;);  
INSERT INTO `Teacher`(Tno,Tname) VALUES (&#39;002&#39;,&#39;王老师&#39;);  
INSERT INTO `Teacher`(Tno,Tname) VALUES (&#39;003&#39;,&#39;钱老师&#39;);  
INSERT INTO `Teacher`(Tno,Tname) VALUES (&#39;004&#39;,&#39;刘老师&#39;);  
INSERT INTO `Teacher`(Tno,Tname) VALUES (&#39;005&#39;,&#39;胡老师&#39;);  
INSERT INTO `Course`(Cno,Cname,Tno) VALUES (&#39;001&#39;,&#39;语文&#39;,&#39;张老师&#39;);  
INSERT INTO `Course`(Cno,Cname,Tno) VALUES (&#39;002&#39;,&#39;数学&#39;,&#39;王老师&#39;);  
INSERT INTO `Course`(Cno,Cname,Tno) VALUES (&#39;003&#39;,&#39;英语&#39;,&#39;钱老师&#39;);  
INSERT INTO `Course`(Cno,Cname,Tno) VALUES (&#39;004&#39;,&#39;物理&#39;,&#39;刘老师&#39;);  
INSERT INTO `Course`(Cno,Cname,Tno) VALUES (&#39;005&#39;,&#39;政治&#39;,&#39;胡老师&#39;);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;001&#39;,&#39;001&#39;,50);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;001&#39;,&#39;002&#39;,60);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;001&#39;,&#39;003&#39;,70);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;001&#39;,&#39;004&#39;,80);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;001&#39;,&#39;005&#39;,90);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;002&#39;,&#39;001&#39;,90);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;002&#39;,&#39;002&#39;,80);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;002&#39;,&#39;003&#39;,70);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;002&#39;,&#39;004&#39;,60);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;002&#39;,&#39;005&#39;,50);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;003&#39;,&#39;001&#39;,81);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;003&#39;,&#39;002&#39;,82);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;003&#39;,&#39;003&#39;,83);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;003&#39;,&#39;004&#39;,84);  
INSERT INTO `SC`(Sno,Cno,score) VALUES (&#39;003&#39;,&#39;005&#39;,85);
Copier après la connexion
  • 写出检索全是女同学选修的课程的课程号的SQL语句。

select Cno  from Student,SC where Student.Sno=SC.Sno AND Student.Sex=&#39;nv&#39;;
Copier après la connexion
  • 写出下列插入操作的SQL语句:把SC表中每门课程的平均成绩插入到另一个已存在的表SC_C(C#,CNAME, AVG_GRADE)中,其中 AVG_GRADE 为每门课程的平均成绩。

# 先创建SC_C表,自行创建insert into SC_C select SC.Cno,Cname,AVG(score) AS Avg_score FROM Course,SC WHERE Course.Cno=SC.Cno GROUP BY SC.Cno;
Copier après la connexion
  • 试写出下列删除操作的SQL语句:从SC表中把王老师的女学生选课元组删去。

delete from SC where Sno in (select Sno from Student where Sex=&#39;nv&#39;) AND Cno in (select Cno from Course where Tno=&#39;王老师&#39;);
Copier après la connexion
  • 查询“001”课程比“002”课程成绩高的所有学生的学号;

select a.Sno from (select Sno,score FROM SC where Cno=&#39;001&#39;) AS a ,(select Sno,score FROM SC where Cno=&#39;002&#39;) AS  b  WHERE a.score > b.score;//当两个表存在相同列名时,用tablename.columnname指定列
Copier après la connexion
  • 查询所有同学的学号、姓名、选课数、总成绩;

select Student.Sno,Student.Sname,count(SC.Cno),sum(SC.score) from Student left OUTER join SC on Student.Sno=SC.Sno group by Student.Sno,Student.Sname;
Copier après la connexion


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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal