MySQL表操作

目录

一、查看数据库所有表

二、数据表操作

1、创建表

●语法 

●是否可空

●自增(auto_increment)

●主键(primary key)

●唯一索引(unique)

●外键(foreign key)

2、删除表和清空表

3、修改表

4、基本数据类型

三、表内容操作

1、增

2、删

3、改

4、查

三、MySQL测试题


一、查看数据库所有表

show tables;

二、数据表操作

1、创建表

●语法 

create table 表名(

字段名1  类型[(宽度) 约束条件],

字段名2  类型[(宽度) 约束条件],

字段名3  类型[(宽度) 约束条件]

)engine=innodb default chaset=utf8;         #engine=innodb 引擎     default chaset=utf8 字符编码

注意: 1. 在同一张表中,字段名是不能相同 2. 宽度和约束条件可选 3. 字段名和类型是必须的

●是否可空

null表示空,非字符串,null可空,not null不可空

●自增(auto_increment)

如果为某列设置自增列,插入数据时无需设置此列,默认将自增(表中只能有一个自增列)

create table db(
	id int not null auto_increment primary key,  --ID自增
	name char(10)
)engine=innodb default charset=utf8;

 注意:

1、对于自增列,必须是索引(含主键)。

2、对于自增可以设置步长和起始值

●主键(primary key)

主键,一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一。

create table db(
	id int not null auto_increment primary key,  --ID为主键
	name char(10)
)engine=innodb default charset=utf8;

●唯一索引(unique)

唯一索引,指定某列或者几列组合不能重复,

语法:unique 名称(字段)

create table userinfo(
	id int not null auto_increment primary key,
	name char(10),
	phone int(11),
	unique uq_phone(phone)           --phone列设为唯一索引
)engine=innodb default charset=utf8;


--联合唯一
create table userinfo(
	id int not null auto_increment primary key,
	name char(10),
	phone int(11),
    email char(20)
	unique uq_phone_email(phone,email)           --phone、email列设为唯一索引
)engine=innodb default charset=utf8;

●外键(foreign key)

语法:constraint  外键名称  foreign key (关联字段) references 关联表名(关联字段)

一对多关系:

--color表
creat table color(
  nid int not null primary key,
  name char(16) not null
)engine=innodb default charset=utf8;

--fruit表
create table fruit(
  nid int not null primary key,
  smt char(32) null ,
  color_id int not null,
  constraint fk_cc foreign key (color_id) references color(nid)  --外键
)engine=innodb default charset=utf8;

一对一关系:

create table userinfo1(
		id int auto_increment primary key,
		name char(10),
		gender char(10),
		email varchar(64)
)engine=innodb default charset=utf8;

create table admin(
		id int not null auto_increment primary key,
		username varchar(64) not null,
		password VARCHAR(64) not null,
		user_id int not null,
		unique uq_u1 (user_id),   --唯一索引
		CONSTRAINT fk_admin_u1 FOREIGN key (user_id) REFERENCES userinfo1(id)  --外键
)engine=innodb default charset=utf8;

多对多关系:

create table userinfo2(
	id int auto_increment primary key,
	name char(10),
	gender char(10),
	email varchar(64)
)engine=innodb default charset=utf8;

create table host(
	id int auto_increment primary key,
	hostname char(64)
)engine=innodb default charset=utf8;


create table user2host(
	id int auto_increment primary key,
	userid int not null,
	hostid int not null,
	unique uq_user_host (userid,hostid),
	CONSTRAINT fk_u2h_user FOREIGN key (userid) REFERENCES userinfo2(id),
	CONSTRAINT fk_u2h_host FOREIGN key (hostid) REFERENCES host(id)
)engine=innodb default charset=utf8;

2、删除表和清空表

--删除表
drop table 表名

--清空表
delete from t1;           --新增数据时,按id从清空前自增
truncate table t1;        --新增数据时,按id从1开始自增

3、修改表

添加列:alter table 表名 add 列名 类型

删除列:alter table 表名 drop column 列名

修改列:

        alter table 表名 modify column 列名 类型;  -- 类型

        alter table 表名 change 原列名 新列名 类型; -- 列名,类型

添加主键:

        alter table 表名 add primary key(列名);

删除主键:

        alter table 表名 drop primary key;

        alter table 表名  modify  列名 int, drop primary key;

添加外键:alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);

删除外键:alter table 表名 drop foreign key 外键名称  

修改默认值:ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

删除默认值:ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

4、基本数据类型

MySQL的数据类型大致分为:数值、时间和字符串

        bit[(M)]
            二进制位(101001),m表示二进制位的长度(1-64),默认m=1

        tinyint[(m)] [unsigned] [zerofill]

            小整数,数据类型用于保存一些范围的整数数值范围:
            有符号:
                -128 ~ 127.
            无符号:
                0 ~ 255

            特别的: MySQL中无布尔值,使用tinyint(1)构造。

        int[(m)][unsigned][zerofill]

            整数,数据类型用于保存一些范围的整数数值范围:
                有符号:
                    -2147483648 ~ 2147483647
                无符号:
                    0 ~ 4294967295

            特别的:整数类型中的m仅用于显示,对存储范围无限制。例如: int(5),当插入数据2时,select 时数据显示为: 00002

        bigint[(m)][unsigned][zerofill]
            大整数,数据类型用于保存一些范围的整数数值范围:
                有符号:
                    -9223372036854775808 ~ 9223372036854775807
                无符号:
                    0  ~  18446744073709551615

        decimal[(m[,d])] [unsigned] [zerofill]
            准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。

            特别的:对于精确数值计算时需要用此类型
                   decaimal能够存储精确值的原因在于其内部按照字符串存储。

        FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
            单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
                无符号:
                    -3.402823466E+38 to -1.175494351E-38,
                    0
                    1.175494351E-38 to 3.402823466E+38
                有符号:
                    0
                    1.175494351E-38 to 3.402823466E+38

            **** 数值越大,越不准确 ****

        DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
            双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。

                无符号:
                    -1.7976931348623157E+308 to -2.2250738585072014E-308
                    0
                    2.2250738585072014E-308 to 1.7976931348623157E+308
                有符号:
                    0
                    2.2250738585072014E-308 to 1.7976931348623157E+308
            **** 数值越大,越不准确 ****


        char (m)
            char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。
            PS: 即使数据小于m长度,也会占用m长度
        varchar(m)
            varchars数据类型用于变长的字符串,可以包含最多达255个字符。其中m代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。

            注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡

        text
            text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。

        mediumtext
            A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.

        longtext
            A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.


        enum
            枚举类型,
            An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
            示例:
                CREATE TABLE shirts (
                    name VARCHAR(40),
                    size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
                );
                INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');

        set
            集合类型
            A SET column can have a maximum of 64 distinct members.
            示例:
                CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
                INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');

        DATE
            YYYY-MM-DD(1000-01-01/9999-12-31)

        TIME
            HH:MM:SS('-838:59:59'/'838:59:59')

        YEAR
            YYYY(1901/2155)

        DATETIME

            YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)

        TIMESTAMP

            YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)

二进制数据:TinyBlob、Blob、MediumBlob、LongBlob

更多参考:

  • http://www.runoob.com/mysql/mysql-data-types.html
  • http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html

三、表内容操作

1、增

insert into 表 (列名,列名...) values (值,值,值...)
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)
insert into 表 (列名,列名...) select (列名,列名...) from 表

2、删

delete from 表
delete from 表 where 条件

3、改

语法:
    update 表名 set
        字段1=值1,
        字段2=值2,
        where id=1;

示例:
    UPDATE mysql.user SET password=password(‘123’) 
        where user=’root’ and host=’localhost’;

4、查

select * from 表
select * from 表 where id > 1
select nid,name,gender as gg from 表 where id > 1

a、条件

    select * from 表 where id > 1;  --比较运算符:> < >= <= <> !=
    select * from 表 where id > 1 and name != '张三' and num = 12; --逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not
 
    select * from 表 where id between 5 and 16; -- between 5 and 16 值在5到16之间
 
    select * from 表 where id in (11,22,33);       --in(11,22,33) 值是11或22或33
    select * from 表 where id not in (11,22,33);   --not in(11,22,33) 值不是11或22或33
    select * from 表 where id in (select nid from 表);

b、通配符
    select * from 表 where name like 'ale%'  -- ale开头的所有(多个字符串)
    select * from 表 where name like 'ale_'  -- ale开头的所有(一个字符)

c、限制
    select * from 表 limit 5;            -- 前5行
    select * from 表 limit 4,5;          -- 从第4行开始的5行
    select * from 表 limit 5 offset 4    -- 从第4行开始的5行

d、排序
    select * from 表 order by 列 asc              -- 根据 “列” 从小到大排列
    select * from 表 order by 列 desc             -- 根据 “列” 从大到小排列
    select * from 表 order by 列1 desc,列2 asc    -- 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序

e、分组
    select num from 表 group by num
    select num,nid from 表 group by num,nid
    select num,nid from 表  where nid > 10 group by num,nid order nid desc
    select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid
 
    select num from 表 group by num having max(id) > 10
 
    特别的:group by 必须在where之后,order by之前

f、连表
    无对应关系则不显示
    select A.num, A.name, B.name
    from A,B
    Where A.nid = B.nid
 
    无对应关系则不显示
    select A.num, A.name, B.name
    from A inner join B
    on A.nid = B.nid
 
    A表所有显示,如果B中无对应关系,则值为null
    select A.num, A.name, B.name
    from A left join B
    on A.nid = B.nid
 
    B表所有显示,如果B中无对应关系,则值为null
    select A.num, A.name, B.name
    from A right join B
    on A.nid = B.nid

g、临时表
    (select name,num from A) as a --生成临时表a,生成的临时表可以和其他表连表操作

h、判断
    case when 条件 then 结果1 else 结果2 end 
 
i、组合
    组合,自动处理重合
    select nickname
    from A
    union
    select name
    from B
 
    组合,不处理重合
    select nickname
    from A
    union all
    select name
    from B

三、MySQL测试题

1)、表关系

请创建如下表,并创建相关约束MySQL表操作_第1张图片

2、操作表 

1、自行创建测试数据

2、查询“生物”课程比“物理”课程成绩高的所有学生的学号;

3、查询平均成绩大于60分的同学的学号和平均成绩; 

4、查询所有同学的学号、姓名、选课数、总成绩;

5、查询姓“李”的老师的个数;

6、查询没学过“叶平”老师课的同学的学号、姓名;

7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;

8、查询学过“叶平”老师所教的所有课的同学的学号、姓名;

9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;

10、查询有课程成绩小于60分的同学的学号、姓名;

11、查询没有学全所有课的同学的学号、姓名;

12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;

13、查询至少学过学号为“001”同学所选课程中任意一门课的其他同学学号和姓名;

14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;

15、删除学习“叶平”老师课的SC表记录;

16、向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩; 

17、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;

18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

19、按各科平均成绩从低到高和及格率的百分数从高到低顺序;

20、课程平均分从高到低显示(现实任课老师);

21、查询各科成绩前三名的记录:(不考虑成绩并列情况) 

22、查询每门课程被选修的学生数;

23、查询出只选修了一门课程的全部学生的学号和姓名;

24、查询男生、女生的人数;

25、查询姓“张”的学生名单;

26、查询同名同姓学生名单,并统计同名人数;

27、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;

28、查询平均成绩大于85的所有学生的学号、姓名和平均成绩;

29、查询课程名称为“数学”,且分数低于60的学生姓名和分数;

30、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名; 

31、求选了课程的学生人数

32、查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;

33、查询各个课程及相应的选修人数;

34、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;

35、查询每门课程成绩最好的前两名;

36、检索至少选修两门课程的学生学号;

37、查询全部学生都选修的课程的课程号和课程名;

38、查询没学过“叶平”老师讲授的任一门课程的学生姓名;

39、查询两门以上不及格课程的同学的学号及其平均成绩;

40、检索“004”课程分数小于60,按分数降序排列的同学学号;

41、删除“002”同学的“001”课程的成绩;

答案:https://blog.csdn.net/qq_41922768/article/details/84502794

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