mysql增删改查(035)

一.MySQL 中的约束

        1.约束类型

                非空约束(not null)

                唯一性约束(unique)

                 主键约束(primary key) PK

                 外键约束(foreign key) FK

                 检查约束(目前 MySQL 不支持、Oracle 支持)

        2.创建表时添加约束

                查询表中的约束信息

                SHOW KEYS FROM 表名

                示例

                创建 departments 表包含 department_id 该列为主键且自动增长,department_name 列不 允许重复,location_id 列不允含有空值。

                create table departments(department_id int primary key auto_increment,dep

artment_name varchar(30) unique,location_id int not null); 

        3.修改表实现约束的添加与删除

            1.主键约束

                 添加主键约束

                ALTER TABLE 表名 ADD PRIMARY KEY(列名)

                示例

                将 emp 表中的 employee_id 修改为主键且自动增长

                添加主键:alter table emp add primary key(employee_id);

                添加自动增长:alter table emp modify employee_id int auto_increment;6.3.1.2 删除主键约束

                ALTER TABLE 表名 DROP PRIMARY KEY

                注意:删除主键时,如果主键列具备自动增长能力,需要先去掉自动增长,然后在删除 主键。

                示例

                删除 employee_id 的主键约束。

                去掉自动增长: alter table emp modify employee_id int;

                删除主键:alter table emp drop primary key;

            2.非空约束

                添加非空约束

                ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL

                示例

                向 emp 表中的 salary 添加非空约束。

                alter table emp modify salary float(8,2) not null;

                删除非空约束

                ALTER TABLE 表名 MODIFY 列名 类型 NULL

                示例

                删除 salary 的非空约束。

                alter table emp modify salary float(8,2) null;

            3.唯一约束

                 添加唯一约束

                  ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列名)

                    示例

                    向 emp 表中的 name 添加唯一约束。

                    alter table emp add constraint emp_uk unique(name);

                    删除唯一约束

                    ALTER TABLE 表名 DROP KEY 约束名6.3.3.2.1示例

                    删除 name 的唯一约束。

                    alter table emp drop key emp_uk;

                4.外键约束

                     添加外键约束

                    ALTER TABLE 表 名 ADD CONSTRAINT 约 束 名 FOREIGN KEY( 列 名 )

                    REFERENCES 参照的表名(参照的列名)

                    示例         

                    修改 emp 表,添加 dept_id 列。

                    alter table emp add column dept_id int;

                    删除外键约束

                    删除外键:

                    ALTER TABLE 表名 DROP FOREIGN KEY 约束名

                    删除外键索引(索引名与约束名相同):

                    ALTER TABLE 表名 DROP INDEX 索引名

                    示例

                    删除 dept_id 的外键约束。

                    删除外键:alter table emp drop foreign key e_fk;

                    删除索引: alter table emp drop index e_fk; 

二.MySQL 中的 DML 操作

        1.添加数据(INSERT)

            插入数据

             选择插入

                INSERT INTO 表名(列名 1,列名 2,列名 3.....) VALUES(值 1,值 2,值 3......)         

            示例

            向 departments 表中添加一条数据,部门名称为 market,工作地点 ID 为 1。

                insert into departments(department_name,location_id) values("market",1);

             完全插入

            INSERT INTO 表名 VALUES(值 1,值 2,值 3......)

            如果主键是自动增长,需要使用 default 或者 null 或者 0 占位。

            示例

            向 departments 表中添加一条数据,部门名称为 development,工作地点 ID 为 2。使用

default 占位。

            insert into departments values(default,"development",2); 

        2.自动增长(auto_increment)

            MySQL 中的自动增长类型要求:

                    一个表中只能有一个列为自动增长。

                     自动增长的列的类型必须是整数类型。

                     自动增长只能添加到具备主键约束与唯一性约束的列上。

                     删除主键约束或唯一性约束,如果该列拥有自动增长能力,则需要先去掉自动增长然 后在删除约束。

                示例

            创建一个 emp2 表。包含 id 该列为主键,包含 name,包含 seq_num 要求该列为具备唯 一性约束,该列的值自动增长。

            create table emp2(id int primary key ,name varchar(30),seq_num int unique

            auto_increment);

         3. 默认值处理

                在 MySQL 中可以使用 DEFAULT 为字段设定一个默认值。如果在插入数据时并未指定该列的值,那么 MySQL 会将默认值添加到该列中。

             创建表时指定列的默认值

            示例

            创建 emp3 表,该表包含 emp_id 主键且自动增长,包含 name,包含 address 该列默认 值为”未知”。

            create table emp3(emp_id int primary key auto_increment,name varchar(30),

address varchar(50) default 'Unknown');

            修改表添加列的默认值

            示例

            修改 emp3 表,添加 job_id 该列默认值为 0。

            alter table emp3 add column job_id int default 0;

                插入数据时的默认值处理

                如果在插入数据时并未指定该列的值,那么 MySQL 会将默认值添加到该列中。如果是 完全项插入需要使用 default 来占位。

                示例

                向 emp3 表中添加数据,要求 address 列与 job_id 列使用默认值作为该列的值。

                insert into emp3(name) values("admin");

                insert into emp3 values(default,"oldlu",default,default);

        4.更新数据(UPDATE)

            UPDATE 表名 SET 列名=值,列名=值 WHERE 条件 

             示例    

            更新 emp3 表中的 id 为 1 的数据,添加 address 为 BeiJing。

            update emp3 e set e.address = "BeiJing" where emp_id = 1; 

        5.删除数据(DELETE)

                使用 DELETE 子句

                DELETE FROM 表名 WHERE 条件

                示例

                删除 emp3 表中 emp_id 为 1 的雇员信息。

                delete from emp3 where emp_id = 1

                使用 TRUNCATE 清空表

                TRUNCATE TABLE 表名

                 示例

                删除 emp3 表中的所有数据

                truncate table emp3;

            6. DELETE 与 TRUNCATE 区别

                     truncate 是整体删除(速度较快), delete 是逐条删除(速度较慢);

                    truncate 不写服务器 log,delete 写服务器 log,也就是 truncate 效率比 delete 高的原因;

                    truncate 是会重置自增值,相当于自增列会被置为初始值,又重新从 1 开始记录,而 不是接着原来的值。而 delete 删除以后,自增值仍然会继续累加。


三.�MySQL 中的事务处理

            在 MySQL 中,默认情况下,事务是自动提交的,也就是说,只要执行一条 DML 语句

就开启了事物,并且提交了事务

                关闭 MySQL 的事务自动提交 

                向 emp3 表中添加一条数据,要求手动提交事务。


四.MySQL 查询数据


        1MySQL 的列选择

            SELECT * | 投影列 FROM 表名

            示例

             查询 departments 表中的所有数据

                select * from departments;

        2.MySQL 的行选择

                SELECT * | 投影列 FROM 表名 WHERE 选择条件

                示例

                查询 departments 表中部门 ID 为 4 的部门名称与工作地点 ID。

                select department_name,location_id from departments where department_id =4;

        3.SELECT 语句中的算术表达式 

        示例

            修改 employees 表添加 salary。

            alter table employees add column salary float(9,2);

        4.MySQL 中定义空值

            包含空值的算术表达式计算结果为空。

            示例

            在 employees 中添加 commission_pct,计算年薪包含佣金。

            alter table employees add column commission_pct float(5,2);

            select 12*salary*commission_pct from employees;

         5.MySQL 中的列别名

            SELECT 列名 AS 列别名 FROM 表名 WHERE 条件

            示例

            查询 employees 表将雇员 laser_name 列名改为 name。

            select last_name as name from employees;

        6.MySQL 中的连字符

            MySQL 中并不支持||作为连字符,需要使用 concat 函数。在参数数量上与 oracle 的 concat 函数有区别。

            示例

            查询雇员表中的所有数据,将所有数据连接到一起,每列值中通过#分割。

            select concat(employees_id,'#',last_name,'#',email,"#",salary,"#",commission_pct) from

employees;1.7MySQL 中去除重复

          在 SELECT 语句中用 DISTINCT 关键字除去相同的行。

示例

        查询 employees 表,显示唯一的部门 ID。

            select distinct dept_id from employees; 

      7.模糊查询

        like

             %表示任意多个任意字符

            _表示一个任意字符

            示例

            查询 employees 中雇员名字第二个字母是 e 的雇员信息。

            select * from employees where last_name like '_e%'2.1.3逻辑运算符


        8.范围查询

                between ... and

                 in 表示在一个非连续的范围内

                示例    

                查询 employees 表,薪水在 3000-8000 之间的雇员信息

                select * from employees where salary between 3000 and 8000


        9.空值判断

                判断空 is null

                判断非空 is not null

                示例    

                找出 emloyees 表中那些没有佣金的雇员

                select * from employees where commission_pct is null;

        

        10. 用 ORDER BY 子句排序

    

             示例    

            查询 employees 表中的所有雇员,薪水按升序排序。

            select * from employees order by salary

五.MySQL 中常见的单行函数

            1.大小写控制函数

                LOWER(str) 转换大小写混合的字符串为小写字符串

                UPPER(str) 转换大小写混合的字符串为大写字符串。

            2.字符处理

                CONCAT(str1,str2,...) 将 str1、str2 等字符串连接起来

                 SUBSTR(str,pos,len) 从 str 的第 pos 位(范围:1~str.length)开始,截取长度为 len 的字符串

                LENGTH(str) 获取 str 的长度

                INSTR(str,substr) 获取 substr 在 str 中的位置

                LPAD(str,len,padstr)/RPAD(str,len,padstr)

                TRIM(str) 从 str 中删除开头和结尾的空格(不会处理字符串中间含有的空格)

                LTRIM(str) 从 str 中删除左侧开头的空格

                RTRIM(str) 从 str 中删除右侧结尾的空格

                REPLACE(str,from_str,to_str) 将 str 中的 from_str 替换为 to_str(会替换掉所有符合

from_str 的字符串)

            3.数字函数

                ROUND(arg1,arg2):四舍五入指定小数的值。

                ROUND(arg1):四舍五入保留整数。

                TRUNC(arg1,arg2):截断指定小数的值,不做四舍五入处理。

                MOD(arg1,arg2):取余。3.4日期函数

                SYSDATE() 或者 NOW() 返回当前系统时间,格式为 YYYY-MM-DD hh-mm-ss

                CURDATE() 返回系统当前日期,不返回时间

                CURTIME() 返回当前系统中的时间,不返回日期

                DAYOFMONTH(date) 计算日期 d 是本月的第几天

                DAYOFWEEK(date) 日期 d 今天是星期几,1 星期日,2 星期一,以此类推

                DAYOFYEAR(date) 返回指定年份的天数

                DAYNAME(date) 返回 date 日期是星期几

                LAST_DAY(date) 返回 date 日期当月的最后一天

            5.转换函数

                DATE_FORMAT(date,format) 将日期转换成字符串(类似 oracle 中的 to_char())

                STR_TO_DATE(str,format) 将字符串转换成日期(类似 oracle 中的 to_date())

六.�多表连接查询

        1.等值连接

            示例

            查询雇员 King 所在的部门名称

            select d.department_name from employees e,departments d where e.dept_id =

            d.department_id and e.last_name = 'King'

        2非等值连接

            示例

            创建 sal_level 表,包含 lowest_sal,highest_sal,level。

            create table sal_level(lowest_sal int,highest_sal int ,level varchar(30))

        3.自连接

            示例    

            修改 employees 表,添加 manager_id 列

            ALTER table employees add COLUMN manager_id int 

        4. 外连接(OUTER JOIN)

                左外连接(LEFT OUTER JOIN)

                示例    

                向 employees 表中添加一条数据,名字:Lee,email:lee@sxt.cn,入职时间为今天。他 没有薪水,没有经理,没有佣金。

                insert into employees(last_name,email,hire_date) values('Lee','lee@sxt.cn',SYSDATE())


            右外连接(RIGHT OUTER JOIN)

                示例    

                向 departments 表中添加一条数据,部门名称为 Testing,工作地点 ID 为 5。

                insert into departments values(default,'Testing',5) 

          全外链接

                注意:MySQL 中不支持 FULL OUTER JOIN 连接

                            可以使用 union 实现全完连接。

                UNION

                可以将两个查询结果集合并,返回的行都是唯一的,如同对整个结果集合使用了

DISTINCT。

                UNION ALL

                只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数    

            语法结构

            SELECT 投 影 列 FROM 表 名 LEFT OUTER JOIN 表 名 ON 连 接 条 件 UNION

            SELECT 投影列 FROM 表名 RIGHT OUTER JOIN 表名 ON 连接条件

             示例

                查询所有雇员的名字以及他们的部门名称,包含那些没有雇员的部门以及没有部门的雇 员。

        (select e.last_name,d.department_name from employees e LEFT OUTER JOIN departmentsd on e.dept_id = d.department_id) UNION (select e1.last_name,d1.department_name from employees e1 RIGHT OUTER JOIN departments d1 on d1.department_id = e1.dept_id)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • ---------------------------------DML---------------------...
    珂and超阅读 516评论 0 0
  • 035天 行百里者半九十,想要在一个行业里成为顶尖人才,一定满足一万小时定律,要想学好JAVA,需要持之以恒不断地...
    人间草木为伴阅读 134评论 0 0
  • 1. 了解SQL 1.1 数据库基础 ​ 学习到目前这个阶段,我们就需要以某种方式与数据库打交道。在深入学习MyS...
    锋享前端阅读 1,038评论 0 1
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,167评论 0 9
  • 拿着书坐在我的特定位置上。见证奇迹的时刻到了。可是我的纸条呢?当把书翻来翻去都找不到纸条的时候我真的要崩溃了,难道...
    禾小车阅读 172评论 0 1