MYSQL 구문에 대한 자세한 요약(예제 포함)

不言
풀어 주다: 2019-02-15 14:30:51
앞으로
3314명이 탐색했습니다.

이 기사는 MYSQL 구문에 대한 자세한 요약을 제공합니다(예제 포함). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

사용자 관리

새 사용자 및 비밀번호 만들기: foo는 이름, 123은 비밀번호, locahost는 로그인을 위한 고정 주소입니다.

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

사용자 비밀번호 설정 및 변경:

#以下为三种更改方式
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword')
#若果是当前登录用户
SET PASSWORD = PASSWORD('newpassword')
update mysql.user set password=password('newpassword') where User='username' and Host='host'
#只要更改了用户及密码
flush privileges
로그인 후 복사

사용자 삭제:

Delete FROM user Where User='test' and Host='localhost';
flush privileges;
# 删除用户的数据库
drop database testDB; 
# 删除账户及权限
drop user 用户名@ localhost;
로그인 후 복사

승인:

GRANT INSERT,DELETE,UPDATE,SELECT ON databasename.tablename TO 'username'
@'host'
flush privileges
로그인 후 복사

지침:

(1)권한-사용자의 작업 권한(예: SELECT, INSERT, UPDATE) <br/>(2)데이터베이스 이름-데이터베이스 이름, 테이블 이름-테이블 이름, 사용자에게 해당 작업 권한을 부여하려는 경우 사용 가능 모든 데이터베이스 및 테이블에서.* <br/>과 같은 의미입니다. (3) 새 사용자를 설정하거나 비밀번호를 변경한 후 플러시 권한을 사용하여 MySQL 시스템 권한 관련 테이블을 새로 고쳐야 하며 그렇지 않으면 액세스가 거부됩니다. 방법은 mysql 서버를 다시 시작하여 새로운 설정을 적용하는 것입니다. Effective

권한 보기:

show grants for root@localhost;
로그인 후 복사
  • 권한 제거:

# GRANT的反操作,去除权限
 REVOKE SELECT ON db_name.* TO name;
로그인 후 복사

원격 MySQL(ubuntu)에 로그인: mysql -h 원격 포트 -u 사용자 -p 비밀번호

# 需远程ip和端口:10.10.101.111:30061  远程mysql的用户及密码
mysql -h 10.10.101.111 -P 30061 -u root -p 123456
로그인 후 복사

MYSQL 데이터 유형 h 참조: http://www.php.cn/mysql-tutorials-415213.html

데이터베이스

데이터베이스 보기: 데이터베이스 표시
  • 데이터베이스 생성: 데이터베이스 생성 db_name;
  • 데이터베이스 사용: USE db_name;
  • 데이터베이스 삭제: DROP DATABASE db_name;
  • 설정
  • 데이터베이스 인코딩
  • : 이름 설정 utf8;

    테이블
테이블 생성:

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高效不支持全文检索
로그인 후 복사

Settings
    테이블 인코딩
  • : 테이블 이름 생성(…) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    테이블 복사: CREATE TABLE tb_name2 SELECT * FROM tb_name
  • 일부 사본: CREATE TABLE tb_names SELECT id,name FROM tb_namr;
  • 임시 테이블 생성: CREATE TEMPORARY TABLE tb_name;
  • 임시 테이블: 클라이언트 및 서버 세션에서 특정 트랜잭션을 처리하고 공간과 개인 정보를 절약하는 데 사용됩니다.

  • 사용 가능한 테이블 보기 데이터베이스: SHOW TABLES;
  • 테이블 보기 구조: DESCRIBE tb_name; 또는 SHOW COLUMNS FROM tb_name;
  • 테이블 삭제: DROP [ TEMPORARY ] TABLE [ IF EXISTS ] tb_name[ ,tb_name2…….];
  • DROP TABLE IF EXISTS `db_school`,`Student`;
    로그인 후 복사

테이블 별칭: SELECT a.title ,a.content,u.username FROM 기사 AS a, 사용자 AS u 여기서 a.aid=1 및 a.uid=u.uid
  • 테이블 이름 바꾸기
  • : 이름 이름을 name_new로 변경하십시오. (id,name,score) VALUES(NULL, 'Zhang San',140),(NULL,'Zhang Si',178),(NULL,'Zhang Wu',134)

    참고: 여러 조각을 삽입하는 경우 데이터의 바로 뒤에 쉼표를 추가하세요

  • 검색 삽입 출력 데이터:

    INSERT INTO tb_name(name,score) SELECT name Score FROM tb_name2;

Update data
    UPDATE tb_name SET Score=180 WHERE id=2;
  • UPDATE 테이블 이름 SET 컬럼 이름=NewValue[WHERE 조건]


    <br/>데이터 삭제: DELETE FROM tb_name WHERE id=3;

  • 조건 제어

    where 문:
  • 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;
    로그인 후 복사

    그룹 기준 설명으로
    GROUP BY 및 WHERE 결합 쿼리: <br/>열 a를 선택하고 필터 조건이 필터 조건이 있는 열별로 그룹화되는 테이블 이름에서 집계 함수

    함께 결합하면 where가 먼저 오고 group by가 마지막에 옵니다. 즉, 먼저 xx에서 xx를 선택하는 레코드 세트를 필터링할 위치를 사용한 다음 그룹 기준을 사용하여 필터링된 결과를 그룹화하고, had 절을 사용하여 그룹화된 결과를 필터링합니다
  • HAVING 문:


    SELECT * FROM tb_name WHERE id=3;
    로그인 후 복사

    Having Usage

*위 3가지 연습

:


재인쇄: 사용 분석별 mysql 그룹화(상세)


관련 조건 제어 문자: <br/>

SELECT * FROM tb_name GROUP BY score HAVING count(*)>2;
로그인 후 복사


다중 조건 쿼리:


 =、>、<、<>、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
로그인 후 복사

그룹 쿼리: 그룹 쿼리는 지정된 열에 따라 그룹화할 수 있습니다SELECT COUNT() FROM tb_name GROUP BY 점수 HAVING COUNT(

)>1

참고: 위의 조건은 HAVING, GROUP BY를 사용하여 열별로 정렬합니다

Sort: ORDER BY 컬럼_이름 ASC| //데이터의 내림차순과 오름차순 정렬
  • 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;
    로그인 후 복사

  • MySQL 공통 연산자
  • 정규 표현식
    : SELECT * FROM tb_name WHERE REGEXP '^[A-D]'; "^ ”를 사용하여 이름의 시작 부분을 일치시키고 A-D로 시작하는 이름을 찾습니다. * 정규식 연습: <br/>참조 블로그: MYSQL은 정규식을 사용하여 데이터를 필터링합니다.

  • Subquery
  • 여기서 하위 쿼리 유형: (내부 쿼리 결과를 다음과 같이 처리합니다. 외부 쿼리 비교 조건)

    #不用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);
    로그인 후 복사
    • 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;
    로그인 후 복사
    • exists型子查询:(把外层查询结果拿到内层,看内层的查询是否成立)

    #查询哪些栏目下有商品,栏目表category,商品表goods
    select cat_id,cat_name from category where exists(select * from goods where goods.cat_id = category.cat_id);
    로그인 후 복사

    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
    로그인 후 복사

    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 ...
    로그인 후 복사
    • 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 ;
    로그인 후 복사

    解释: <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个空格
    로그인 후 복사

    <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 ) //
    로그인 후 복사

    日期时间类 <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) //开平方
    로그인 후 복사

    游标

    定义:游动的标识,相对于普通的一次性查询给出所有结果;游标的作用就是对数据样本中一条一条分析处理,像个指针。 <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;
    로그인 후 복사

    性能优化

    查询实例

    数据库题:学生表,选课表,课程表 设教学数据库中有三个基本表: <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);
    로그인 후 복사
    • 写出检索全是女同学选修的课程的课程号的SQL语句。

    select Cno  from Student,SC where Student.Sno=SC.Sno AND Student.Sex=&#39;nv&#39;;
    로그인 후 복사
    • 写出下列插入操作的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;
    로그인 후 복사
    • 试写出下列删除操作的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;);
    로그인 후 복사
    • 查询“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指定列
    로그인 후 복사
    • 查询所有同学的学号、姓名、选课数、总成绩;

    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;
    로그인 후 복사


    위 내용은 MYSQL 구문에 대한 자세한 요약(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿