MySQL基础知识

一、MySQL基础

1、表的命名

(1)名字可以由当前字符集中的任何字母数字字符组成,下划线(_)和美元符($)也可以
(2)名字最长为64个字符

2、表的结构

(1)行:字段
         1.字段名最长可达64个字符
         2.字段名可包含中文、英文字母、数字、下划线(_)、井字符(#)、货币符($)及at符(@)
         3.同一个表中,各个字段的名称绝对不能重复
         4.字段名可以用中文
(2)列:数据记录

3、MySQL数据库常用的数据类型:

(1)字符型(一个汉字两个字符)
    char(n):固定长度字符串
    varchar(n):长度可变字符串
(2)日期类型
    date:日期(年月日)
    datetime:精确到毫秒   时间(年月日时分秒)
    smalldatetime:精确到秒
(3)数值型(MySQL没有double型)
    int
    float
    decimal:对精度要求较高

二、MySQL完整性约束

1、完整性约束的作用 (确保表中的数据完整)

(1)实体完整性
       1.能够唯一标识表中的每一条记录
       2.实现方式:主键、唯一键、标识列
(2)域完整性
       1.表中特定列数据的有效性,确保不会输入无效的值
       2.实现方式:数据类型、默认值、检查约束、非空值
(3)参照完整性
       1.维护表间数据的有效性、完整性
       2.实现方式:建立外键关联另一个表的主键
(4)自定义完整性
    1.根据业务处理流程定义的特定业务规则
    2.实现方式:储存过程、触发器、规则

2、完整性约束条件

    (1)主键(primary key):要求主键列数据唯一,并且不能为空
    (2)唯一约束(unique):要求该列数据唯一,允许为空,但只能出现一个空值
    (3)检查约束(check):某列取值范围限制、格式限制等
    (4)默认约束(default):某列的默认值
    (5)外键(foreign key):用于两表间建立关系,需要指定引用主表的哪列
*主键与唯一性约束的区别
      1.主键所在的列不允许有空值,唯一约束所在的列允许有一个空值
      2.每个表中只可以有一个主键,但可以有多个唯一键

3、列级完整性约束条件

     a.  primary key(相当于默认为not null)
     b.  not null/null
     c.  unique(默认约束)
    例:pricr money default 0.01
     d.  default
     e.  auto_increment(指定设置字段的值自动增加)

4、表级完整性约束条件

    (1)主键约束:primary key
            语法格式:[constraint] <约束名> primary key(约束名)
            primary key(书号,书店编号,销售日期),
    (2)外键约束:foreign key
            语法格式:[constraint] <约束名> foreign key(<外键>) references <被参照表(主键)>
    (3)唯一性约束:unique
            语法格式:[constraint] <约束名> unique(<字段名>)
            例:idcard char(18) unique null
    (4)检查约束:check(条件表达式)
            语法格式:[constraint] <约束名> chack (条件表达式)
            例:chksex check (sex in('男','女'))
                   Phone char(8) check (phone like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
                  sex char(10) check(sex='male' or sex='female') default 'male',
  例:create table sc(
           sno char(10) primary key,
           con varchar(5) not null,
           degree float check (degree>=0 and degree<=100),
           foreign key(con) references course(cno)
         );

create table student(student_no char(10) primary key comment '学号',

student_name char(10) not null comment '姓名',

student_contact char(11) not null comment '学生联系方式' check(student_contact rlike '[0-1][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),

class_no int comment '学生班级',

foreign key(class_no) references classes(class_no));

1. 在定义基本表语句时,NOT NULL参数的作用是什么?
答:数据库字段属性,使用NOT NULL后该字段不接受NULL值。如果你想在表中插入数据时,NOT NULL的字段必须赋值,可以是空值,但是不能为NULL。

2. 主键可以建立在“值为NULL”的列上吗?
答:不可以,规定主键的值不能为空

三、SQL语句创建、查看、修改、复制、删除表

1、创建表(利用create table命令)

        语法结构:
        create table <表明>(
         <字段1> <数据类型1> [<列级完整性约束条件1>]
         [,<字段2> <数据类型2> [<列级完整性约束条件2>]] [,...]
         [,<表级完整性约束1>]
         [,<表级完整性约束2>] [,...]
         );
    说明:<>:必选项
               [ ]:可选项
    例:create table teaching
          (con char(5) not null,
           ton varcher(4) not null,
           cterm tinyint,
           foreign key (cno) references coures (cno),
           foreign key (tno) references coures (ton)
           );

2、查看表结构(利用describe/desc语句可以查看表的字段信息,其中包括:字段名、字段数据类型、是否为主键、是否有默认值等)

        语法格式:
        describe <表名>;
        desc <表名>;

MySQL基础知识_第1张图片
3、show create table 语句可以查看创建表时的create table 语句

语法格式:
        show create table <表名>; 

4、修改表(利用alter table)

        语法格式:alter table <表名>{
         [add <新字段名> <数据类型> [<列级完整性约束条件>][first|after 已存在的字段名] ]
         |[modify <字段名1> <新数据类型> [<列级完整性约束条件>] [first|after 字段名2]]
         |[change <旧字段名> <新字段名> <新数据类型>]
         |[drop <字段名> | <完整性约束名>]
         |[rename [to] <新表名>]
        };

        例:alter table tb_student add familycontacts varchar(8);
               alter table tb_student rename to student;
               alter table student drop familycontacts ;

5、复制表

        语法格式:
        create table 新表名 select * from 旧表名

6、删除表

        语法格式:
        drop table [if exists] <表名1> [,[表名2],...];

 *在编写SQL语句时,遵循某种准则可以提高语句的可读性,并且易于编辑,这是很有好处的。
    1.SQL语句对大小写不敏感。但是为了提高SQL语句的可读性,子句开头的关键字通常采用大写形式。
    2.SQL语句可写成一行或多行,习惯上每个子句占用一行。
    3.关键字不能在行于行之间分开,并且很少采用缩写形式
    4.SQL语句的结束符为分号“;”,分号必须放在语句中最后一个子句的后面,但可以不在同一行。

四、SQL语句添加、修改、删除数据记录

1、数据库的创建

1、创建mydb数据库:create database mydb;
2、显示当前的所有数据库:show database
3、删除mydb数据库:drop datdbase mydb;
        Mysql -h localhost -r root -p
        Create database if not exists mydb;
        Show databases;
        Use mydb;
        Drop database if exists mydb
        alter database db_test character set gbk;
        Show engines;

        Use mydb;
        Create database mydb character set gbk(
                Cno char(8),
                Sname char(10)
        );

4、MySQL的数据库文件有几种?扩展名分别是什么?
     答:数据文件:.myd  索引文件:.myi   表定义文件:.frm  日志文件:.log

2、添加数据记录

    语法格式:insert into <表名>[(列名1,列名2,...)]
        values (<常量清单>);
    例1:insert into course
             values(‘C01’,’数据库’),(‘C02’,’数学’);
    例2:insert into student (sno,sname)
             values('2002010102','张三');

3、插入子查询结果(通过insert命令将表中满足条件的数据移入一个新表中)

    语法格式:insert into <表名>[(列名1,列名2,...)]<子查询语句>
    例:把平均成绩大于80分的学生的学号和平均成绩存入另一个已知的基本表s_grade(SNO,AVG_GRADE)中
           1、通过select语句从sc表中查询出平均成绩大于80的学生
           2、通过insert命令将这些数据移入新表s_grade中
           insert into s_grade(sno,avg_grade)
           select sno,avg(degree)
           from sc
           group by sno
           having avg(degree)>80

    group by 分组 having 条件
    order by 排序 desc(降序)

4、更新数据记录

    语法格式:update <表名>
        set <列名1>=<表达式1>[,<列名2>=<表达式2>][,...]
        [where<条件表达式>];
    set命令:给字段赋新值
    例1:update student
            set ssex='女',sdept='软件系'
            where sname='张丽';
    例2:update sc
             set degree=600
             where degree<60;
    例3:update sc
             set degree=0
             where sno in(select sno from student where sdept='计算机工程系');

5、删除数据记录

    语法格式:delete [from] <表名>
         [where<条件表达式>];
    例1:delete from student
             //where sno='2005030301';
    例2:delete from sc;
    例3:delet from sc
             where sno in(select sno from student where sdept='计算机工程系');
    *delete语句只能删除一个基本表中的数据记录,但是,在where语句中条件表达式可以来自几个表的复合条件

思考题:
1. 现有某学生办理退学,要求删除学生信息管理数据库中该生的数据记录,两表间存在主从关系,请回答应先删除主表的记录还是子表的记录?并说明原因。
答:先删除子表记录在删除主表记录。因为子表与主表一一对应,删除主表记录时,需要先把子表对应的记录删除,否则无法删除

你可能感兴趣的:(mysql,mysql,数据库,sql)