1.定义基本表
SQL语句使用create table 语句定义表名,
create table基本格式:
create table <表名> (<字段名><字段类型>[字段的约束条件],
<字段名><字段类型>[字段的约束条件],
....................................
[表级完整性约束条件] );
这些完整性约束条件被存在系统的数据字典中,当用户操作表时数据库管理系统将自动检测操作是否违背这些约束条件。表中存在多个字段约束条件则将这些约束条件,定义在表级上。
示例.
学生表:Sno(学号),Sname(姓名),Ssex(性别),Sage(年龄),Sdept(系);
课程表:Cno(课程号),Cname(课程名),Cpno(先行课),Ccred(学分)
学生选课表:Sno(学生学号),Cno(课程号),Grade(成绩)
创建一个学生表:
//学生表
mysql> create database student;
Query OK, 1 row affected (0.01 sec)
mysql> use student
Database changed
mysql> create table stu(Sno char(9) primary key,//将表中的字段Sno设置为stu表的主键,主键不能为NULL且唯一
-> Sname varchar(11) unique,//学生姓名唯一
-> Ssex char(2),
-> Sage int,
-> Sdept varchar(12));
Query OK, 0 rows affected (0.10 sec)
创建课程表:
mysql> create table Course(
-> Cno char(4) primary key,
-> Cname varchar(20) NOT NUll,
-> Cpno char(4),
-> Ccred smallint,
-> foreign key(Cpno)references Course(Cno));
Query OK, 0 rows affected (0.05 sec)
注:当在设置表级完整性约束条件时,外码在参考,表的主码时,外码的类型要和主码的类型相同
创建学生选课表:
mysql> create table SC(
-> Sno char(9),
-> Cno char(4),
-> Greade int,
-> primary key(Sno,Cno),
-> foreign key (Sno) references stu(Sno),
-> foreign key (Cno) references Course(Cno));
Query OK, 0 rows affected (0.05 sec)
注:学生选课表中的Sno和Cno时该表的主码,是一个复合属性。因此符合属性做主码时不能在字段后说明,因在表级上做约束。
2.给字段添加数据
添加数据通过insert into语句添加,基本格式:
insert into <表名> [<字段1>,<字段2>,......]
values (<常量>,<常量>,......);
注:如果into后没有出现的字段并且没有说明not null则默认值为空。如果在into中写了的字段,则在后面必须写上(可是NULL但必须有)人会报错。还有就是要特列注意在创表时给字段所添加
约束。
2.1给学生表添加数据
mysql> insert into stu values("132340345","猪八戒","男",66,"法律"),
-> ("12345","妖精","女",18,"经济");
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
2.1给表添课程添加数据
mysql> insert into Course values("1","数据库",null,4),
-> ("8","算法分析",null,9),
-> ("6","java",null,10);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
注:因为先行课时参照本表的Cno的外键,因此在做数据添加时不因该为此字段添加数据,而是通过插入的方式进行。
给Cpno修改数据:
mysql> update Course set Cpno="6"where Cno="1";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update Course set Cpno="1"where Cno="6";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
2.2.3给学生课表添加数据
mysql> insert into sc values("132340345","6",89),
-> ("12345","8",99);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
注:这里的Sno和Cno是前两个表的主码,但在这里是该表的外码。因此要记录数据的话的参照前两个表进行赋值,也可以不赋值让其为NULL,因为外码的值可以为NULL.
3.表内数据的查询
SQL提供了select的标准sql语句进行数据查询该语句的格式为:
select [all | ditinct] <目标字段>[,<目标表达式>].....
from <表名或视图名>[,<表名或视图名>] || (<Select语句>) [as] <别名>
[where<条件表达式>]
[group by <字段名>] [having<条件表达式>]]
[order by <字段名>] [asc | desc]];
3.1查询若干字段---投影操作
语句:select 字段1,字段2 from 表名;
查询学生表中的学号和姓名:
mysql> select Sno,Sname from stu;
+-----------+-----------+
| Sno | Sname |
+-----------+-----------+
| 12345 | 妖精 |
| 123456789 | 孙乌龙 |
| 201105102 | 张三风 |
| 132340345 | 猪八戒 |
+-----------+-----------+
4 rows in set (0.00 sec)
注: 字段的顺序不同,输出的顺序也不一样
3.2 查询所有
语句:select * from 表名;
mysql> select * from stu;
+-----------+-----------+------+------+--------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----------+-----------+------+------+--------+
| 12345 | 妖精 | 女 | 18 | 经济 |
| 123456789 | 孙乌龙 | 男 | 24 | 工程 |
| 132340345 | 猪八戒 | 男 | 66 | 法律 |
| 201105102 | 张三风 | 男 | 23 | 软工 |
+-----------+-----------+------+------+--------+
4 rows in set (0.00 sec)
获取学生的出生年 :
语句:select now()-Sage from 表名;
语句2:select "哈哈哈"(字符) now()-Sage from stu;
mysql> select Sname,2022-Sage from stu;
+-----------+-----------+
| Sname | 2022-Sage |
+-----------+-----------+
| 妖精 | 2004 |
| 孙乌龙 | 1998 |
| 猪八戒 | 1956 |
| 张三风 | 1999 |
+-----------+-----------+
4 rows in set (0.00 sec)
mysql> select "哈哈",2022-Sage from stu;
+--------+-----------+
| 哈哈 | 2022-Sage |
+--------+-----------+
| 哈哈 | 2004 |
| 哈哈 | 1998 |
| 哈哈 | 1956 |
| 哈哈 | 1999 |
+--------+-----------+
4 rows in set (0.00 sec)
注:目标字段可以是算数表达式或是自定义字符或是函数表达式
3. 3查询输出时给字段起别名
语句:select 字段名1 别名,字段名2 别名 from 表名;
mysql> select Sname "名字",Sage "年龄" from stu;
+-----------+--------+
| 名字 | 年龄 |
+-----------+--------+
| 妖精 | 18 |
| 孙乌龙 | 24 |
| 猪八戒 | 66 |
| 张三风 | 23 |
+-----------+--------+
4 rows in set (0.00 sec)
3.4去重
select 字段名 from 表名输出的数据有可能会重复因为默认的时All关键字,因此想要去除重复的数据可以,在字段前面加上关键字 distinct 去重,
语句:select distinct 字段名 from 表名;
mysql> select * from stu;
+-----------+-----------+------+------+--------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----------+-----------+------+------+--------+
| 12345 | 妖精 | 女 | 18 | 经济 |
| 123456789 | 孙乌龙 | 男 | 24 | 工程 |
| 132340345 | 猪八戒 | 男 | 66 | 法律 |
| 201105102 | 张三风 | 男 | 23 | 软工 |
| 23212 | 张三 | 女 | 23 | 土木 |
+-----------+-----------+------+------+--------+
5 rows in set (0.00 sec)
mysql> select distinct Sage from stu;
+------+
| Sage |
+------+
| 18 |
| 24 |
| 66 |
| 23 |
+------+
4 rows in set (0.00 sec)