数据库表相关操作
一. 创建表
语法:create table 表名 {列名,数据类型,约束条件};
CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s_birth` VARCHAR(20) NOT NULL DEFAULT '', `s_sex` VARCHAR(10) NOT NULL DEFAULT '', PRIMARY KEY(`s_id`) );
结果
注意:表名还请遵守数据库的命名规则,这条数据后面要进行删除,所以首字母为大写。
二. 查看表定义
- 语法:
desc 表名
mysql> desc Student;
结果:
虽然 desc 命令可以查看表定义,但是其输出的信息还是不够全面,为了查看更全面的表定义信息,有时就需要通过查看创建表的 SQL 语句来得到,可以使用如下命令实现
语法:show create table 表名 \G;
mysql> show create table Student \G;
结果:
从上面表的创建 SQL 语句中,除了可以看到表定义以外,还可以看到表的engine(存储引擎)和charset(字符集)等信息。\G选项的含义是使得记录能够按照字段竖着排列,对于内容比较长的记录更易于显示。
三. 删除表
- 语法:
drop table 表名
mysql> drop table Student;
- 结果:
四. 修改表 (重要)
对于已经创建好的表,尤其是已经有大量数据的表,如果需要对表做一些结构上的改变,我们可以先将表删除(drop),然后再按照新的表定义重建表。这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载。而且,如果有服务在访问表,也会对服务产生影响。因此,在大多数情况下,表结构的更改一般都使用 alter table语句,以下是一些常用的命令。
1. 修改表类型
语法:ALTER TABLE 表名 MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
例如,修改表 student 的 s_name 字段定义,将 varchar(20)改为 varchar(30)
mysql> alter table Student modify s_name varchar(30);
结果:
2. 增加表字段
- 语法:
ALTER TABLE 表名 ADD [COLUMN] [FIRST | AFTER col_name];
- 例如,表 student 上新增加字段 s_test,类型为 int(3)
mysql> alter table student add column s_test int(3);
结果:
3. 删除表字段
- 语法:
ALTER TABLE 表名 DROP [COLUMN] col_name
- 例如,将字段 s_test 删除掉
mysql> alter table Student drop column s_test;
结果:
4. 字段改名
- 语法:
ALTER TABLE 表名 CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]
- 例如,将 s_sex 改名为 s_sex1,同时修改字段类型为 int(4)
mysql> alter table Student change s_sex s_sex1 int(4);
结果:
注意:change 和 modify 都可以修改表的定义,不同的是 change 后面需要写两次列名,不方便。但是 change 的优点是可以修改列名称,modify 则不能。
5. 修改字段排列顺序
- 前面介绍的的字段增加和修改语法(ADD/CNAHGE/MODIFY)中,都有一个可选项first|after column_name,这个选项可以用来修改字段在表中的位置,默认 ADD 增加的新字段是加在表的最后位置,而 CHANGE/MODIFY 默认都不会改变字段的位置。
- 例如,将新增的字段 s_test 加在 s_id 之后
- 语法:
alter table 表名 add 列名 数据类型 after 列名;
mysql> alter table Student add s_test date after s_id;
结果:
- 修改已有字段 s_name,将它放在最前面
mysql> alter table Student modify s_name varchar(30) default '' first;
结果:
注意:CHANGE/FIRST|AFTER COLUMN 这些关键字都属于 MySQL 在标准 SQL 上的扩展,在其他数据库上不一定适用。
6.表名修改
- 语法:
ALTER TABLE 表名 RENAME [TO] new_tablename
- 例如,将表 Student 改名为 student
mysql> alter table Student rename student;
结果:
DML(Data Manipulation Language)语句:即数据操纵语句
- 用于操作数据库对象中所包含的数据
一. 添加数据:INSERT
Insert 语句用于向数据库中插入数据
1. 插入单条数据(常用)
语法:insert into 表名(列名1,列名2,...) values(值1,值2,...)
特点:
- 插入值的类型要与列的类型一致或兼容。插入NULL可实现为列插入NULL值。列的顺序可以调换。列数和值的个数必须一致。可省略列名,默认所有列,并且列的顺序和表中列的顺序一致。
案例:
-- 插入学生表测试数据 insert into Student(s_id,s_name,s_birth,s_sex) values('01' , '赵信' , '1990-01-01' , '男');
2. 插入单条数据
语法:INSERT INTO 表名 SET 列名 = 值,列名 = 值
这种方式每次只能插入一行数据,每列的值通过赋值列表制定。
案例:
INSERT INTO student SET s_id='02',s_name='德莱厄斯',s_birth='1990-01-01',s_sex='男'
3. 插入多条数据
语法:insert into 表名 values(值1,值2,值3),(值4,值5,值6),(值7,值8,值9);
案例:
INSERT INTO student VALUES('03','艾希','1990-01-01','女'),('04','德莱文','1990-08-06','男'),('05','俄洛依','1991-12-01','女');
上面的例子中,值1,值2,值3),(值4,值5,值6),(值7,值8,值9) 即为 Value List,其中每个括号内部的数据表示一行数据,这个例子中插入了三行数据。Insert 语句也可以只给部分列插入数据,这种情况下,需要在 Value List 之前加上 ColumnName List,
例如:
INSERT INTO student(s_name,s_sex) VALUES('艾希','女'),('德莱文','男');
- 每行数据只指定了 s_name 和 s_sex 这两列的值,其他列的值会设为 Null。
4. 表数据复制
语法:INSERT INTO 表名 SELECT * from 表名;
案例:
INSERT INTO student SELECT * from student1;
注意:
- 两个表的字段需要一直,并尽量保证要新增的表中没有数据
二. 更新数据:UPDATE
Update 语句一共有两种语法,分别用于更新单表数据和多表数据。
注意:没有 WHERE 条件的 UPDATE 会更新所有值!
1. 修改一条数据的某个字段
语法:UPDATE 表名 SET 字段名 =值 where 字段名=值
案例:
UPDATE student SET s_name ='张三' WHERE s_id ='01'
2. 修改多个字段为同一的值
语法:UPDATE 表名 SET 字段名= 值 WHERE 字段名 in ('值1','值2','值3');
案例:
UPDATE student SET s_name = '李四' WHERE s_id in ('01','02','03');
3. 使用case when实现批量更新
语法:update 表名 set 字段名 = case 字段名 when 值1 then '值' when 值2 then '值' when 值3 then '值' end where s_id in (值1,值2,值3)
案例:
update student set s_name = case s_id when 01 then '小王' when 02 then '小周' when 03 then '老周' end where s_id in (01,02,03)
这句sql的意思是,更新 s_name 字段,如果 s_id 的值为 01 则 s_name 的值为 小王,s_id = 02 则 s_name = 小周,如果s_id =03 则 s_name 的值为 老周。
这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。
案例 2:
UPDATE student SET s_birth = CASE s_name WHEN '小王' THEN '2019-01-20' WHEN '小周' THEN '2019-01-22' END WHERE s_name IN ('小王','小周');
三. 删除数据:DELETE
- 数据库一旦删除数据,它就会永远消失。 因此,在执行DELETE语句之前,应该先备份数据库,以防万一要找回删除过的数据。
1. 删除指定数据
语法:DELETE FROM 表名 WHERE 列名=值
- 注意:删除的时候如果不指定where条件,则保留数据表结构,删除全部数据行,有主外键关系的都删不了
案例:
DELETE FROM student WHERE s_id='09'
与 SELECT 语句不同的是,DELETE 语句中不能使用 GROUP BY、 HAVING 和 ORDER BY 三类子句,而只能使用WHERE 子句。原因很简单, GROUP BY 和 HAVING 是从表中选取数据时用来改变抽取数据形式的, 而 ORDER BY 是用来指定取得结果显示顺序的。因此,在删除表中数据 时它们都起不到什么作用。`
2. 删除表中全部数据
语法:TRUNCATE 表名;
注意:全部删除,内存无痕迹,如果有自增会重新开始编号。
与 DELETE 不同的是,TRUNCATE 只能删除表中的全部数据,而不能通过 WHERE 子句指定条件来删除部分数据。也正是因为它不能具体地控制删除对象, 所以其处理速度比 DELETE 要快得多。实际上,DELETE 语句在 DML 语句中也 属于处理时间比较长的,因此需要删除全部数据行时,使用 TRUNCATE 可以缩短 执行时间。
案例:
TRUNCATE student1;
DQL(Data Query Language)语句:即数据查询语句
- 查询数据库中的记录,关键字 SELECT,这块内容非常重要!
一. wherer 条件语句
语法:select 列名 from 表名 where 列名 =值
where的作用:
- 用于检索数据表中符合条件的记录
- 搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假
搜索条件的组成:
- 算数运算符
逻辑操作符(操作符有两种写法)
- 比较运算符
注意:数值数据类型的记录之间才能进行算术运算,相同数据类型的数据之间才能进行比较。
表数据
案例 1(AND):
SELECT * FROM student WHERE s_name ='小王' AND s_sex='男'
案例 2(OR):
SELECT * FROM student WHERE s_name ='崔丝塔娜' OR s_sex='男'
案例 3(NOT):
SELECT * FROM student WHERE NOT s_name ='崔丝塔娜'
案例 4(IS NULL):
SELECT * FROM student WHERE s_name IS NULL;
案例 5(IS NOT NULL):
SELECT * FROM student WHERE s_name IS NOT NULL;
案例 6(BETWEEN):
SELECT * FROM student WHERE s_birth BETWEEN '2019-01-20' AND '2019-01-22'
案例 7(LINK):
SELECT * FROM student WHERE s_name LIKE '小%'
案例 8(IN):
SELECT * FROM student WHERE s_name IN ('小王','小周')