MySQL之旅_Day04
来源:互联网 发布:mac粉底液色号分类 编辑:程序博客网 时间:2024/06/03 21:01
今天学习mysql中的DML语句,主要是增删改查
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MySQL入门
编码环境:OS X 10.10.1 | MySQL5.5.38 | mac终端
先创建一个user表:
CREATE TABLE IF NOT EXISTS user ( id TINYINT UNSIGNED AUTO_INCREMENT KEY, name VARCHAR(10) UNIQUE NOT NULL, email VARCHAR(30) NOT NULL);
1、 插入记录INSERT
语法:INSERT INTO tb_name(字段名称1,字段名称2...) VALUSE (值1,值2...);
INSERT INTO user(name, email) VALUES ('zhangsan','123456');
一次插入多条数据:
INSERT INTO user(name, email) VALUES ('李四','23456'),('王五','34567'),('赵六','45678');
2、 删除记录DELETE
语法:DELETE FROM tb_name [WHERE 条件];//如果不加条件,就是删除全部记录
删除id=1的记录:
DELETE FROM user WHERE id=1
3、 修改记录UPDATE
语法:UPDATE tb_name SET 字段1=值1,字段2=值2,....[WHERE 条件];//如果不加条件,就是修改所有记录
把name为zhangsan的记录改为张三:
UPDATE user SET name='张三' WHERE name='zhangsan';
4、 查询记录SELECT
常用语法:SELECT *|字段名1,字段名2... FROM tb_name [WHERE 条件]
[GROUP BY 字段名]
[HAVING 条件]
[ORDER BY 字段名[ASC|DESC]
[LIMIT [偏移量,]条数];
给user表新增两个字段,age和course
ALTER TABLE user ADD age TINYINT NOT NULL DEFAULT 20,ADD course VARCHAR(10);
增加100条测试记录:
<?phpfor($i=1; $i <= 100; $i++) {$name="user".$i;$email=$name.'qq.com';$age=mt_rand(1, 100);if($age < 30) {$course='java';} else if($age < 70){$course='php';} else {$course='ios';}echo "INSERT INTO user(name, email, age, course) VALUES ('{$name}','{$email}','{$age}','{$course}');";echo "<br/>";}?>
-查询年龄大于60,按course分组,根据id降序排序
SELECT * FROM user WHERE age>60 GROUP BY course ORDER BY id DESC;
5、 聚合函数(一般跟分组GROUP BY配合使用)
SUM():求和
AVG():求平均值
COUNT():表达式中记录条数
MAX():最大值
MIN():最小值
FIRST():第一个值
LAST():最后一个值
6、 子查询:
将一个查询语句嵌套在另一个查询语句中,内层查询语句查询出结果,作为外层查询语句的条件。(实际开发中,子查询不会超过两层)
新增一个课程表course:
CREATE TABLE IF NOT EXISTS course (id TINYINT UNSIGNED AUTO_INCREMENT KEY,name CHAR(10) NOT NULL);
插入课程记录:
INSERT INTO course(name) VALUES ('java'),('php'),('ios');
删除user表的记录,再新增几条记录,用course表中的id代替课程:
insert into user(name, email, age, course) values ('张三风','zhangsan@qq.com',24,1), ('李四','lisi@qq.com',36,2),('王五','wangwu@qq.com',25,2),('赵六','zhaoliu@qq.com',36,3),('小明','xiaoming@qq.com',16,1),('韩梅梅','hmm@qq.com',30,2);+----+-----------+-----------------+-----+--------+
| id | name | email | age | course |
+----+-----------+-----------------+-----+--------+
| 1 | 张三 | zhangsan@qq.com | 24 | 1 |
| 2 | 张三风 | zhangsan@qq.com | 24 | 1 |
| 3 | 李四 | lisi@qq.com | 36 | 2 |
| 4 | 王五 | wangwu@qq.com | 25 | 2 |
| 5 | 赵六 | zhaoliu@qq.com | 36 | 3 |
| 6 | 小明 | xiaoming@qq.com | 16 | 1 |
| 7 | 韩梅梅 | hmm@qq.com | 30 | 2 |
+----+-----------+-----------------+-----+--------+
-查询用户名为李四所选的课程:
mysql> SELECT c.name FROM course AS c WHERE id=(SELECT u.course FROM user AS u WHERE name='李四');
+------+
| name |
+------+
| php |
+------+
7、 多表连接
两个表查询,如果没有条件的话,会产生笛卡尔积效果
-查询user表中韩梅梅的邮箱和课程:
mysql> SELECT u.email, c.name FROM user AS U, course AS c WHERE u.course=c.id AND u.name='韩梅梅';
+------------+------+
| email | name |
+------------+------+
| hmm@qq.com | php |
+------------+------+
连接
内连接:将符合多个表中的记录查询出来(一般不超过3个表)
[INNER] JOIN
连接条件 ON 条件
语法:
SELECT 字段名称... FROM tb_1 JOIN tb_2 ON 条件 JOIN tb_3 ON 条件...;
-查询id小于5的用户信息:
mysql> SELECT u.id, u.name, u.email, u.age, c.name FROM user AS u JOIN course AS c ON u.course=c.id WHERE u.id<5;
+----+-----------+-----------------+-----+------+
| id | name | email | age | name |
+----+-----------+-----------------+-----+------+
| 1 | 张三 | zhangsan@qq.com | 24 | java |
| 2 | 张三风 | zhangsan@qq.com | 24 | java |
| 3 | 李四 | lisi@qq.com | 36 | php |
| 4 | 王五 | wangwu@qq.com | 25 | php |
+----+-----------+-----------------+-----+------+
4 rows in set (0.00 sec)
外连接(很少使用)
左外连接:主表 LEFT JOIN 副表
右外连接:副表 RIGHT JOIN 主表
先把主表的所有数据查询出来,再查询副表中符合条件的记录
user表增加一条记录,course=6,在course中不存在id=6的课程
INSERT INTO user (name, email, age, course) VALUES ('mark', 'mark@qq.com', 25, 6);
左外连接查询mark的信息:
mysql> SELECT u.id, u.name, u.email, u.age, c.name AS '课程' FROM user AS u LEFT JOIN course AS c ON u.course=c.id WHERE u.name='mark';
+----+------+-------------+-----+--------+
| id | name | email | age | 课程 |
+----+------+-------------+-----+--------+
| 8 | mark | mark@qq.com | 25 | NULL |
+----+------+-------------+-----+--------+
1 row in set (0.00 sec)
可以看出课程是null,因为course表中没有id=6的课程
如果换成右外连接:
SELECT u.id, u.name, u.email, u.age, c.name AS '课程' FROM user AS u RIGHT JOIN course AS c ON u.course=c.id WHERE u.name='mark';
没有记录返回,因为是先查询course表,根据主表不同,查询到的结果也不同(主要是显示NULL的字段不同)
8、 外键
外键的作用:保证记录的一致性和完整性
注意:使用外键存储引擎一定是INNODB,外键列如果没有指定索引的话,会自动创建索引
尽量不使用物理外键,要用外键的思想来保证数据的一致性和完整性
①创建表时指定外键
foreign key(cid):代表的是外键列
references cate(id):被参照的表(字段),一定是cate表的主键
//分类表cate
CREATE TABLE IF NOT EXISTS cate (id TINYINT UNSIGNED AUTO_INCREMENT KEY,cName VARCHAR(20) NOT NULL UNIQUE);
//新闻表news
CREATE TABLE IF NOT EXISTS news(id INT UNSIGNED AUTO_INCREMENT KEY,title VARCHAR(50) NOT NULL,content TEXT,cId TINYINT UNSIGNED,FOREIGN KEY(cId) REFERENCES cate(id));
给news表添加了外键,cate表的主键id
//给cate表添加几条记录
INSERT INTO cate(cName) VALUES ('体育新闻'),('国际新闻');
//给news插入一条记录
INSERT INTO news (title, cId) VALUES ('标题1', 2);
如果要删除cate表或者里面的记录,一定要先删除和cate表相关的表中的记录
//删除外键
ALTER TABLE news DROP FOREIGN KEY news_ibfk_1;
②ALTER语句添加外键
ALTER TABLE news ADD FOREIGN KEY(cId) REFERENCES cate(id);
END
- MySQL之旅_Day04
- MySQL查询语句之复杂查询_day04
- 黑马程序员_day04 数组。
- struts2笔记_day04
- java学习_day04
- 某坑爹公司的笔记_Day04
- 黑马程序员--Oracle学习_day04
- Android_黑马视频学习_day04
- 树懒_移动开学笔记_day04.1_JavaScript_DOM
- 树懒_移动开学笔记_day04.2_XML笔记
- MySQL之旅_Day01
- MySQL之旅_Day02
- MySQL之旅_Day03
- zeppelin mysql可视化之旅
- zeppelin mysql可视化之旅
- mysql踩坑之旅
- MySQL之初步MySQL
- 【MySql】MySql之安装
- 省赛第一个氺题--结构体二级排序
- 最近用android写的一个项目,开发心得
- Spring3表达式语言(SpEL)学习笔记
- 百度之星程序设计竞赛资格赛:1004放盘子
- 由浅入深探究mysql索引结构原理、性能分析与优化
- MySQL之旅_Day04
- 怎样尊重一个程序员
- C#中的多线程
- leetcode做题体会 two sum
- CentOS6修改主机名(hostname)(转)
- 区分 split, splice, slice
- 泛型
- HTTP状态码大全
- 文件尾判断 EOF feof()两种方式