mySQL笔记

作者: 强壮de西兰花 | 来源:发表于2017-04-01 19:08 被阅读37次

    1、MySQL启动和关闭
    (安装及配置请参照百度经验,这里不再记录。MySQL默认端口号:3306;默认数据类型格式:utf8)
    法①:我的电脑→右击→管理→服务和应用程序→选中MySQL→右击→启动 (关闭:选择“关闭”)



    法②:cmd→net start mysql (关闭:net stop mysql)

    2、MySQL的登录和退出
    (在进入MySQL的DOS命令中,cls有清屏功能,登录MySQL以后,该语句无法实现)

    参数
    详细
    描述

    -D
    --database=name
    打开指定的数据库

    -V
    --version
    输出版本信息并退出

    -u
    --user=name
    用户名

    -P
    --port=#
    端口号

    -p
    --password[=name]
    密码

    -h
    --host=name
    服务器

    登录:
    a、输入“mysql -uroot -p”,再按回车键。(root是绝对用户)
    b、在“Enter password:”后输入密码,再按回车键;若未设定密码,直接按回车键
    c、提示成功登录MySQL,成功登陆后有“mysql>”标识


    退出:
    输入“exit;”或“quit;”或“\q;”(“;”是MySQL语句中必须包含的结束标识符)
    提示Bye,即表示退出MySQL


    3、快捷输入
    按方向键“↑”、“↓”可以快速填充历史输入数据。

    4、MySQL语句的规范
    关键字与函数名称全部大写;
    数据库名称、表名称、字段名称全部小写;
    SQL语句必须以分号结尾(若未填写分号, 会有一个“->”的提示,表示期待一个结束的命令)。

    5、MySQL常用命令
    显示当前服务器版本 SELECT VERSION();
    显示当前日期 SELECT NOW();
    显示当前用户 SELECT USER();
    SELECT 查询表数据,SHOW 显示有许多形式,提供信息数据库、表、列,或状态信息服务器。

    6、数据库的创建、查看、修改、删除
    ("{}"为必选项,"[]"为可选项,"|"表示从中选择)
    创建:
    CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name
    查看(打开):
    SHOW {DATABASES | SCHEMAS} [LIKE 'pattern' | WHERE expr]
    修改:
    ALTER {DATABASES | SCHEMAS} [db_name] [DEFAULT] CHARACTER SET [=] charset_name
    删除:
    DROP {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    示例:
    创建一个数据库t1


    查看数据库t1


    再次创建一个数据库,命名t1,会有错误提示。这时忽略错误提示加入“IF NOT EXISTS”就不再提示错误,这时虽然没有错误但是会出现警告


    查看警告


    创建数据类型为gbk格式的数据库


    修改数据库t2的类型


    删除数据库
    (查看所有的数据库SHOW DATABASES)


    7、数据类型
    数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型。
    有符号型,数字的最高位用0和1表示±,无符号位没有正负性,无符号型的大致是有符号型存储的2倍。
    1字节=8位(1B=1bit)
    整型
    数据类型
    存储范围
    字节

    TINYINT
    有符号型:-128127(-2^72^7 -1),无符号型0255(02^8 -1)
    1

    SMALLINT
    有符号型:-215~215 -1,无符号型0~2^16 -1
    2

    MEDIUMINT
    有符号型:-223~223 -1,无符号型0~2^24 -1
    3

    INT
    有符号型:-231~231 -1,无符号型0~2^32 -1
    4

    BIGINT
    有符号型:-263~263 -1,无符号型0~2^64 -1
    8

    浮点型
    数据类型
    存储范围
    字节

    FLOAT[(M,D)]
    -3.402823466E+38~-1.175494351E-38、0和 1.175494351E-38 ~3.402823466E+38
    4

    DOUBLE[(M,D)]
    -1.7976931348623157E+308-2.2250738585072014E-308、0和2.2250738585072014E-308 1.7976931348623157E+308
    8

    【注】M是数字总位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保值。单精度浮点数值精确到大约7位小数位。E+38 表示10^38

    日期时间型
    列类型
    字节
    存储范围

    YEAR
    1
    YEAR[(2|4)] 缺省为4位格式,4位格式取值范围为1901 - 2155,0000,2位格式取值范围为70-69(1970-2069)

    TIME
    3
    -838:59:59~838:59:59

    DATE
    3
    1000-1-1~9999-12-31

    DATETIME
    8
    日期时间, 1000-1-1 00:00:00~9999-12-31 23:59:59

    TIMESTAMP
    4
    时间戳,1970-1-1 00:00~2037年的某个时刻

    【注】实际开发中“日期时间型”用得比较少,因为考虑到跨时区的问题,一般会用数字类型取代

    MySQL本身Y2K安全的,但是呈交给MySQL的输入值可能不是。一个包含2位年份值的任何输入是由二义性的,因为世纪是未知的。这样的值必须被解释成4位形式,因为MySQL内部使用4位存储年份。
    对于DATETIME, DATE, TIMESTAMP和YEAR类型,MySQL使用下列规则的解释二义性的年份值:
    -在范围00-69的年值被变换到2000-2069。
    -在范围70-99的年值被变换到1970-1999。

    记得这些规则仅仅提供对于你数据的含义的合理猜测。如果MySQL使用的启发规则不产生正确的值,你应该提供无二义的包含4位年值的输入。

    字符型
    列类型
    存储需求

    CHAR(M)
    (定长,不足用空格自动补全)M个字节,0<=M<=255

    VARCHAR(M)
    (变长,输入多少就是多少)L+1个字节,其中L<=M,0<=M<=65535

    TINYTEXT
    L+1个字节,其中L<2^8 (1个字节表示最大存储范围,下同)

    TEXT
    L+2个字节,其中L<2^16

    MEDIUMTEXT
    L+3个字节,其中L<2^24

    LONGTEXT
    L+4个字节,其中L<2^32

    ENUM('value1','value2',…)
    (最终选择其中的一个value)1或2个字节,取决于枚举值的个数(最多65535个)

    SET ('value1','value2',…)
    (集合,可在其中做任意的排列组合)1、2、3、4或者8个字节,取决于set成员的数目(最多64个)

    8、数据表操作
    数据表(或称:表)是数据库中最重要的组成部分之一,是其他对象的基础。
    关系型数据表,是一张二维表格,所谓二维表格就具有行和列。行称为记录,列称为字段。数据表是数据的载体。

    打开数据库
    要想进行数据表相关的操作,必须要在一个数据库中进行,那么就要打开一个数据库
    USE



    显示被打开的数据库


    创建数据表
    CREATE TABLE [IF NOT EXISTS] table_name (column_name data_type,…)
    column_name 列名称 data_type数据类型
    数据表有多少列一定是经过项目分析得到的,不是凭空想象而来的。



    【注】UNSIGNED 无符号型,最后一个列不需要再用“,”隔开

    查看数据表列表
    SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr]
    查看当前数据库下的所数据列表



    查看其它数据库下的数据列表(但是实际上并没有离开当前的数据库)


    查看数据表结构
    SHOW COLUMNS FROM tbl_name



    【注】 NULL 代表没有值(空)。

    9、记录(行)操作
    插入记录(行)
    INSERT [INTO] tbl_name [(col_name,…)] VALUES(val,…)
    col_name:列名称 (列名称可以省略)VALUES:值



    省略掉col_name后,就必须为所有的字段都赋值。字段不满时会提示错误“列不匹配第一行数据”;
    当指定列名称后,就无需输入所有字段。


    显示记录(行)
    SELECT expr,… FROM tbl_name
    expr 表达式



    “*”此时,表示筛选全字段,即查看所有记录

    空值与非空
    NULL,字段值可以为空(NULL 和空格是两码事);
    NOT NULL ,字段值禁止为空
    NUL 字节与 NULL 值不同;NUL 为一个零值字节,而 NULL 代表没有值(空)。



    (系统默认可以为空,所以NULL可以不写)

    查看数据表结构,提示username不允许为空


    若把name插入一个空值,系统会提示错误


    10、约束初识(根据功能)
    一般在列类型后添加约束字段
    自动编号
    AUTO_INCREMENT
    必须与主键组合使用,默认情况下,起始值为1,每次的增量为1,从而可以保证数据的唯一性。
    每次递增1,说明是数值型,可以为整数,也可以为浮点数。若为浮点数,小数位数一定要为0。



    (提示自动编号必须与主键一起使用)

    主键约束(PRIMARY KEY)
    每张数据表只能存在一个主键;
    主键保证记录的唯一性;
    主键自动为NOT NULL;
    自动编号必须与主键一起使用,但是主键不一定非要与自动编号一起使用。

    创建一个带有主键约束的数据表



    (也可以直接输入KEY,无需写PRIMA)

    输入多个记录后,再查看记录,即可发现是自动编号的


    唯一约束(UNIQUE KEY)
    唯一约束可以保证记录的唯一性
    唯一约束的字段可以为空值(NULL);
    每张数据表可以存在多个唯一约束。
    【注】字段可以为空,表示两条或两条以上的记录,这个字段都可以为空。但如果多个字段为空,那么就说明记录是相同的,这与“保证记录的唯一性”是背离的,所以只能有一个空值!

    创建一个带有主键约束和唯一约束的数据表


    “username”插入相同的数据后,提示重复,即表示记录是唯一的


    默认约束
    DEFAULT(默认值)
    当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。

    创建一个带有默认值的数据表


    可以看到“sex”已经有了默认值


    输入username,不输入sex的情况下,系统默认sex为3


    11、约束(根据功能)
    1.约束保证数据的完整性和一致性;
    2.约束分为表级约束和列级约束。根据约束针对的字段多少决定的,如果约束只针对于某一字段来使用,
    3.称为列级约束;如果约束针对两个或两个以上的字段来使用,称为表级约束。
    约束按照类型(功能)划分:
    NOT NULL(非空约束)
    PRIMARY KEY(主键约束)
    UNIQUE KEY(唯一约束)
    DEFAULT(默认约束)
    FOREIGN KEY(外键约束)

    外键约束
    1.保证数据一致性,完整性;
    2.实现一对一或一对多的关系;
    3.外键约束的要求:
    a.父表(子表参照的表)和子表(具有外键列的表)必须使用相同的存储引擎,而且禁止使用临时表;
    b.数据表的存储引擎只能为INNODB;
    c.外键列(加过FOREIGN KEY的列)和参照列(外键列参照的列)必须具有相似的数据类型,其中数字的长度、是否有符号位必须相同;而字符的长度可以不同;
    d.外键列和参照列必须创建索引,如果外键列不存在索引的话,MySQL将自动创建索引(参照列没有索引,MySQL自动创建;外键列没有索引,MySQL不会创建)。

    编辑数据表的默认存储引擎
    MySQL配置文件
    default-storage-engine=INNODB

    创建一个数据表,默认存储引擎为InnoDB


    再次创建一个数据表,但外键列(pid)和参照列(id)的数据类型不一致,所以提示“无法添加外键约束”foreign key constraint(外键约束)


    外键列(外键:pid)和参照列(主键:id)的数据类型一致时,查看参照列数据表索引,可以查到参照列id已经有索引


    查看外键列数据表的索引,可以看到id和pid均有索引


    显示users数据表结构,可以看到


    12、外键约束的参照操作
    1.CASCADE:从父表删除或更新记录时,同时自动删除或更新子表中匹配的行
    2.SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL
    3.RESTRICT:拒绝对父表的删除或更新操作
    4.NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同
    进行了外键约束的创建以后,在更新表时,子表是否也进行相应的操作

    CASCADE


    要更新相应的行,必须要先存在记录,所以要分别在两张表中插入记录。在插入记录时,一定要先插入主表(province)中的记录,在插入次表(user1)中的记录,因为次表是要参照主表的,所以一定要遵循先后顺序。

    给主表插入数据


    给子表插入数据
    (为什么“id”不是“123”而是“134”——虽然('jack',7)记录没有写入成功,但是编号已经递增了1,所以编号变成了“134”。)


    删除主表中的一条记录,子表相应的记录也会删除


    只有数据表的存储引擎为INnoDB的类型时,我们才能使用外键约束,如果是其他类型我们也想使用的话,就不能定义物理外键,要定义逻辑外键(那么我们在定义两张表结构的时候,按照存在的某种结构去定义,但是不去使用“FOREIGN KEY”这个关键词)。

    13、表级约束与列级约束(根据操作数目)
    对一个数据列建立的约束,称为列级约束。
    对多个数据列建立的约束,称为表级约束。
    列级约束既可以在列定义时声明,也可以在列定以后声明;表级约束只能在列定义后声明。
    NOT NULL ,DEFAULT就不存在表级约束

    列级约束


    14、修改数据表
    添加单列
    ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]
    FIRST:所添加的列放在首列;
    AFTER col_name:放所添加的列在某列之后。
    不加 [FIRST | AFTER col_name]所添加的列在所有列的最后面。
    添加单列,所有的列不需要加入小括号,可以指定位置关系

    添加多列
    ALTERTABLE tbl_name ADD [COLUMN] (col_name column_definition,…)
    添加单列,所有的列需要加入小括号,不可以指定位置关系,添加后就在原来列的后方

    删除列
    ALTER TABLE tbl_name DROP [COLUMN] col_name



    也可以让删除、添加列同时进行~

    添加主键约束
    ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,…)


    添加唯一约束
    创建的时候约束写在列名称、类型之后,添加的时候约束卸载列名称、类型之前
    唯一约束可以有多个,主键约束只能有一个
    ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY] [index_name] [index_type] (index_col_name,…)


    添加外键约束
    ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,…) reference_defintion


    添加/删除默认约束
    ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}


    15、修改数据表
    删除主键约束
    ALTER TABLE tbl_name DROP PRIMARY KEY


    删除唯一约束
    ALTER TABLE tbl_name DROP {INDEX | KEY} index_name
    查看索引 ,确定唯一约束名称


    删除唯一约束,查看索引,已经删除


    删除外键约束
    ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
    查看外键约束名称


    删除外键约束后,可以查看已删除


    修改列定义
    ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]

    把“age”放在数据表的第一列


    修改类型
    (有大类型改成小类型,可能会导致数据丢失)


    修改列名称
    ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER] col_name

    修改列名称、定义


    修改数据表名称
    法①
    ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name
    法②(可为多张数据表更名)
    RENAME TABLE tbl_name TO new_tabl_name [, tbl_name2 TO new_tbl_name2] …

    法①


    法②:


    【注】以后尽量少使用数据列、数据表修改,假如表名、列名被引用的话,修改之后可能会导致某些视图或过程无法正常的工作

    16、操作数据表
    插入记录1(行)
    INSERT [INTO] tbl_name [(col_name,…)] {VALUES | VALUE} ({exper | DEFAULT},…),(…),…
    如果列名称(col_name)省略掉的话,所有的字段都需要赋值,每个字段之间要用逗号分隔,否则将出现错误。

    为默认的自动编号的字段赋值,可以写入空值(NULL)或者默认值(DDEFAULT),仍然遵守默认递增的形式


    也可插入表达式
    [图片上传中。。。(63)]

    如表格中某个字段是默认值(这里是age),当该字段插入“DEFAULT”时,将自动赋值默认值


    一次性插入多条记录(md5哈希值)
    [图片上传中。。。(65)]

    插入记录2(set语句)
    INSERT [INTO] tbl_name SET col_name={expr | DEFAULT},…
    与上一种的区别在于,此方法可以使用子查询(SubQuery),这个一次性只能插入一条记录


    插入记(SELECT语句)
    INSERT [INTO] tbl_name [(col_name,…)] SELECT …
    此方法可以将查询结果插入到指定数据表

    单表更新记录(UPDATE)
    UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}]… [WHERE whre_condition]

    如果省略where条件,修改列中的所有的记录都将更新


    可以同时修改多列


    增加条件语句,只会修改对应的记录(id%2=0:表示偶数,除以2的余数为0)


    单表删除记录
    DELETE FROM tbl_name [WHERE where_condition]

    删除记录,再次插入,此编号为原来所有记录编号+1


    查询表达式解析、查找记录
    SELECT select_expr [,select_expr …]
    [
    FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | position} [ASC | DESC],…]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position} [ASC | DESC], …]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    ]
    每一个表达式表示想要的一列,必须至少有一个;
    多个列之间以英文逗号分隔;
    星号()表示所有列,tbl_name.可以表示命名表的所有列;
    查询表达式可以使用[AS] alias_name为其赋予别名;
    别名可用于GROUP BY ,ORDRE BY或HAVING子句。

    只查询数据表中的部分记录


    查询表达式的顺序可以和原数据表中字段的顺序不一致
    (SELECT查询表达式的顺序将影响着结果的顺序)


    在使用多表连接的时候,存在两张不同的表存在相同的字段,如果致谢字段名的话就分不清这个字段到底属于哪张数据表,tbl_name.col_name可以清晰地分辨出这个字段属于哪张数据表


    查询数据表并赋予别名
    (字段的别名也会影响结果集当中的字段的别名)
    [图片上传中。。。(75)]

    AS可以省略,但最好写下,因为当别名和数据表中真实存在的字段一致的情况下,它指的就是别名,而不是这个字段。


    条件表达式
    对记录进行过滤,如果没有指定WHERE子句,则显示所有记录。
    在WHERE表达式中,可以使用MySQL支持的函数或运算符。

    17、查询结果
    查询结果分组
    [GROUP BY {col_name | position} [ASC | DESC],…]
    分组的时候既可以指定列的列名,也可以指定列的位置。ASC 升序(默认),DESC降序。多个分组条件之间要用逗号进行分割,

    按照性别对所有记录进行分组


    SELECT语句中第一个出现的字段,建议不要指定位置


    分组条件
    [HAVING where_condition]
    分组可以对全部记录进行分组,也可以对指定记录进行分组。在指定HAVING分组条件的时候,一定要保证分组的条件要么为一个聚合函数(只有一个返回结果的函数),要么抱着这个字段必须出现在当前的SELECT语句中,否则会出现错误
    [图片上传中。。。(79)]

    分组结果进行排序
    [ORDER BY {col_name | expr | position} [ASC | DESC],…]
    可以按某一个字段排序,也可以按位置进行排序


    也可以多个字段进行排序,如果第1个字段没有排列出自己想要的结果,那就会一次进行第2个、3个依次类推。
    age升序排列(默认),相同的age记录根据id降序进行排列


    限制分组结果返回的数量
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]

    查询结果,显示两条记录(从第一条记录开始计数)
    [图片上传中。。。(82)]

    SELECT语句记录是从0开始编号,若想显示编号“3、4”则输入“2,2”


    id号和结果集中排列顺序没有任何关系,只要排在结果集中第一个位置,那么就是0(offset偏移值)。不管它ID是多少
    [图片上传中。。。(84)]

    INSERT SELECT 将查询的结果插入到数据表
    [图片上传中。。。(85)]

    18、SELECT子查询
    记录的写操作:INSERT(增)、DELETE(删)、UPDATE(改)
    记录的读取操作:SELECT(查)
    出现乱码时要使用gbk的形式,而不是utf8的形式。

    在客户端以gbk的形式显示数据,但是它不影响数据表中的数据类型,仅仅改变的显示的类型
    SET NAMES gbk;

    子查询概述
    子查询(Subquery)是指出现在其他SQL语句内的SELECT子句。子查询指嵌套在查询内部,切必须始终出现在圆括号内。子查询可以包含多个关键字或条件,如:
    DISTINCT、GROUP BY、ORDER BY、LIMIT、函数等
    子查询的外层查询可以是:SELECT,INSERT,UPDATE,SET或DO

    示例:
    SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2);
    其中SELECT * FROM t1,称为Out Query/Out Statement (外层查询/外层声明)
    SELECT col2 FROM t2,称为Subquery
    在外层查询中可以发现,其中的增、删、改、查都可以带有子查询,这里的查询指的是已知的所有SQL命令的统称

    子查询的结果可以是标量、一行、一列或子查询,结果可以被其他SQL语句所使用

    使用比较运算符的子查询
    使用比较运算符
    =、>、<、>=、<=、<>、!=、<=>
    语法结构
    operand comparison_operator subquery

    SELECT AVG (col_name) FROM tbl_name;
    查找数据表中某列的平均值
    [图片上传中。。。(86)]

    对平均值四舍五入,并保留小数点后的2位
    [图片上传中。。。(87)]

    查询本表中哪些商品的价格超过5636.36
    SELECT goods_id,goods_name,goods_price FROM tdb_goods FROM tdb_goods WHERE goods_price >= 5636.36;
    通过子查询
    SELECT goods_id,goods_name,goods_price FROM tdb_goods FROM tdb_goods WHERE goods_price >= (SELECT ROUND (AVG(goods_price),2) FROM tdb_goods);

    查询某个数据的一个属性
    查询所有超极本的数量
    SELECT goods_price FROM tdb_goods WHERE goods_cate ='超极本'
    [图片上传中。。。(88)]

    用ANY、SOME或ALL修饰的比较运算符
    operand comparison_operator ANY (subquery) 满足其中一个就可以
    operand comparison_operator SOME (subquery) 满足其中一个就可以
    operand comparison_operator ALL (subquery) 满足所有才可以
    使用ANY、SOME、ALL关键字的返回值

    ANY
    SOME
    ALL

    、>=
    最小值
    最小值
    最大值

    <、<=
    最大值
    最大值
    最小值

    =
    任意值
    任意值

    <>、!=

    任意值

    查询哪些商品的的价格超过超极本的价格
    SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > ANY (SELECT goods_price FROM tdb_goods WHERE goods_cate ='超极本');

    [NOT] IN 子查询
    operand comparison_operator [NOT] IN (subquery)
    =ANY运算符与IN等效;
    !=ALL或<>ALL运符与NOT IN等效

    [NOT] EXISTS子查询
    如果子查询返回任何行,EXISTS将返回TRUE;否则为FALSE。

    将查询结果写入数据表
    INSERT [INTO] tbl_name [(col_name,…)] SELECT …

    (查询列结构 DESC tbl_name)
    示例~
    查询结果:
    SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
    将查询结果写入数据表:
    INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

    19、多表更新
    参照另外的表更新本标的记录
    UPDATE table_references SET col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}]…[WHEREwhere_condition]

    语法结构
    table_reference
    {[INSERT | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}
    table_REFERENCE
    ON conditional_expr
    连接类型
    INNER JOIN,内连接
    在MySQL中,JOIN、CROSS JOIN和INNER JOIN是等价的
    LEFT [OUTER] JOIN,左外连接
    RIGHT [OUTER] JOIN,右外链接

    示例:
    UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate =cate_name SET goods_cate = cate_id;

    CREATE…SELECT
    创建数据表同时将查询结果写入到数据表
    CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition,…)] select_statement

    [图片上传中。。。(89)]

    当两个数据表格都有相同的列时,更新此列的数据要给表格设置别名
    UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS b ON g.brand_name = b.brand_name SET g.brand_name = b.brand_id
    但是原来的数据表结构无法改变

    [图片上传中。。。(90)]

    20、连接
    MySQL在SELECT语句、多表更新、夺标删除语句中支持JOIN操作。

    table_reference {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN} tabl_reference ON conditional_expr
    两张表之间的连接,连接类型有:内连接、左外连接、有外链接,ON 后面跟的是连接条件

    数据表参照
    table_reference tbl_name [ [AS] alias ] | table_subquery [AS] alias
    数据表可以使用tbl_name AS alias_name 或 tbl_name alias_name 赋予别名,table_subquery可以作为子查询使用在FROM子句中,这样的子查询必须为其赋予别名。

    连接条件
    使用ON关键字来设定连接条件,页可以使用WHERE来代替,通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果集记录的过滤。

    连接类型
    内连接
    INNER JOIN,内连接(在MySQL中,JOIN,CROSS JOIN 和 INNER JOIN 是等价的)
    仅显示同时符合左、右两表之间连接条件的记录
    示例:
    SELECT goods_id,goods_name,cate_name FROm tdb_goods INNER JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;

    左外连接
    LEFT [OUTER] JOIN ,左外连接
    显示坐标全部的记录及右表符合连接条件的记录
    示例:
    SELECT goods_id,goods_name,cate_name FROm tdb_goods LEFT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;

    右外连接
    RIGHT [OUTER] JOIN,右外连接
    显示坐标全部的记录及左表符合连接条件的记录
    示例:
    SELECT goods_id,goods_name,cate_name FROm tdb_goods RIGHT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;

    多表连接
    示例:
    SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id INNER JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id;

    连接说明
    外连接
    A LEFT JOIN B join_condition
    数据表B的结果集依赖数据表A;
    数据表A的结果集根据左链接条件依赖所有数据表

    20、无限级分类表设计
    无限级分类一般包括:分类的ID、分类的名称、父类的ID
    查找无限分类的数据表就需要进行自身连接
    示例,一张无限分类的数据表
    [图片上传中。。。(91)]

    自身连接
    同一个数据表对其自身进行连接
    【注】若一字表做自身连接一定要给表取一个别名
    示例:参照子表 (左边是父表,右边是字表子表)
    SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p ON s.parent_id = p.type_id;

    [图片上传中。。。(92)]
    示例:参照父表 (左边是子表,右边是字表父表)
    SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id;

    [图片上传中。。。(93)]

    示例:参照子表并分组按照顺序排列
    SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id;
    [图片上传中。。。(94)]

    显示子类数量
    SELECT p.type_id,p.type_name,count (s.type_name)child_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id;
    [图片上传中。。。(95)]
    多表删除
    DELETE tbl_name[.] [,tbl_name[.]]… FROM table_references [WHERE where_condition]
    要先查找
    【查找具有两条及两条以上记录的数据:
    DELETE tbl_name[.] [,tbl_name[.]]… FROM table_references GROUP BY tbl_name[.*] HAVING count ()】having引用

    相关文章

      网友评论

        本文标题:mySQL笔记

        本文链接:https://www.haomeiwen.com/subject/fbqwottx.html