由于主攻java,对mysql的掌握主要在应用层。java后台中最基本的四条mysql语句,即增删改查。

1.查找元素

select * from authors   
select * from authors where au_lname="white"
SELECT * FROM AUTHORS WHERE au_id IN(SELECT au_id FROM titleauthor WHERE title_id='BU1032')

2.删除元素

DELETE FROM users WHERE userName="xxx"

3.增添元素

单条更新

INSERT INTO users (userName,userPwd,Ename,Email,Logo) VALUES (?,?,?,?,?)

多条更新

insert into users(userPwd,userPwd) select userName,userPwd from xinbiao group by userName

将users的user表的内容更新到新表中。?表示字符串在java中调用数据库常用

4.修改元素

UPDATE users SET userPwd=?,Ename=?,Email=?,Logo=? WHERE userName=?

set后加修改内容,where后加条件

5.查找排序

SELECT content.*,users.Email,users.Logo FROM content,users WHERE content.UserName=users.userName AND (contId=? OR UpperId=?) ORDER BY UpperId,ContId DESC

order by 升序排列,order by desc 降序排列

6.别名

SELECT MAX(price) FROM titles

SELECT MAX(price) AS 'max' FROM titles

SELECT MAX(price) 'max' FROM titles

7.最大,最小,平均,求和,计数

SELECT MAX(price) 'max',MIN(price),AVG(price),SUM(price),COUNT(*) FROM titles

注意下图,上面代码中,没起别名的话,差的是啥,它在数据库中临时名字就是啥!用java拿变量名获取的时候要注意!

Mysql多条记录减数值直至数值减完_Mysql多条记录减数值直至数值减完

8.分类聚合

SELECT TYPE,MAX(price) FROM titles GROUP BY TYPE

SELECT TYPE,MAX(price) FROM titles GROUP BY TYPE HAVING MAX(price)>20

SELECT TYPE,MAX(price) FROM titles GROUP BY TYPE HAVING MAX(price) IS NOT NULL

注意:只有null情况下用 is not null 。(其他情况直接用!=)

9.表关联查询

SELECT ti.title,au.au_lname FROM AUTHORS au,titleauthor t,titles ti WHERE au.au_id=t.au_id AND t.title_id=ti.title_id AND au_lname='white'

10.内连接查询

SELECT * FROM AUTHORS au INNER JOIN titleauthor ti ON au.au_id=ti.au_id

    INNER JOIN titles t ON ti.title_id=t.title_id

    WHERE au.state IN ('ca')

内嵌式,表关联,内连接都能达到同样的效果,但是我们通常采用内连接。
原因分析:
1.内嵌式要写很多语句,每写一条就多一条开销
2.表关联,假设有三张表,每张表10条记录,关联三张就是1000条然后从1000条记录中索引,效率低,速度慢。
3.内连接,假设三张表,每张10条记录,先关联俩张,舍去不相关的数据,然后剩下的数据在和第三条数据关联,相比上一条节省了不少计算。
(PS:当什么情况下表连接和内连接查询效率是一样的呢?)
答案:有俩张表的时候(当数据库只有一条数据的时候也可以(^__^) )

11.外链接
外链接分为左链接,右链接,全链接(mysql没有,其他数据库有)
左链接如下:(右链接只需把left改为right即可)

SELECT * FROM AUTHORS au LEFT JOIN titleauthor ti
  ON au.au_id=ti.au_id

左链接就是以左边为主,右边有的显示,没有的显示null,右链接刚好相反。

表关联嵌套查询,大小写均可运行不影响(mysql没有大小写之分)

附上一张数据库的表关联图

Mysql多条记录减数值直至数值减完_java_02


查询数据库作者们出版了哪些书?显示图书信息

SELECT au_id FROM AUTHORS

SELECT title_id FROM titleauthor WHERE au_id IN (SELECT au_id FROM AUTHORS)

SELECT title FROM titles WHERE title_id IN (SELECT title_id FROM titleauthor WHERE au_id IN (SELECT au_id FROM AUTHORS))

查询图书id是BU1302的作者信息

SELECT au_id FROM titleauthor WHERE title_id='BU1032'

SELECT * FROM AUTHORS WHERE au_id IN(SELECT au_id FROM titleauthor WHERE title_id='BU1032')

查询state=’ca’地区的作者,出版的图书,显示图书信息

SELECT au_id FROM AUTHORS WHERE state='ca'

SELECT title_id FROM titleauthor WHERE au_id IN(SELECT au_id FROM AUTHORS WHERE state='ca')

SELECT * FROM titles WHERE title_id IN (SELECT title_id FROM titleauthor WHERE au_id IN(SELECT au_id FROM AUTHORS WHERE state='ca'))

查询单价大于10的图书馆是哪些作者编的,显示作者信息

SELECT title_id FROM titles WHERE price>10

SELECT au_id FROM titleauthor WHERE title_id IN (SELECT title_id FROM titles WHERE price>10)

SELECT * FROM AUTHORS WHERE au_id IN (SELECT au_id FROM titleauthor WHERE title_id IN (SELECT title_id FROM titles WHERE price>10))

not in不包含,查询没有出过书的作者

SELECT * FROM AUTHORS WHERE au_id NOT IN (
 SELECT au_id FROM titleauthor WHERE title_id IN(SELECT title_id FROM titles))

查询了出版了俩本以上的作者信息(含),显示作者信息

SELECT * FROM AUTHORS WHERE au_id IN (
SELECT au_id FROM titleauthor ti GROUP BY au_id HAVING COUNT(1)>=2)


SELECT * FROM AUTHORS au INNER JOIN titleauthor ti ON au.au_id=ti.au_id GROUP BY au_id HAVING COUNT(1)>=2

查询哪些图书是俩个以上作者合著的,显示书名和作何名

SELECT * FROM titleauthor ti INNER JOIN AUTHORS au ON ti.au_id = au.au_id
INNER JOIN titles t ON t.title_id=ti.title_id
 GROUP BY ti.title_id HAVING COUNT(1)>=2

附上一张万能查询数据库连接方法:

public List<Map> selectEverything(String sql){
        Conn c = new Conn();
        Connection conn = c.getCon();
        List<Map> list = new ArrayList<Map>();
        try {
            PreparedStatement pst=conn.prepareStatement(sql);
            ResultSetMetaData rm =pst.getMetaData();
            int m = rm.getColumnCount();
            ResultSet rs = pst.executeQuery();
            while(rs.next()){
                Map map = new HashMap();
                for(int i=1;i<=m;i++){
                    String col = rm.getColumnName(i);
                    map.put(col, rs.getString(i));
                }
                list.add(map);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
    }